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

PHP cURL 模擬登入人人網並發布動態的完整代碼實例

     編輯:PHP 相關知識

人人網作為早期國內主流社交平台,其登入機制相對直觀,適合作為 PHP cURL 模擬登入的入門案例。本文提供從登入、獲取 Token 到發布動態的完整可執行代碼,並解析關鍵步驟與常見坑點。

核心流程概覽

  1. 登入認證:向 https://passport.renren.com/PLogin.do POST 帳號密碼,獲取登入 Cookie。
  2. 首頁重導向:訪問 https://www.renren.com/home 觸發二次重導向,獲取攜帶用戶 ID 的真實首頁 URL。
  3. 提取 Token:從首頁 HTML 中正則提取 requestToken、_rtk 及 uid。
  4. 發布動態:向 https://shell.renren.com/{uid}/status 發送 AJAX POST 請求,攜帶 Token 與內容完成發布。

完整代碼實作

<?php
// 假設從資料庫讀取配置
$rconfig = pdo_fetch("SELECT * FROM ".tablename("eduTwo_renren")." WHERE weid = :weid", [':weid'=>$_W['weid']]);

$cookie_file = dirname(__FILE__) . "/renren.cookie";
$login_url = 'https://passport.renren.com/PLogin.do';

$post_fields = [
    'email' => $rconfig['rusername'],
    'password' => $rconfig['rpassword'],
    'origURL' => 'http%3A%2F%2Fhome.renren.com%2FHome.do',
    'domain' => 'renren.com',
];

// --- 步驟 1:登入 ---
$ch = curl_init($login_url);
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 => $post_fields,
    CURLOPT_COOKIEJAR => $cookie_file,
    CURLOPT_COOKIEFILE => $cookie_file,
]);
$content = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

// --- 步驟 2:訪問首頁獲取重導向 URL ---
$send_url = 'https://www.renren.com/home';
$ch = curl_init($send_url);
curl_setopt_array($ch, [
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_COOKIEFILE => $cookie_file,
    CURLOPT_COOKIEJAR => $cookie_file,
    CURLOPT_FOLLOWLOCATION => 1,
]);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

// --- 步驟 3:從重導向頁面提取 Token 與 UID ---
$redirect_url = $info['redirect_url'];
$ch = curl_init($redirect_url);
curl_setopt_array($ch, [
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_COOKIEFILE => $cookie_file,
]);
$tmp = curl_exec($ch);
curl_close($ch);

// 正則提取關鍵參數
preg_match_all("/get_check:'(.*?)',get_check_x:'(.*?)',/is", $tmp, $arr);
preg_match_all("/'ruid':'(.*?)',/is", $tmp, $utmp);

$token = $arr[1][0] ?? '';
$rtk   = $arr[2][0] ?? '';
$uid   = $utmp[1][0] ?? '';

if (!$token || !$rtk || !$uid) {
    die('Token 提取失敗,可能登入失敗或頁面結構變更');
}

// --- 步驟 4:發布動態 ---
$poststr = [
    'content' => $_GPC['content'] . $rconfig['tail'],
    'withInfo' => '{"wpath":[]}',
    'hostid' => $uid,              // 注意:原代碼 'hostid:' 多冒號,此處修正
    'privacyParams' => '{"sourceControl":99}',
    'requestToken' => $token,
    '_rtk' => $rtk,
    'channel' => 'renren',
];

$head = [
    'Referer: https://shell.renren.com/ajaxproxy.htm',
    'X-Requested-With: XMLHttpRequest',
];

$ch = curl_init("https://shell.renren.com/{$uid}/status");
curl_setopt_array($ch, [
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    CURLOPT_HTTPHEADER => $head,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_AUTOREFERER => 1,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $poststr,
    CURLOPT_COOKIEFILE => $cookie_file,
    CURLOPT_COOKIEJAR => $cookie_file,
]);
$content = curl_exec($ch);
curl_close($ch);

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

關鍵點補充說明

1. Cookie 持久化

使用 CURLOPT_COOKIEJAR(寫入)與 CURLOPT_COOKIEFILE(讀取)指向同一檔案,確保多次請求間會話保持。生產環境建議改用資料庫或 Redis 儲存 Cookie 字串,避免檔案鎖競爭。

2. User-Agent 與 Header 偽裝

人人網對 Referer 與 X-Requested-With 有嚴格檢查,缺一不可。現代瀏覽器 UA 字串建議定期更新。

3. 正則提取的脆弱性

從 HTML 中正則解析 Token 屬於「脆弱耦合」,前端頁面結構一旦調整即會失效。穩健做法是:

  • 優先尋找官方開放 API(人人網已停止開放平台服務)
  • 或改用 Headless Chrome (Puppeteer/Playwright) 渲染頁面後再提取

4. 參數名稱拼寫修正

原代碼中 'hostid:' => $uid 多了一個冒號,實際發送時會導致參數名錯誤,已在上方代碼中修正為 'hostid'。

適用場景與法律風險提示

  • ✅ 個人帳號自動化備份、跨平台同步發布
  • ✅ 內部測試環境自動化測試
  • ❌ 批量註冊、刷粉、發布營銷垃圾內容
  • ❌ 繞過驗證碼、突破頻率限制

人人網現已轉型/停止核心社交服務,本文僅作技術教學參考,實際專案請優先使用官方授權 API。

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