1. php curl 無法實現模擬登陸
<?php
$discuz_url = 'http://127.0.0.1/discuz/';//論壇地址
$login_url = $discuz_url .'logging.php?action=login';//登錄頁地址
$post_fields = array();
//以下兩項不需要修改
$post_fields['loginfield'] = 'username';
$post_fields['loginsubmit'] = 'true';
//用戶名和密碼,必須填寫
$post_fields['username'] = 'tianxin';
$post_fields['password'] = '111111';
//安全提問
$post_fields['questionid'] = 0;
$post_fields['answer'] = '';
//@todo驗證碼
$post_fields['seccodeverify'] = '';
//獲取表單FORMHASH
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die('Not found the forumhash.');
}
//POST數據,獲取COOKIE,cookie文件放在網站的temp目錄下
$cookie_file = tempnam('./temp','cookie');
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);
//取到了關鍵的cookie文件就可以帶著cookie文件去模擬發帖,fid為論壇的欄目ID
$send_url = $discuz_url."post.php?action=newthread&fid=2";
$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
//這里的hash碼和登陸窗口的hash碼的正則不太一樣,這里的hidden多了一個id屬性
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*id="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die('Not found the forumhash.');
}
$post_data = array();
//帖子標題
$post_data['subject'] = 'test2';
//帖子內容
$post_data['message'] = 'test2';
$post_data['topicsubmit'] = "yes";
$post_data['extra'] = '';
//帖子標簽
$post_data['tags'] = 'test';
//帖子的hash碼,這個非常關鍵!假如缺少這個hash碼,discuz會警告你來路的頁面不正確
$post_data['formhash']=$formhash;
$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_REFERER, $send_url); //偽裝REFERER
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$contents = curl_exec($ch);
curl_close($ch);
//清理cookie文件
unlink($cookie_file);
?>
2. 騰訊PHP面試題,PHP如何模擬POST提交登錄求詳細代碼
大概流程是
先構建要傳輸的數據
再使用php的stocket模擬post請求
例子,比如我打開這個頁面所用到的數據就是(這里用的是GET請求,改成POST就行了)
$fp=fsockopen(主機ip,埠號);
fputs($fp,數據字元串);
while(!feof($fp)){
//這里是輸出請求所得到的回應數據
$result.=fgets($fp,128);
}
更多請自行網路php模擬post請求
因為我以前在工程實例中做過,所以比較了解
純手打,望採納
話說,這個問題過了就能進騰訊?門檻太低了吧。。。
3. PHP curl 保持會話
樓主的思路問題不大,但是服務端不支持你想什麼辦法都沒用,最好是服務端能支持令牌(token)模式,否則在安全機制的作用下用curl是維持不了你所說的長連接的。
關於會話模式,通常所說的回話模式並不等同於持久連接,php發起的curl會話的生命周期是當前的php進程而已。這么打個比方吧,你通過a.php完成了登錄,然後b.php想使用剛才拿到的認證繼續工作,相當於在ie窗口登錄,然後在firefox瀏覽器繼續工作,伺服器端當然不認可了。
何況我用你提供的賬號實驗了一下,登錄之後會進入到 http://sms.huhutv.com.cn/rtcrm-clientweb/npage/base/pub/pub0010/Pub0010Controller-initMainPage.gv 這個頁面,然後關掉頁面並打開一個新的標簽頁,粘貼這個地址後直接就報錯了,說 「非法進入系統」,可是偏偏重新登錄的時候又提示您的賬號已經登錄。
呵呵,服務端自己的登錄/認證處理都工作不正常,你搞curl持久連接又怎麼可能成功。
4. PHP鎬庝箞鐢╤ttpclient.class鏉ユā鎷熺櫥闄嗙櫨搴
妯℃嫙嫻忚堝櫒鐧婚檰搴旂敤寮鍙戱紝鏈鍏抽敭鐨勫湴鏂規槸紿佺牬鐧婚檰楠岃瘉銆侰URL鎶鏈涓嶅彧鏀鎸乭ttp錛岃繕鏀鎸乭ttps銆傚尯鍒灝卞湪澶氫簡涓灞係SL鍔犲瘑浼犺緭銆傚傛灉鏄瑕佺櫥闄唄ttps緗戠珯錛宲hp璁板緱瑕佹敮鎸乷penssl銆傝繕鏄鍏堟嬁涓涓渚嬪瓙鏉ュ垎鏋愩
//鐢ㄦ埛鍚
$login = 'username';
//瀵嗙爜
$password = 'password';
//163鐨勭敤鎴風櫥闄嗗湴鍧
$url = "https://reg.163.com/logins.jsp";
//post 瑕佹彁浜ょ殑鏁版嵁
$fields = "verifycookie=1&style=16&proct=mail163&username=".$login."&password=".$password."&selType=jy&remUser=&secure=on&%B5%C7%C2%BC%D3%CA%CF%E4=%B5%C7%C2%BC%D3%CA%CF%E4";
//鐢ㄦ潵瀛樻斁cookie鐨勬枃浠
$cookie_file = dirname(__FILE__)."/cookie.txt";
//鍚鍔ㄤ竴涓狢URL浼氳瘽
$ch = curl_init();
// 瑕佽塊棶鐨勫湴鍧
curl_setopt($ch, CURLOPT_URL, $url);
// 瀵硅よ瘉璇佷功鏉ユ簮鐨勬鏌ワ紝0琛ㄧず闃繪㈠硅瘉涔︾殑鍚堟硶鎬х殑媯鏌ャ
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// 浠庤瘉涔︿腑媯鏌SSL鍔犲瘑綆楁硶鏄鍚﹀瓨鍦
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
//妯℃嫙鐢ㄦ埛浣跨敤鐨勬祻瑙堝櫒錛屽湪HTTP璇鋒眰涓鍖呭惈涓涓鈥漸ser-agent鈥濆ご鐨勫瓧絎︿覆銆
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
//鍙戦佷竴涓甯歌勭殑POST璇鋒眰錛岀被鍨嬩負錛歛pplication/x-www-form-urlencoded錛屽氨鍍忚〃鍗曟彁浜ょ殑涓鏍楓
curl_setopt($ch, CURLOPT_POST, 1);
//瑕佷紶閫佺殑鎵鏈夋暟鎹錛屽傛灉瑕佷紶閫佷竴涓鏂囦歡錛岄渶瑕佷竴涓狜寮澶寸殑鏂囦歡鍚
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
//榪炴帴鍏抽棴浠ュ悗錛屽瓨鏀綾ookie淇℃伅鐨勬枃浠跺悕縐
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// 鍖呭惈cookie淇℃伅鐨勬枃浠跺悕縐幫紝榪欎釜cookie鏂囦歡鍙浠ユ槸Netscape鏍煎紡鎴栬匟TTP椋庢牸鐨刪eader淇℃伅銆
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
// 璁劇疆curl鍏佽告墽琛岀殑鏈闀跨掓暟
//curl_setopt($ch, CURLOPT_TIMEOUT, 6);
// 鑾峰彇鐨勪俊鎮浠ユ枃浠舵祦鐨勫艦寮忚繑鍥烇紝鑰屼笉鏄鐩存帴杈撳嚭銆
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// 鎵ц屾搷浣
$result = curl_exec($ch);
if ($result == NULL) {
echo "Error:<br>";
echo curl_errno($ch) . " - " . curl_error($ch) . "<br>";
}
// 鍏抽棴CURL浼氳瘽
curl_close($ch);涓 闈㈣繖涓渚嬪瓙鐩稿圭畝鍗曪紝鍥犱負鐢ㄦ埛鍚嶅拰瀵嗙爜鍙浠ユ槑鏂囦紶杈擄紝鑰屼笖鐧婚檰涔熶笉闇瑕侀獙璇佺爜銆俼q.com鐨勬ā鎷熺櫥闄嗙浉瀵瑰氨楹葷儲澶氫簡錛岄栧厛瑕佺獊鐮撮獙璇佺爜榪欏叧錛岀劧鍚庣敱浜 QQ瀵嗙爜鏄緇忚繃javascript鍔犲瘑鍚庝紶杈撶殑錛岀櫥闄嗙晫闈涔熻佹ā鎷熷嚭鏉ワ紝涓嬩竴綃囨枃絝犲啀緇х畫娣卞叆璋堣皥QQ鐨勬ā鎷熺櫥闄嗐
鍙傝冭祫鏂:
CURL璇﹁В http://www.21andy.com/blog/20080507/1095.html
Tags: curl,妯℃嫙鐧婚檰wuzuquan 2008/07/18 09:40鎮ㄥソ錛屾垜鐜板湪鍦ㄥ仛涓涓妯℃嫙yahoo鐧婚檰鐨刾hp紼嬪簭錛屽洜涓簓ahoo鐨勫瘑鐮佹槸緇忚繃javascript鍔犲瘑鐨勶紝鑰屼笖鍦ㄥ姞瀵嗚繃紼嬩腑寮曠敤浜嗕竴涓緗戦〉闅忔満鐢熸垚鐨勫瓧絎︿覆challenge錛岃繖涓瀛楃︿覆鍦ㄦ瘡嬈¤塊棶緗戦〉鐨勬椂鍊欓兘涓嶄竴鏍楓
濡傛灉鎴戦噰鐢╟url鏉ユā鎷熺櫥闄嗭紝榪囩▼濡備笅錛
鍏坈url_init錛堬級鍒濆嬪寲涓涓猚url榪炴帴錛岃劇疆鐩稿叧閫夐」鍚庯紝curl_exec錛堬級錛涚劧鍚庡埄鐢ㄩ噰闆嗗姛鑳藉緱鍒癱hallenge鐨勫礆紝緇忚繃鍔犲瘑璁$畻鍑哄姞瀵嗗悗鐨勫瘑鐮併傚啀鏉ヤ竴嬈curl_exec錛屽皢鐢ㄦ埛鍚嶏紝鍔犲瘑瀵嗙爜絳塸ost鍑哄幓銆
鍙鏄榪欐牱鍋氶噰闆嗗埌鐨刢hallenge姘歌繙閮芥槸榪囨椂鐨勶紝榪欒ユ庝箞瑙e喅鍛錛
甯屾湜涓嶅悵璧愭暀錛屾垜鐨勯偖綆辨槸[email protected]
5. phpcurl遇到500會卡死
伺服器環境或者不支持的組件等原因。phpcurl遇到500卡死是因為伺服器環境或者不支持的組件等原因導致的500錯誤,這種情況下即使建立一個靜態頁面也會出現500錯誤。沒辦法補救。php curl就是php中的數據傳輸神器。