2022年7月起Instagram API调用异常PHP部署适配问题咨询
问题根因
2022年7月Instagram调整公开页面接口鉴权规则后,仅替换?__a=1为?__a=1&__d=dis参数无法正常请求的核心原因是平台新增了未登录态请求的风控校验:缺失合法请求头、无有效初始Cookie、请求特征被识别为脚本时,都会直接302重定向到登录页,和参数本身是否正确无关。
PHP部署可直接复用的实现方案
核心配置要求
- 接口参数拼接正确:所有公开页接口(用户主页、帖子页等)的查询参数固定为
__a=1&__d=dis,不要额外拼接其他未公开参数 - 请求头完全模拟真实浏览器:禁止使用PHP/cURL默认的UA标识,必须携带合法的浏览器UA、来源页标识、语言标识
- 携带有效初始Cookie:首次请求先访问Instagram首页拿到平台下发的基础Cookie,再携带该Cookie请求接口,不要直接裸请求接口地址
- 控制请求频率:单IP请求间隔不要低于3秒,共享主机IP如果之前有过爬虫记录,建议搭配代理使用,避免触发永久封禁
可直接运行的cURL示例代码
// 初始化Cookie存储文件(确保该路径服务器有读写权限) $cookieFile = __DIR__ . '/ig_cookie.txt'; // 第一步:先请求首页获取初始Cookie $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://www.instagram.com/', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', CURLOPT_HTTPHEADER => [ 'Accept-Language: en-US,en;q=0.9', 'Referer: https://www.instagram.com/' ], CURLOPT_COOKIEJAR => $cookieFile, CURLOPT_COOKIEFILE => $cookieFile, CURLOPT_TIMEOUT => 10 ]); curl_exec($ch); curl_close($ch); // 第二步:携带Cookie和正确参数请求目标接口 $targetUsername = 'instagram'; // 替换为你要请求的账号名 $apiUrl = "https://www.instagram.com/{$targetUsername}/?__a=1&__d=dis"; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', CURLOPT_HTTPHEADER => [ 'Accept-Language: en-US,en;q=0.9', 'Referer: https://www.instagram.com/' ], CURLOPT_COOKIEJAR => $cookieFile, CURLOPT_COOKIEFILE => $cookieFile, CURLOPT_TIMEOUT => 10 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 校验返回结果 if ($httpCode === 200 && str_starts_with($response, '{')) { $data = json_decode($response, true); // 处理返回的JSON数据 var_dump($data); } else { // 触发风控,可更换UA、等待一段时间或更换IP后重试 echo "请求被拦截,返回状态码:{$httpCode}"; }
部署注意事项
- 主机上的Cookie文件要设置为仅当前站点用户可读写,避免Cookie泄露
- 如果持续返回302登录页,先在服务器命令行执行curl命令模拟相同请求头测试,确认是否是服务器IP被Instagram标记
- 不要在请求头中携带
X-Requested-With: XMLHttpRequest这类标识异步请求的头,会大幅提升被拦截概率 - 若使用PHP7及以下版本,判断返回是否为JSON的逻辑
str_starts_with($response, '{')需替换为substr(trim($response), 0, 1) === '{',避免函数不存在报错。
内容的提问来源于stack exchange,提问作者soheil
相关产品推荐
相关产品推荐

