Postman中正常运行的GET请求在PHP CURL中无法返回JSON数据
解决PHP CURL请求Instagram接口返回图标而非JSON的问题
Instagram的反爬机制会对请求做验证,你的CURL请求因缺少必要请求头或会话信息,被判定为非浏览器请求,因此返回了验证相关的图标资源而非预期JSON数据。以下是修复方案:
1. 更新并补充请求头
- 替换老旧的User-Agent为现代浏览器标识,避免被直接识别为爬虫
- 添加
Accept、Accept-Language、Referer等浏览器常用请求头,模拟真实访问逻辑
2. 启用Cookie会话支持
Postman会自动保存会话Cookie,而CURL默认不保留会话状态,需开启Cookie存储维持访问上下文
修改后的完整代码
$curl = curl_init(); // 定义现代浏览器标准请求头 $headers = [ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language: en-US,en;q=0.5", "Referer: https://www.instagram.com/", "DNT: 1", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1" ]; curl_setopt_array($curl, array( CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", CURLOPT_URL => "https://www.instagram.com/p/CVhuRABqnAI/?__a=1&__d=dis", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "gzip, deflate, br", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => $headers, CURLOPT_COOKIEJAR => "instagram_cookies.txt", // 保存Cookie到本地文件 CURLOPT_COOKIEFILE => "instagram_cookies.txt" // 从本地文件读取Cookie )); $response = curl_exec($curl); $error = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // 获取响应状态码 curl_close($curl); if($error) { echo "cURL Error:" . $error; } else { // 先检查响应状态码,再尝试解析JSON if($httpCode == 200) { $jsonData = json_decode($response, true); if($jsonData) { print_r($jsonData); } else { echo "返回内容不是有效JSON,可能仍处于验证环节"; } } else { echo "请求失败,状态码:" . $httpCode; } }
额外注意事项
- 首次运行会生成
instagram_cookies.txt文件,需确保PHP对当前目录有写入权限 - 如果仍返回验证页面,可手动访问目标URL一次,将浏览器Cookie复制到代码中,或使用无头浏览器(如Puppeteer)先绕过验证再获取有效会话
- Instagram的非官方接口参数(如
__a=1&__d=dis)可能随时变更,需注意接口有效性
内容的提问来源于stack exchange,提问作者Fahad Aslam
相关产品推荐
相关产品推荐

