PHP调用Shodan API时Curl搜索无响应问题排查
解决PHP Curl调用Shodan API无响应的问题
我来帮你排查代码里的问题,这个操作不是始终无法执行,修正几个关键点就能正常工作:
1. URL中的转义字符错误
你URL里的&是HTML转义后的&符号,Curl会把它当成URL的一部分,而非参数分隔符。必须把&替换成普通的&:
原URL:
'https://api.shodan.io/shodan/host/search?key=myapikey&query=apache&facets={}'
修正后:
'https://api.shodan.io/shodan/host/search?key=your_real_api_key&query=apache&facets={}'
注意:一定要把myapikey换成你在Shodan平台获取的真实有效API密钥
2. 不必要的请求头
你设置了Content-Type: application/json,但这是一个GET请求——Shodan的搜索接口通过URL参数传递数据,请求体为空,这个多余的头可能干扰接口正常解析,建议移除CURLOPT_HTTPHEADER的设置。
3. SSL验证问题(本地环境常见坑)
如果你的本地PHP环境没有配置有效的SSL根证书,Curl会因SSL证书验证失败静默失败,无任何返回。调试阶段可临时关闭SSL验证(生产环境不建议,最好配置CA证书):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
4. 添加错误调试代码
为快速定位问题,建议在curl_exec后添加Curl错误检测,直接查看具体错误信息:
$do = curl_exec($ch); if(curl_errno($ch)) { echo 'Curl执行错误: ' . curl_error($ch); exit; }
修正后的完整代码
$ch = curl_init(); // 替换成真实API密钥,修正URL中的&符号 curl_setopt($ch, CURLOPT_URL, 'https://api.shodan.io/shodan/host/search?key=your_real_api_key&query=apache&facets={}'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 本地调试临时关闭SSL验证(生产环境请删除这行并配置CA证书) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $do = curl_exec($ch); // 添加错误检测 if(curl_errno($ch)) { echo 'Curl错误: ' . curl_error($ch); curl_close($ch); exit; } $do1 = json_decode($do, true); curl_close($ch); // 打印结果,如果解码失败可以先打印原始响应看看 if($do1 === null) { echo 'JSON解码失败,原始响应:' . $do; } else { print_r($do1); }
按照上面的修改,应该就能正常获取Shodan API的响应了。如果还是有问题,先看Curl的错误提示,或者打印原始的$do内容,看看Shodan返回的错误信息(比如API密钥无效、请求次数超限等)。
内容的提问来源于stack exchange,提问作者demon666
相关产品推荐
相关产品推荐

