騰訊微博(已停止服務)當年提供開放 API,開發者可透過 OAuth 1.0/2.0 實作第三方發文、關注等功能。本文保留原始技術架構說明,作為歷史參考與 OAuth 流程學習範例。現代專案請改用微信開放平台、微博開放平台等現行 API。
<?php
/**
* 取得騰訊微博登入驗證碼
* @param string $qq QQ 號碼
* @return string|false 驗證碼,失敗回傳 false
*/
function getVerifyCode($qq) {
$url = "https://ptlogin2.qq.com/check?uin=@{$qq}&appid=46000101";
$response = file_get_contents($url);
// 回應格式:ptui_checkVC('0','!CCQ');
if (preg_match("/ptui_checkVC\('0','([^']+)'\)/", $response, $m)) {
return $m[1]; // 如 !CCQ
}
return false;
}
?>
<?php
/**
* 騰訊微博模擬登入
* @param string $qq QQ 號
* @param string $pwd 密碼(明文)
* @param string $verifyCode 步驟一取得的驗證碼
* @return string|false 登入成功回傳跳轉 URL,失敗回傳 false
*/
function loginTencentWeibo($qq, $pwd, $verifyCode) {
// 密碼加密:MD5(MD5(MD5(pwd)) + verifyCode)
// 注意:實際演算法較複雜,此為簡化示意
$pwdMd5_1 = md5($pwd);
$pwdMd5_2 = md5($pwdMd5_1);
$pwdMd5_3 = md5($pwdMd5_2);
$encryptedPwd = md5($pwdMd5_3 . $verifyCode);
$params = [
'u' => "@{$qq}",
'p' => $encryptedPwd,
'verifycode' => $verifyCode,
'aid' => '46000101',
'u1' => 'https://t.qq.com',
'h' => '1',
'from_ui' => '1',
'fp' => 'loginerroralert',
];
$url = 'https://ptlogin2.qq.com/login?' . http_build_query($params);
$response = file_get_contents($url);
// 成功回應:ptuiCB('0','0','https://t.qq.com','0');
if (preg_match("/ptuiCB\('0','0','([^']+)'\)/", $response, $m)) {
return $m[1]; // 登入成功跳轉 URL
}
return false;
}
?>
<?php
/**
* 發布騰訊微博廣播
* @param string $content 發文內容
* @param string $cookie 登入後取得的 Cookie(含 skey, ptui_loginuin 等)
* @return bool
*/
function publishWeibo($content, $cookie) {
$url = 'https://t.qq.com/publish.php';
$data = [
'content' => urlencode($content),
'pic' => '',
'countType' => '',
'viewModel' => '1',
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIE => $cookie,
CURLOPT_REFERER => 'https://t.qq.com/', // 必須帶 Referer
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
curl_close($ch);
// 成功回應:{"result":0,"msg":"廣播成功",...}
return strpos($response, '"result":0') !== false;
}
?>
<?php
/**
* 關注指定用戶
* @param string $targetUin 目標用戶 UIN/QQ
* @param string $cookie 登入 Cookie
* @return bool
*/
function followUser($targetUin, $cookie) {
$url = 'https://t.qq.com/follow.php';
$data = [
'u' => urlencode($targetUin),
'r' => urlencode(time()), // 隨機數
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIE => $cookie,
CURLOPT_REFERER => 'https://t.qq.com/',
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
curl_close($ch);
// 成功:{"result":0,"msg":"成功"}
return strpos($response, '"result":0') !== false;
}
?>
<?php
// 1. 設定帳號資訊
$qq = '123456789';
$pwd = 'your_password';
// 2. 取得驗證碼
$verifyCode = getVerifyCode($qq);
if (!$verifyCode) die('取得驗證碼失敗');
// 3. 登入
$redirectUrl = loginTencentWeibo($qq, $pwd, $verifyCode);
if (!$redirectUrl) die('登入失敗');
// 4. 從重導向 URL 取得 Cookie(實際需解析 Set-Cookie 標頭)
// 此處簡化:假設已手動取得 Cookie 字串
$cookie = 'skey=xxx; ptui_loginuin=xxx; ...';
// 5. 發布廣播
$content = '測試發文 ' . date('Y-m-d H:i:s');
if (publishWeibo($content, $cookie)) {
echo "發布成功\n";
} else {
echo "發布失敗\n";
}
// 6. 關注用戶
if (followUser('987654321', $cookie)) {
echo "關注成功\n";
} else {
echo "關注失敗\n";
}
?>
| 環節 | 關鍵點 | 現代對應做法 |
|---|---|---|
| 認證 | OAuth 1.0 簽名、多重 MD5 加密、驗證碼機制 | OAuth 2.0 / OpenID Connect,JWT Token |
| 密碼處理 | 客戶端多重 MD5(不安全,僅歷史遺留) | HTTPS + 伺服端 bcrypt/argon2 雜湊 |
| 請求驗證 | Referer 檢查防 CSRF | SameSite Cookie、CSRF Token、CORS |
| 回應格式 | JSONP 風格字串(ptuiCB callback) | 標準 JSON、統一錯誤碼 |
| API 端點 | 硬編碼域名(t.qq.com, ptlogin2.qq.com) | 服務發現、配置中心、版本化 API |
password_hash() / password_verify()(bcrypt/argon2)。