PHP cURL 模擬登錄新浪微博發博實戰:從掃碼到 Cookie 免密複用
模擬登錄新浪微博(現「微博」)是典型的 cURL 實戰場景,涉及 RSA 加密、預登錄獲取參數、SSO 跨域票據傳遞、Cookie 持久化等核心技術。本文梳理完整流程,提供可落地的代碼架構(僅供技術研究,請遵守平台協議)。
核心難點分析
- 密碼加密:微博登錄密碼經過
sha1(sha1(sha1(pwd)) + servertime + nonce) 三重哈希,需先請求 prelogin 接口獲取 servertime、nonce、pubkey、rsakv。
- RSAP 加密:使用獲取的公鑰對組合字符串進行 RSA 加密(PHP 需
openssl 擴展)。
- 驗證碼:高風險賬號/異地登錄觸發圖片/滑塊驗證碼,需接入打碼平台或人工介入。
- SSO 跨域:登錄成功後需訪問
crossDomainUrlList 列表中的 URL,在各子域寫入 Cookie,才能訪問微博主站。
完整流程架構
prelogin($username);
if (!empty($prelogin['showpin'])) {
throw new \Exception('需要驗證碼,pcid: ' . $prelogin['pcid']);
}
$sp = $this->encryptPassword($password, $prelogin);
$su = base64_encode($username);
$postData = [
'entry' => 'weibo',
'gateway' => '1',
'from' => '',
'savestate' => '7',
'useticket' => '1',
'ssosimplelogin' => '1',
'vsnf' => '1',
'su' => $su,
'service' => 'sso',
'sp' => $sp,
'sr' => '1920*1080',
'encoding' => 'UTF-8',
'cdult' => '3',
'domain' => 'weibo.com',
'prelt' => '100',
'returntype' => 'TEXT',
'rsakv' => $prelogin['rsakv'],
];
$url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_=' . time() . '000';
$resp = $this->client->execute($url, 'POST', $postData);
$result = json_decode($resp, true);
if ($result['retcode'] !== '0') {
throw new \Exception('登錄失敗: ' . ($result['reason'] ?? json_encode($result)));
}
// 4. 關鍵:跨域同步 Cookie
foreach ($result['crossDomainUrlList'] as $syncUrl) {
$this->client->execute($syncUrl); // 獲取重定向,寫入各子域 Cookie
}
// 5. 訪問主站驗證
$home = $this->client->execute('https://weibo.com/');
if (strpos($home, $username) === false) {
throw new \Exception('Cookie 同步失效,請檢查 crossDomainUrlList');
}
return true;
}
// 6. 發布微博
public function postStatus(string $content, string $picPath = '') {
// 獲取發布頁獲取 st 參數
$composePage = $this->client->execute('https://weibo.com/aj/mblog/add?ajwvr=6');
// 解析 st (security token) ...
// 構建 multipart/form-data 上傳圖片 (可選)
// 提交發布接口
// 此處省略具體參數解析,實際需抓包分析最新接口
}
}
Cookie 免密複用策略(生產級核心)
每次模擬登錄極易觸發風控。最佳實踐:
- 首次登錄:人工掃碼/輸入驗證碼完成登錄,導出完整 Cookie(含
SUB、SUBP、SSOLoginState 等關鍵字段)。
- 持久化存儲:將 Cookie 序列化存入 Redis/數據庫,設置 TTL(如 30 天)。
- 請求復用:後續 API 請求直接注入 Cookie:
CURLOPT_COOKIE => 'SUB=xxx; SUBP=yyy;'。
- 有效性檢測:定期請求
https://weibo.com/ 檢查是否包含用戶標識,失效則觸發報警/重新登錄流程。
- 分布式共享:多台服務器共享同一 Cookie 池,避免重複登錄觸發異地風控。
風控繞過關鍵點(防御視角)
| 風控維度 | 檢測手段 | 模擬對策 |
| 設備指紋 | Canvas、WebGL、字體、聲音指紋 | Headless Chrome + 指紋偽造插件 |
| IP 信譽 | 代理 IP 池、數據中心 IP 識別 | 住宅代理、移動網關 IP、降低頻率 |
| 行為建模 | 鼠標軌跡、點擊間隔、滾動行為 | 模擬人類操作延遲、隨機軌跡 |
| 賬號關聯 | 同設備/ IP 多賬號、登錄時間規律 | 一機一碼一 IP、錯峰操作 |
法律與合規紅線
- 《網絡安全法》、《數據安全法》、《個人信息保護法》嚴禁未授權爬取、暴力破解、繞過驗證碼。
- 微博《用戶協議》第 12 條明確禁止「通過非官方授權方式訪問」及「干擾服務正常運行」。
- 企業級需求請申請 微博開放平台 API(OAuth 2.0),獲取
access_token 合法調用發布、讀取接口。
技術探索止步於原理理解,工程落地請走官方開放平台。尊重平台規則,才能構建可持續的業務系統。