PHP 请求 QQ 城市达人列表接口示例
本文讲解如何使用 PHP 调用 QQ 城市频道的 JSON 接口,以获取特定城市的达人信息列表。该操作主要涉及利用 PHP 的流上下文(stream context)伪造 HTTP 请求头中的 Referer,以绕过简单的防盗链机制,并处理返回的回调格式 JSON 数据。
实现原理与核心逻辑
QQ 的部分动态数据接口依赖于前端页面的 http://city.qq.com 作为来源校验(Referer)。因此,直接使用浏览器或简单的爬虫无法获取数据。我们需要在 PHP 中创建一个带有指定 header 的上下文环境,并将其传递给 file_get_contents 函数。
此外,该接口返回的数据通常包裹在 JavaScript 回调函数中(如 showSrchResult(...)),因此在获取原始文本后,需要进行字符串截取,去除前后的函数名和括号,仅保留纯净的 JSON 内容。
代码实现步骤
第1步:定义请求参数与伪造 Header
首先,需要指定目标 URL。URL 中包含 cd 参数,代表城市代码(例如 610900 为西安代码)。同时定义一个关联数组,用于设置 HTTP 协议流的头部信息。
$refer = "http://city.qq.com"; // 伪造的来源页
$jsonUrl = "http://city.qq.com/json.php?mod=search&act=page&callback=showSrchResult&jsontype=str&perpage=10&cd=610900&nl=3&xb=0&type=city&pg=1";
第2步:创建流上下文 (Stream Context)
使用 stream_context_create 函数将上述配置封装为一个上下文资源。这确保了后续的 HTTP 请求会携带伪造的 Referer。
$opt = array('http' => array(
'header' => "Referer: $refer"
));
$context = stream_context_create($opt);
第3步:发起请求并清洗数据
调用自定义的 getJson 函数(或直接使用 file_get_contents)。由于返回结果类似 showSrchResult({"key":"value"}),需要使用 substr 剔除前缀 showSrchResult( 和后缀 )。
function getJson($url, $referer, $context) {
$opt = array('http' => array('header' => "Referer: $referer"));
$ctx = stream_context_create($opt);
// 发起请求
$rawData = file_get_contents($url, false, $ctx);
// 数据清洗:去除 callback 函数名和括号
// 假设前缀长度固定或需根据实际返回调整
$cleanData = substr($rawData, 18, -2);
return $cleanData;
}
// 执行输出
$data = getJson($jsonUrl, $refer, $context);
echo $data;
注意事项与排错
- 城市代码变更:
cd参数值随地区不同而变化,需查阅最新的字典或替换为自己的目标城市代码。 - 接口有效性:腾讯内部 API 可能会不定期调整参数结构或增加更严格的反爬验证(如 Token、签名等),若返回空 JSON 或报错,说明接口可能已下线或加密方式已变。
- 字符串截取风险:原示例中使用硬编码索引进行截取,建议在实际应用中改用正则表达式提取大括号内的内容,以提高兼容性。
总结
通过伪造 Referer 和使用流上下文,PHP 可以突破部分简单的 HTTP 引用检查,获取 JSON 数据。此方法适用于早期版本的 QQ 城市频道数据抓取,但在现代 Web 开发中,建议优先寻找官方提供的开放 API 或遵守 robots.txt 规范。
以上就是 PHP 获取 QQ 城市达人信息的详细内容,更多关于 PHP 网络请求的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













