人人網作為早期國內主流社交平台,其登入機制相對直觀,適合作為 PHP cURL 模擬登入的入門案例。本文提供從登入、獲取 Token 到發布動態的完整可執行代碼,並解析關鍵步驟與常見坑點。
https://passport.renren.com/PLogin.do POST 帳號密碼,獲取登入 Cookie。https://www.renren.com/home 觸發二次重導向,獲取攜帶用戶 ID 的真實首頁 URL。requestToken、_rtk 及 uid。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);
}
?>
使用 CURLOPT_COOKIEJAR(寫入)與 CURLOPT_COOKIEFILE(讀取)指向同一檔案,確保多次請求間會話保持。生產環境建議改用資料庫或 Redis 儲存 Cookie 字串,避免檔案鎖競爭。
人人網對 Referer 與 X-Requested-With 有嚴格檢查,缺一不可。現代瀏覽器 UA 字串建議定期更新。
從 HTML 中正則解析 Token 屬於「脆弱耦合」,前端頁面結構一旦調整即會失效。穩健做法是:
原代碼中 'hostid:' => $uid 多了一個冒號,實際發送時會導致參數名錯誤,已在上方代碼中修正為 'hostid'。
人人網現已轉型/停止核心社交服務,本文僅作技術教學參考,實際專案請優先使用官方授權 API。