使用Curl请求Instagram媒体接口遭限制,求解决方案
问题描述
我尝试请求以下链接获取Instagram媒体内容:
https://www.instagram.com/p/D?__a=1&__d=dis
多次请求后收到错误响应:
{"message": "Please wait a few minutes before you try again.", "require_login":true, "status":"fail" }
我已经尝试用Curl配置请求解决,但没效果,求可行的解决思路。我的PHP Curl代码如下:
<?php header("Access-Control-Allow-Origin: *"); $arrSetHeaders = array( 'origin: https://www.instagram.com', 'authority: www.instagram.com', 'upgrade-insecure-requests: 1', 'Host: www.instagram.com', 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'accept-encoding: gzip, deflate, br', 'accept-language: en-GB,en;q=0.9', 'cache-control: max-age=0', 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"', 'sec-fetch-dest: document', 'sec-fetch-mode: navigate', 'sec-fetch-site: same-origin', ); $ch = curl_init("https://www.instagram.com/p/D?__a=1&__d=dis"); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"); curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/temp/cookies.txt" ); curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/temp/cookies.txt" ); curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders, "*"); curl_setopt($ch, CURLOPT_REFERER, 'https://www.instagram.com/accounts/login/'); curl_setopt($ch, CURLOPT_COOKIE, "set-cookie: csrftoken=???; set-cookie: ds_user_id=???; set-cookie: sessionid=???"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $data = curl_exec($ch); echo '<pre style="word-wrap: break-word; white-space: pre-wrap;">' . $data . '</pre>';
可行解决思路
1. 修复Cookie配置错误
你的CURLOPT_COOKIE参数格式完全错误:
- 不需要加
set-cookie:前缀,直接写键值对,比如csrftoken=XXX; ds_user_id=XXX; sessionid=XXX CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE已经在处理Cookie持久化,不要重复用CURLOPT_COOKIE手动设置,两者冲突会导致Cookie失效,建议删除CURLOPT_COOKIE这一行,让Curl自动管理Cookie。
2. 模拟真实用户请求流程
Instagram反爬会检查请求连贯性,不要直接请求目标链接,按以下步骤执行:
- 先请求Instagram首页(
https://www.instagram.com/),获取初始csrftoken和Cookie - 再请求登录页面(
https://www.instagram.com/accounts/login/),更新Cookie - 最后请求目标媒体链接,确保请求链符合真实用户访问路径
3. 添加请求间隔限制
你收到的是典型的频率限制错误,必须控制请求频率:
- 每次请求间隔至少5-10秒,避免短时间大量请求触发限流
- 批量请求时用随机间隔(如3-15秒),更贴近真实用户行为
4. 优化请求头合理性
- 你的
sec-fetch-site设为same-origin,但第一次请求目标链接时referer是登录页,应该改为cross-site或直接去掉这个头,让Curl自动生成 - 删除
upgrade-insecure-requests: 1,因为请求的是JSON接口,不是HTML页面,该头不符合场景 - 开启Curl自动处理压缩:添加
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate, br');,确保accept-encoding设置的编码能被正确解析
5. 使用有效登录Cookie
如果目标内容需要登录访问,需获取真实有效的登录Cookie:
- 手动登录Instagram浏览器,打开开发者工具Application面板,复制
csrftoken、sessionid、ds_user_id的Cookie值 - 将这些值正确写入Cookie文件,或通过
CURLOPT_COOKIE设置(注意格式) - Cookie有有效期,过期后需重新获取
6. 更换API参数
__a=1和__d=dis是Instagram旧版非公开API参数,现已逐渐废弃:
- 建议尝试官方公开的Graph API(需申请开发者账号)
- 或从真实浏览器请求中提取最新的非公开接口参数(如
__ccg=UNKNOWN&__rev=1004404298&__s=XXX&__hsi=XXX)
内容的提问来源于stack exchange,提问作者Oreo
相关产品推荐
相关产品推荐

