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中的数据传输神器。