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

PHP 利用 cURL 模擬登入新浪微博並發布微博的完整實作教學

     編輯:PHP 相關知識

在 PHP 開發中,若要模擬使用者登入第三方網站,cURL 函式庫是不可或缺的工具。它能讓伺服器端程式碼像真實瀏覽器一樣發送 HTTP 請求、攜帶 Cookie、處理重導向,從而實現自動化登入與操作。本文將詳細拆解如何繞過新浪微博複雜的加密登入機制,改用新浪通行證(Sina SSO)的明文密碼登入介面,並完成微博發布的全流程。

核心難點:微博登入加密算法的繞過

新浪微博官方登入介面 login.sina.com.cn 採用了 sha1(sha1(sha1(pwd)).once.servertime) 這類多層雜湊加密,導致直接模擬極其困難。但作者發現一個關鍵突破口:微博帳號可通用於所有新浪產品。新浪郵箱、通行證等子站點的登入介面並未強制要求同等強度的加密,甚至存在明文傳輸密碼的舊版介面。

這屬於資安領域的「旁路攻擊」思路:當主目標防禦過於堅固時,尋找同一信任體系下防禦較弱的關聯系統作為突破口,拿到登入憑證後再回頭存取目標系統。

實作步驟詳解

1. 向新浪通行證發送登入請求

目標 URL:https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543
關鍵參數說明:

  • su:使用者名稱經 Base64 編碼
  • sp:密碼(此介面接受明文)
  • entry=sso、service=sso:標識單點登入模式
  • returntype=TEXT:要求返回純文字 JSON 而非 JavaScript 回調
<?php
$username = base64_encode($u);
$password = $p; // 明文密碼

$loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543';
$loginData = [
    'entry' => 'sso',
    'gateway' => '1',
    'from' => 'null',
    'savestate' => '30',
    'useticket' => '0',
    'pagerefer' => '',
    'vsnf' => '1',
    'su' => $username,
    'service' => 'sso',
    'sp' => $password,
    'sr' => '1920*1080',
    'encoding' => 'UTF-8',
    'cdult' => '3',
    'domain' => 'sina.com.cn',
    'prelt' => '0',
    'returntype' => 'TEXT',
];

$login = json_decode(loginPost($loginUrl, $loginData), true);
var_dump($login);

function loginPost($url, $data) {
    global $cookie_file;
    $post = is_array($data) ? http_build_query($data) : $data;
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $post,
        CURLOPT_COOKIEJAR => $cookie_file,
        CURLOPT_COOKIEFILE => $cookie_file,
    ]);
    $return = curl_exec($ch);
    curl_close($ch);
    return $return;
}
?>

成功時返回 JSON 範例:

array(4) {
  'retcode' => '0'
  'uid' => '1920109964'
  'nick' => '畢姥爺講故事'
  'crossDomainUrlList' => array(2) {
    [0] => 'https://passport.weibo.com/wbsso/login?ticket=ST-...'
    [1] => 'https://crosdom.weicaifu.com/sso/crosdom?action=login&savestate=...'
  }
}

2. 執行跨域 Cookie 同步(關鍵步驟)

登入成功後,crossDomainUrlList 中的 URL 必須逐一請求,以便在 weibo.com、weicaifu.com 等域名下寫入 Cookie。務必在訪問 weibo.com 首頁之前完成此步驟,否則會因缺少跨域 Cookie 而導致未登入狀態。

<?php
// 依序請求跨域同步 URL
foreach ($login['crossDomainUrlList'] as $syncUrl) {
    get($syncUrl); // 使用同樣攜帶 Cookie 的 GET 請求函式
}
?>

3. 獲取微博個人首頁真實 URL

直接請求 https://weibo.com,伺服器會根據 Cookie 自動重導向到用戶的個人首頁(如 https://weibo.com/bipeng0405/home?wvr=5)。記錄 curl_getinfo 返回的 redirect_url 即可得到目標地址。

<?php
$ch = curl_init('https://weibo.com');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_COOKIEFILE => $cookie_file,
    CURLOPT_COOKIEJAR => $cookie_file,
    CURLOPT_FOLLOWLOCATION => 1, // 自動跟隨重導向
]);
$return = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
// $info['redirect_url'] 即為個人首頁真實地址
?>

發布微博後續流程

拿到個人首頁 URL 與完整 Cookie 後,即可分析發布微博的 AJAX 介面(通常為 https://weibo.com/aj/mblog/add),提取 _t、_spr 等防 CSRF Token,組裝 content、pic_id 等參數發送 POST 請求即可完成發布。完整代碼篇幅較長,核心邏輯與上述登入流程一致:維持 Cookie 會話、模擬瀏覽器 Header、處理 JSON 回應。

安全與合規提醒

  • 本文技術僅供學習研究、自動化測試或個人帳號管理使用。
  • 大規模批量註冊、發布垃圾內容、繞過風控屬於違規行為,可能觸犯《計算機信息網絡國際聯網安全保護管理辦法》等法規。
  • 新浪微博官方提供 開放平台 API,正式專案請優先使用 OAuth 2.0 官方授權方式。

微博登入流程示意圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved