PHP 请求 QQ 城市达人列表接口示例

半杯拿铁
半杯拿铁
发布时间:2026-10-14 | 3人浏览过
原创

本文讲解如何使用 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 网络请求的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表