php curl模拟登录 php模拟表单提交实例

发布时间:2020-03-08编辑:脚本学堂
本文介绍了php curl模拟登录提交表单的例子,php模拟登录实例代码,需要的朋友参考下。

php curl模拟登录的方法

比如要登录百度的wap文库,链接是  http://wapwenku.baidu.com
点击“登录”链接,来到登录页面,如图
php curl模拟登录提交<a href=http://www.jb200.com/zt/biaodan/ target=_blank class=infotextkey>表单</a>

查看该页的html源码,找到它的登录表单:
 

复制代码 代码示例:

<form action="http://wappass.baidu.com/passport/" method="post">
<div>
<div>
<span>用户名:</span>
<input id="login_username" maxlength="30" name="login_username" type="text" /></div>
<div>
<span>密码:</span>
<input id="login_loginpass" maxlength="30" name="login_loginpass" type="password" /></div>

<div>
<select title="是否允许自动登录" name="login_save">
<option value="0">不使用自动登录</option>
<option value="1">保存自动登录书签</option>
<option value="2">保存自动登录cookie</option>
</select>
<input name="aaa" type="submit" value="登录" />
 <a href="http://wappass.baidu.com/passport/?reg&amp;ssid=normal&amp; amp;from=normal&amp;bd_page_type=1&amp;uid=wk_1287037457_159&amp; amp;amp;pu=sl%401%2cpw%401000%2csz%40240_320%2cpd%401%2cfz%401%2clp%400%2c&amp; amp;amp;tpl=wenku&amp;u=http%3a%2f%2fwappass.baidu.com%2fpassport%2f %3flogin%26u%3dhttp%3a%2f%2fwapwenku.baidu.com%26tpl%3dwenku%26ssid%3d %26from%3d %26bd_page_type%3d1%26uid%3dwk_1287037457_159%26pu%3dsl%401%2cpw%401000%2csz%40240_320%2cpd%401%2cfz%401%2clp%400 %2c%26ua%3d%26st%3d1%26">注册</a>
<input name="login" type="hidden" value="yes" />
<input name="can_input" type="hidden" value="0" />
<input name="u" type="hidden" value="http://wapwenku.baidu.com" />
<input name="tpl" type="hidden" value="wenku" />
<input name="tn" type="hidden" />
<input name="pu" type="hidden" value="sl@1,pw@1000,sz@240_320,pd@1,fz@1,lp@0," />
<input name="ssid" type="hidden" value="normal" />
<input name="from" type="hidden" value="normal" />
<input name="bd_page_type" type="hidden" value="1" />
<input name="uid" type="hidden" value="wk_1287037457_159" /></div>
</div>
</form>

可以看出一些信息:
action=”http://wappass.baidu.com/passport/” method=”post”

这是登录信息提交的链接和方式。

所以我们程序中要做的事情,就是:把改表单中的所有input、select和textarea(如果有)的信息(包括隐藏的)用curl模拟表单的post方式提交给action中的那个连接就可以了实现登录了。

这里要提一点,很多网站的登录表单中的参数是变化的,比如这个表单中,我通过比较两次刷新的不同页面的源码,发现表单中有个hidden的input值是变化的。

就是这个
<input type=”hidden” name=”uid” value=”wk_1287037457_159″/>

那么,这个uid的值就得用程序动态的获取。很简单,还是curl配合正则就可以获取,代码如下

获取表单中动态的隐藏值:
 

复制代码 代码示例:
$ch = curl_init();
curl_setopt($ch, curlopt_url, "http://wappass.baidu.com/passport/");
curl_setopt($ch, curlopt_cookiejar, $this-&gt;cookie_jar);
curl_setopt($ch, curlopt_header,1);
curl_setopt($ch, curlopt_returntransfer, true);
curl_setopt($ch, curlopt_ssl_verifypeer, false);
curl_setopt($ch, curlopt_ssl_verifyhost, false);
$tmp = curl_exec($ch);
curl_close($ch);
preg_match("/<input name="&quot;uid&quot;" type="&quot;hidden&quot;" value="&quot;(.*?)&quot;" />/i", $tmp, $temparr);
 
$uid = $temparr[1];
 

现在这个$uid 变量就获取到了本次抓取页面的表单中uid。
接下来该模拟提交表单了:
 

复制代码 代码示例:
$ch = curl_init();
curl_setopt($ch, curlopt_url, "http://wappass.baidu.com/passport/");
curl_setopt($ch, curlopt_post, 1);
curl_setopt($ch, curlopt_postfields,  "login_save=0&amp;login=yes&amp;can_input=0&amp;u=http://wapwenku.baidu.com/&amp;tpl=&amp;tn=&amp;pu=normal&amp;ssid=normal&amp;from=0&amp;bd_page_type=1
&amp;uid=".$uid."&amp;login_username=".$username."&amp;login_loginpass=".$password);
curl_setopt($ch, curlopt_cookiejar, $cookie_jar);
curl_setopt($ch, curlopt_header,1);
curl_setopt($ch, curlopt_returntransfer, true);
curl_setopt($ch, curlopt_ssl_verifypeer, false);
curl_setopt($ch, curlopt_ssl_verifyhost, false);
$str = curl_exec($ch);
curl_close($ch);
echo $str;exit;
//判断是否登录成功
if (strpos($str, "http/1.1 302 found") !== false)
{
$is_login = 1;
}
 

注意,$username和$password 是你的百度的用户名和密码,$cookie_jar是cookie保存路径。
以下是完整的登录百度的登录类实例。
 

复制代码 代码示例:
<?php
class baidu{
public $username = "********";    //用户名
public $password = "********";    //密码
public $cookie_jar = "";     //存放cookie地址
//本函数用于登录后想要抓取的页面,$url是目标页面的链接
public function getcontent($url)    //获取页面内容
{
$this->cookie_jar = tempnam('./tmp','cookie');
if(!$this->login())
{
return 0;
}
//开始进入模拟抓取
$ch = curl_init();
curl_setopt($ch, curlopt_url, $url);
curl_setopt($ch, curlopt_cookiefile, $this->cookie_jar);
curl_setopt($ch, curlopt_post, 1);
curl_setopt($ch, curlopt_postfields, $str);
ob_start();
curl_exec($ch);
$contents = ob_get_contents();
ob_end_clean();
curl_close($ch);
return $contents;
}
 
public function login()
{
$is_login = 0;
//取随机码
$ch = curl_init();
curl_setopt($ch, curlopt_url, "http://wappass.baidu.com/passport/");
curl_setopt($ch, curlopt_cookiejar, $this->cookie_jar);
curl_setopt($ch, curlopt_header,1);
curl_setopt($ch, curlopt_returntransfer, true);
curl_setopt($ch, curlopt_ssl_verifypeer, false);
curl_setopt($ch, curlopt_ssl_verifyhost, false);
$tmp = curl_exec($ch);
curl_close($ch);
preg_match("/<input type="hidden" name="uid" value="(.*?)">/i", $tmp, $mchallenge);
//preg_match("/<input type="hidden" name=".u" value="(.*?)">/i", $tmp, $mu);
$uid = $mchallenge[1];
 
//$uid = $mu[1];
//print_r($cookie_jar);exit;
//print_r($arr);exit;
//$hash_passwd = md5(md5($this->user_pwd).$challenge);
 
//第一步:初步登陆
$ch = curl_init();
curl_setopt($ch, curlopt_url, "http://wappass.baidu.com/passport/");
curl_setopt($ch, curlopt_post, 1);
curl_setopt($ch, curlopt_postfields, "login_save=0&login=yes&can_input=0&u=http://wapwenku.baidu.com/&tpl=&tn=&pu=normal&ssid=normal&from=0&bd_page_type=1&uid=".$uid."&login_username=".$this->username."&login_loginpass=".$this->password);
 
curl_setopt($ch, curlopt_cookiejar, $this->cookie_jar);
curl_setopt($ch, curlopt_header,1);
curl_setopt($ch, curlopt_returntransfer, true);
curl_setopt($ch, curlopt_ssl_verifypeer, false);
curl_setopt($ch, curlopt_ssl_verifyhost, false);
$str = curl_exec($ch);
curl_close($ch);
echo $str;exit;
//判断是否登录成功
if (strpos($str, "http/1.1 302 found") !== false)
{
$is_login = 1;
}
return $is_login;
}
}
$baidu = new baidu();
$baidu->login();  //登录
?>

代码说明:
测试过程中,曾把代码写在一个function里而没用类来封装,结果没有达到效果。
暂不清楚为什么出现这个种情况,建议最好把登录方法封装到类中。

>>> 更多有关php模拟登录的文章,请参考专题链接:php模拟登录 php curl模拟登录教程大全