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

PHP 使用 cURL 模擬人人網登入並發布動態

     編輯:PHP 綜合知識

前言

人人網(已停止服務)曾是國內主流社交平台,本文以其為例示範 PHP 如何透過 cURL 模擬瀏覽器完成「登入 → 取得 Token → 發布動態」完整流程。核心技術可移植至其他需模擬登入的站點。

完整實作流程

<?php
// === 設定區 ===
$username = 'your_email@example.com';
$password = 'your_password';
$cookieFile = sys_get_temp_dir() . '/renren_cookie_' . md5($username) . '.txt';
$postContent = '這是用 PHP 發布的測試動態 ' . date('Y-m-d H:i:s');

// === 1. 登入取得 Cookie ===
$loginUrl = 'https://passport.renren.com/PLogin.do';
$loginFields = [
    'email'    => $username,
    'password' => $password,
    'origURL'  => 'https://home.renren.com/Home.do',
    'domain'   => 'renren.com',
];

$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
    CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    CURLOPT_HEADER         => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_AUTOREFERER    => 1,
    CURLOPT_POST           => 1,
    CURLOPT_POSTFIELDS     => $loginFields,
    CURLOPT_COOKIEJAR      => $cookieFile, // 儲存 Cookie
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
]);
$loginResult = curl_exec($ch);
curl_close($ch);

// 簡易判斷登入是否成功(實際需分析回應內容或重導向 URL)
if (strpos($loginResult, '登入失敗關鍵字') !== false) {
    die('登入失敗,請檢查帳密或驗證碼機制');
}

// === 2. 進入首頁攜帶 Cookie 取得發文所需 Token ===
$homeUrl = 'https://www.renren.com/home';
$ch = curl_init($homeUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_COOKIEFILE     => $cookieFile, // 讀取 Cookie
    CURLOPT_SSL_VERIFYPEER => false,
]);
$homeHtml = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

// 從重導向 URL 或頁面內容解析 token、rtk、uid
// 實際選擇器需依當時頁面結構調整
preg_match("/get_check:'([^']+)'/", $homeHtml, $mToken);
preg_match("/get_check_x:'([^']+)'/", $homeHtml, $mRtk);
preg_match("/'ruid':'([^']+)'/", $homeHtml, $mUid);

$token = $mToken[1] ?? '';
$rtk   = $mRtk[1] ?? '';
$uid   = $mUid[1] ?? '';

if (!$token || !$rtk || !$uid) {
    die('無法解析發文參數,請更新正則或檢查登入狀態');
}

// === 3. 發布動態 ===
$postUrl = "https://shell.renren.com/{$uid}/status";
$postFields = [
    'content'        => $postContent,
    'withInfo'       => '{"wpath":[]}',
    'hostid'         => $uid,
    'privacyParams'  => '{"sourceControl": 99}',
    'requestToken'   => $token,
    '_rtk'           => $rtk,
    'channel'        => 'renren',
];
$headers = [
    'Referer: https://shell.renren.com/ajaxproxy.htm',
    'X-Requested-With: XMLHttpRequest',
];

$ch = curl_init($postUrl);
curl_setopt_array($ch, [
    CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    CURLOPT_HTTPHEADER     => $headers,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_POST           => 1,
    CURLOPT_POSTFIELDS     => $postFields,
    CURLOPT_COOKIEFILE     => $cookieFile,
    CURLOPT_SSL_VERIFYPEER => false,
]);
$postResult = curl_exec($ch);
curl_close($ch);

$response = json_decode($postResult, true);
if (($response['code'] ?? '') === '0') {
    echo "發布成功!\n";
} else {
    echo "發布失敗: " . json_encode($response, JSON_UNESCAPED_UNICODE) . "\n";
}

// === 清理 ===
@unlink($cookieFile);
?>

關鍵技術點解析

  1. Cookie 管理:CURLOPT_COOKIEJAR 寫入、CURLOPT_COOKIEFILE 讀取,實現會話保持。
  2. User-Agent 偽裝:模擬真實瀏覽器 UA,降低被風控攔截機率。
  3. SSL 驗證關閉:測試階段設 false,生產環境請配置有效 CA 憑證。
  4. 動態 Token 解析:許多站點在頁面 JS 變數或隱藏表單輸出 CSRF Token,需以正則或 DOM 解析器提取。
  5. Referer 與 X-Requested-With:模擬 AJAX 請求來源,通過伺服器端同源檢查。

遷移至其他平台的通用步驟

  1. 使用瀏覽器開發者工具(Network 分頁)記錄完整登入、發文請求流程。
  2. 識別關鍵參數:表單欄位、Cookie 名稱、Token 來源、必要請求標頭。
  3. 依樣畫葫蘆實作 cURL 流程:登入 → 取得 Token → 攜帶 Token/ Cookie 發送業務請求。
  4. 處理反爬蟲機制:驗證碼、滑塊、裝置指紋、頻率限制(需引入無頭瀏覽器如 Puppeteer/Playwright)。

法律與道德提醒

模擬登入屬於灰色地帶,請嚴格遵守目標網站 robots.txt、服務條款與當地法規。僅供技術研究、自動化測試、個人資料備份等合法用途,嚴禁用於大規模爬蟲、垃圾訊息發送、帳號盜用等違法行為。

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