PHP开发Instagram媒体下载器报错:Trying to get property 'graphql' of non-object
Instagram媒体下载器PHP报错排查
核心问题本质
两个错误根源都是数据解析失败:Instagram的页面结构或接口响应已变更,导致你拿到的内容并非预期的JSON对象/数组:
Notice: Trying to get property 'graphql' of non-object:你试图访问->graphql的变量不是对象,可能是null、纯字符串或解析失败的无效JSONWarning: count(): Parameter must be an array or an object that implements Countable:改为数组访问后,传给count()的参数不具备可计数属性,证明你期望的数组根本不存在
分步排查修复
1. 先确认原始响应内容
在解析JSON前,先打印获取到的页面原始内容,判断是否遭遇反爬或页面结构更新:
$html = file_get_contents($url); var_dump($html); // 先输出原始内容查看
如果看到验证码页面、跳转提示或非目标JSON内容,说明需要处理反爬:
- 添加浏览器请求头(比如
User-Agent),必要时带上登录后的有效Cookie - 优先考虑使用Instagram官方API(需申请权限,但稳定性远高于页面爬取)
2. 确保JSON解析完全有效
假设你是从页面中提取window._sharedData这类JSON数据,必须验证提取和解析过程:
// 示例:提取并解析_sharedData preg_match('/window._sharedData = (.*?);<\/script>/', $html, $matches); if (empty($matches[1])) { die("无法定位目标JSON数据"); } // 用true强制转成数组,避免对象/数组混淆 $data = json_decode($matches[1], true); // 检查解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败: " . json_last_error_msg()); }
很多时候是提取的JSON片段不完整,导致解析后得到null,进而引发后续错误。
3. 修复count()调用问题
必须先做存在性和类型检查,再调用count():
// 针对多图/视频的场景,先判断路径是否存在且可计数 if (isset($data['graphql']['shortcode_media']['edge_sidecar_to_children']['edges']) && is_countable($data['graphql']['shortcode_media']['edge_sidecar_to_children']['edges'])) { $mediaCount = count($data['graphql']['shortcode_media']['edge_sidecar_to_children']['edges']); } else { $mediaCount = 1; // 单图/视频的默认情况 }
禁止直接对可能不存在的变量调用count(),必须先做校验。
4. 适配Instagram的结构更新与反爬
- 打印解析后的
$data数组,查看媒体数据的新路径(Instagram经常调整页面结构,旧的graphql路径可能已失效) - 替换
file_get_contents为curl,设置完整请求头模拟真实浏览器:
$ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Cookie: 你的登录状态Cookie' ]); $html = curl_exec($ch); curl_close($ch);
内容的提问来源于stack exchange,提问作者Nitin Kumar
相关产品推荐
相关产品推荐

