PHP cURL请求部分URL附加至请求页面,无响应问题咨询
问题分析:OpenSecrets API请求无响应及URL变更原因
问题场景
在本地http://localhost/test.php中发起PHP cURL请求调用OpenSecrets API,代码如下:
$endpoint = 'http://www.opensecrets.org/api/'; $params = array( 'method' => 'candContrib', 'apikey' => 'a5f3d10fc4afedaa161edd6556dced39', 'cid' => 'N00041954', 'output' => 'json' ); $url = $endpoint . '?' . http_build_query($params); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response = curl_exec($curl); curl_close($curl); echo $response;
当前无法获取API响应,但更换代码可获取响应头,且页面URL变为:
http://localhost/api/?method=candContrib&apikey=a5f3d10fc4afedaa161edd6556dced39&cid=N00041954&output=json&__cf_chl_rt_tk=wc_F3WN1i7uMCtxSArUZRkV1jTFZTHcP6o0UuT.Z2wQ-1704945973-0-gaNycGzNChA
此前该代码变体可正常运行,现怀疑与API提供商变更有关。
原因解析
1. URL变更的核心:Cloudflare验证令牌
URL中的__cf_chl_rt_tk是Cloudflare的实时验证令牌,说明OpenSecrets API现在启用了Cloudflare的反爬虫/人机验证机制。当你的cURL请求未通过验证时,会被Cloudflare重定向到带有该令牌的页面(结合你本地服务器的配置,最终显示为localhost的URL)。
2. 无响应的直接原因
你的cURL配置未适配Cloudflare的验证要求:
- 默认cURL请求头(如User-Agent)过于简单,容易被识别为非浏览器请求
- 未启用Cookie存储,无法保存Cloudflare验证过程中生成的会话Cookie
- 纯静态cURL无法执行JS验证逻辑,无法完成Cloudflare的人机验证环节
3. 代码从有效变失效的根源
OpenSecrets近期大概率更新了反爬策略,新增了Cloudflare防护,导致旧的无验证cURL请求不再被API服务器允许。
可行的解决方向
- 添加模拟浏览器的请求头:给cURL配置
CURLOPT_USERAGENT参数,模拟主流浏览器的标识,比如:CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' - 启用Cookie存储:添加Cookie文件读写配置,保存验证会话:
CURLOPT_COOKIEJAR => 'cookie.txt', CURLOPT_COOKIEFILE => 'cookie.txt' - 尝试JS渲染工具:如果上述方法无效,可使用支持JS渲染的工具绕过Cloudflare验证;也可查看OpenSecrets官方文档,确认是否有API调用的白名单申请通道。
内容的提问来源于stack exchange,提问作者mmcglynn
相关产品推荐
相关产品推荐

