首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 獲取 QQ 用戶昵稱與在線狀態的多種實現方案

     編輯:PHP 相關知識

方案對比概覽

騰訊未提供官方公開 API 獲取 QQ 昵稱與在線狀態,開發者需通過非官方接口(如 QQ 空間、wpa.qq.com、網頁版聊天組件)實現。本文匯總三種主流方案並分析優劣。

方案一:基於 wpa.qq.com 圖片 Content-Length 判斷在線狀態

原理:騰訊返回不同大小的圖片表示在線/離線,通過 HTTP 頭 Content-Length 區分。

<?php
/**
 * 獲取 QQ 在線狀態(簡易版)
 * @param int|string $uin QQ 號
 * @return bool true=在線, false=離線/失敗
 */
function getQqOnlineSimple(string $uin): bool
{
    $url = "https://wpa.qq.com/pa?p=1:{$uin}:4";
    $content = @file_get_contents($url);
    if ($content === false) {
        return false;
    }
    
    // 從響應頭獲取 Content-Length
    foreach ($http_response_header as $header) {
        if (stripos($header, 'Content-Length:') === 0) {
            $length = (int)trim(substr($header, 15));
            // 經驗閾值:在線圖片通常 > 1000 字節
            return $length > 1000;
        }
    }
    return false;
}

// 使用
var_dump(getQqOnlineSimple('561272831'));
?>

方案二:Socket 直連 wpa.qq.com 解析 Location 跳轉(更準確)

原理:模擬 HTTP 請求,解析響應頭中 Location 跳轉 URL 是否包含 online 或 offline 關鍵字。

<?php
/**
 * Socket 方式獲取 QQ 在線狀態
 * @return int 1=在線, 0=離線, -1=失敗
 */
function getQqOnlineSocket(string $uin): int
{
    $request = "GET /pa?p=1:{$uin}:1 HTTP/1.1\r\n"
             . "Host: wpa.qq.com\r\n"
             . "User-Agent: PHP_QQ_Checker\r\n"
             . "Connection: Close\r\n\r\n";

    $socket = @fsockopen('wpa.qq.com', 80, $errno, $errstr, 5);
    if (!$socket) {
        return -1;
    }

    fwrite($socket, $request);
    $response = '';
    while (!feof($socket)) {
        $response .= fread($socket, 1024);
    }
    fclose($socket);

    // 解析 Location 頭
    if (preg_match('/Location:\s*(.+)/i', $response, $m)) {
        $location = $m[1];
        if (strpos($location, 'online') !== false) return 1;
        if (strpos($location, 'offline') !== false) return 0;
    }
    return -1;
}
?>

方案三:獲取 QQ 昵稱(通過 QQ 空間個人名片接口)

<?php
/**
 * 獲取 QQ 昵稱
 * @return string|false 昵稱或失敗
 */
function getQqNickname(string $uin): string|false
{
    $url = "https://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin={$uin}";
    $json = @file_get_contents($url);
    if ($json === false) {
        return false;
    }
    
    // 響應格式:portraitCallBack({"nickname":"xxx",...})
    if (preg_match('/"nickname"\s*:\s*"([^"]+)"/', $json, $m)) {
        return $m[1];
    }
    return false;
}

/**
 * 綜合獲取:昵稱 + 在線狀態
 */
function getQqInfo(string $uin): array
{
    return [
        'uin'      => $uin,
        'nickname' => getQqNickname($uin) ?? '未知',
        'online'   => getQqOnlineSimple($uin), // 或使用 Socket 版
    ];
}

// 批量查詢示例
$qqList = ['561272831', '12345678', '88888888'];
foreach ($qqList as $qq) {
    print_r(getQqInfo($qq));
    usleep(200000); // 禮貌延遲,避免被限流
}
?>

方案對比總結

方案獲取信息準確度穩定性速度備註
Content-Length僅在線狀態中中快閾值可能隨騰訊更新失效
Socket+Location僅在線狀態高高中解析跳轉邏輯較穩定
QQ空間接口昵稱+頭像等高中中可能需 Cookie/Referer

重要提醒

  • 非官方接口:隨時可能失效或加入反爬限制,生產環境請做好降級與緩存
  • 頻率控制:建議緩存結果 5-10 分鐘,避免高頻請求導致 IP 被封
  • 隱私合規:僅查詢公開信息,勿用於批量掃描或隱私侵犯場景
  • 替代方案:若有騰訊開放平台應用,優先使用官方 OAuth API 獲取用戶授權信息
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved