php curl模拟登录的方法
比如要登录百度的wap文库,链接是 http://wapwenku.baidu.com
点击“登录”链接,来到登录页面,如图
查看该页的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&ssid=normal& amp;from=normal&bd_page_type=1&uid=wk_1287037457_159& amp;amp;pu=sl%401%2cpw%401000%2csz%40240_320%2cpd%401%2cfz%401%2clp%400%2c& amp;amp;tpl=wenku&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->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=""uid"" type=""hidden"" value=""(.*?)"" />/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&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=".$username."&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模拟登录教程大全