获取Instagram搜索数据时遇非对象属性及foreach参数无效错误求助
解决Instagram搜索API请求的错误问题
咱先拆解下你遇到的两个错误:
- Notice: Trying to get property 'users' of non-object:这说明
$json根本不是一个对象,大概率是json_decode解码失败,返回了null或者其他非对象类型。 - Warning: Invalid argument supplied for foreach():因为
$json->users不存在,所以foreach接收了无效的参数,自然报错。
错误根源
现在Instagram的公开搜索接口已经不再允许无认证的直接请求了。你用file_get_contents直接请求那个URL,返回的内容根本不是你预期的JSON数据——大概率是登录页面的HTML或者拦截响应,导致json_decode无法解析出正确的对象结构,自然拿不到users属性。
解决方案
1. 先确认请求返回的内容
先在代码里打印下请求的返回值,看看是不是有效的JSON:
$response = file_get_contents('https://www.instagram.com/web/search/topsearch/?query=lol'); var_dump($response); // 查看返回的实际内容
你会发现返回的是HTML或者错误信息,这就是解码失败的核心原因。
2. 用CURL模拟浏览器请求,添加必要请求头
Instagram会检查请求的User-Agent,我们需要模拟浏览器的请求头来绕过拦截。用CURL发送请求更灵活,示例代码如下:
$url = 'https://www.instagram.com/web/search/topsearch/?query=lol'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 模拟Chrome浏览器的请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept: application/json' ]); $response = curl_exec($ch); curl_close($ch); // 检查请求是否成功 if (!$response) { die('请求失败,请检查网络或URL'); } // 解码JSON为数组(比对象更安全,避免属性不存在的问题) $json = json_decode($response, true); // 检查解码是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解码失败:' . json_last_error_msg()); } // 确认users字段存在且是数组 if (isset($json['users']) && is_array($json['users'])) { foreach ($json['users'] as $item) { // 注意结构:用户信息在user子数组里 if ($item['user']['username'] === 'lol') { echo $item['user']['full_name']; } } } else { echo '未找到匹配的users数据'; }
3. 注意API结构变化
Instagram的非官方API结构可能随时更新,拿到解码后的$json后,建议先var_dump($json)查看具体结构,确认users的层级和字段名是否正确(比如full_name是否在user子结构下)。
额外提醒
如果你是做正式项目,不建议依赖这种非官方API——Instagram随时可能封禁这类无认证请求。最好使用官方的Graph API,不过需要申请开发者账号并完成认证。
内容的提问来源于stack exchange,提问作者Elve Bi
相关产品推荐
相关产品推荐

