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

PHP 透過 cURL 模擬新浪微博登入與發文

     編輯:PHP 綜合知識

背景與挑戰

新浪微博登入機制複雜,主站登入採用多重加密(sha1(sha1(sha1(pwd)).once.servertime)),直接破解極難。但發現新浪旗下 login.sina.com.cn 統一登入介面密碼以明文傳輸,且登入後可同步取得微博站點 Cookie,構成「側通道」突破口。

核心策略:統一登入入口 + 跨域 Cookie 同步

  1. 向 https://login.sina.com.cn/sso/login.php 發送明文帳密完成登入。
  2. 從回應 JSON 中取得 crossDomainUrlList(含微博域 Cookie 種植連結)。
  3. 依序請求該列表網址,在微博域下建立登入態。
  4. 攜帶 Cookie 訪問 weibo.com 即為登入狀態。

完整實作程式碼

<?php
// === 設定 ===
$username = 'your_weibo_account';
$password = 'your_password';
$cookieFile = sys_get_temp_dir() . '/weibo_cookie_' . md5($username) . '.txt';

/**
 * 通用 cURL POST 封裝
 */
function curlPost($url, array $data, $cookieFile) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_POST           => 1,
        CURLOPT_POSTFIELDS     => http_build_query($data),
        CURLOPT_COOKIEJAR      => $cookieFile,
        CURLOPT_COOKIEFILE     => $cookieFile,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    ]);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

/**
 * 通用 cURL GET 封裝
 */
function curlGet($url, $cookieFile) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_COOKIEFILE     => $cookieFile,
        CURLOPT_COOKIEJAR      => $cookieFile,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
    ]);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

// === 1. 統一登入入口 ===
$loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)';
$loginData = [
    'entry'      => 'sso',
    'gateway'    => '1',
    'from'       => 'null',
    'savestate'  => '30',
    'useticket'  => '0',
    'pagerefer'  => '',
    'vsnf'       => '1',
    'su'         => base64_encode($username), // 使用者名 Base64
    'service'    => 'sso',
    'sp'         => $password,                // 明文密碼
    'sr'         => '1920*1080',
    'encoding'   => 'UTF-8',
    'cdult'      => '3',
    'domain'     => 'sina.com.cn',
    'prelt'      => '0',
    'returntype' => 'TEXT',
];

$loginResp = curlPost($loginUrl, $loginData, $cookieFile);
$loginJson = json_decode($loginResp, true);

if (($loginJson['retcode'] ?? '') !== '0') {
    die('登入失敗: ' . json_encode($loginJson, JSON_UNESCAPED_UNICODE));
}

echo "登入成功,UID: {$loginJson['uid']}, 暱稱: {$loginJson['nick']}\n";

// === 2. 跨域 Cookie 同步(關鍵步驟)===
foreach ($loginJson['crossDomainUrlList'] as $crossUrl) {
    curlGet($crossUrl, $cookieFile);
    usleep(200000); // 稍作延遲,確保 Cookie 寫入
}

// === 3. 訪問微博首頁確認登入態 ===
$homeHtml = curlGet('https://weibo.com', $cookieFile);
// 此時 $homeHtml 應包含登入後的個人化內容

// === 4. 發布微博(需解析頁面中的 form token、_rtk 等)===
// 實際發文介面參數較複雜,建議改用官方 OpenAPI (OAuth2) 方式
// 此處僅示範登入流程核心
echo "登入流程完成,Cookie 已儲存至: $cookieFile\n";
?>

關鍵細節與避坑指南

  • su 欄位:使用者名需 base64_encode,非 URL 編碼。
  • sp 欄位:此統一登入入口接受明文密碼,主站登入介面則需複雜加密。
  • crossDomainUrlList:回應中包含 2~3 個跨域連結,**必須逐一請求** 才能在 .weibo.com、.sina.com.cn 等域下種植 Cookie,否則後續請求仍為未登入狀態。
  • Cookie 持久化:將 Cookie 檔案儲存於磁碟,下次執行直接載入 CURLOPT_COOKIEFILE 即可跳過登入步驟,直到 Cookie 過期。
  • 風控應對:高頻操作會觸發驗證碼、裝置鎖定,建議引入 IP 代理池、降低頻率、模擬真實使用者行為間隔。

更佳替代方案:官方 OpenAPI

新浪微博提供完整的 OAuth2 開放平台,支援授權碼模式、Access Token 管理、介面限流保護。**強烈建議正式專案使用官方 API**,避免模擬登入的脆弱性、法律風險與維護成本。

總結

本文展示的「統一登入入口 + 跨域 Cookie 同步」技巧,不僅適用於新浪微博,同理可推廣至其他擁有統一認證中心(SSO)的大型網站群(如 Google、Microsoft、阿里系)。掌握此模式,能在無官方 API 或 API 受限時,快速實現自動化登入與資料存取。

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