php中curl模拟登陆用户百度知道的例子

最近弄了一个工具,希望能获取自己百度网盘里面的数据但又不想公开数据,于是想到了模拟登陆百度,用常规的模拟登陆测试了下发现不行,抓取登陆时的数据才发现,其实百度登陆过程中跳转了几次页面,如果仅仅对http://passport.baidu.com/v2/api/?login一个页面获取cookie是不完整的那样就只有BAIDUID的值,而仅仅这个cookie值是没有多少作用的。

通过对抓包数据的分析,实际登陆过程中是先请求了一次http://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true这个页面,服务器同时给浏览器设置两个cookie,一个BAIDUID的cookie值,这个应该是与seesion id相关的;另一个是

Set-Cookie:
HOSUPPORT=1; expires=Thu, 19-Aug-2021 15:41:37 GMT; path=/; domain=passport.baidu.com; httponly
推测这个应该是百度检测浏览器是否支持cookie;

再次请求该页面,获取网页数据会得到一个token值用于登陆;

然后登陆成功会得到BDUSS等相关的cookie值,以上才是登陆成功,记录下上面的cookie即可!

下面是简单的请求及登陆函数集合,作为基础类吧,可能简单了点,以后再完善吧!

 代码如下 复制代码

<?php
/**
 * 百度基础类
 * @author  qaulau@hotmail.com
 * @file    baidu.php
 * @date    2013-6-2  www.111cn.net

*/

class baidu{

 private $cookie = '';  
 private $username = '';
 private $password = '';
 const COOKIE_DIR = 'temp';   //cookie存放目录
 const COOKIE_VALIDATE = 604800; //cookie有效期,默认为7天
 const SECRET_KEY = 'hAFS6as8askNBVSuiealkkw'; //密钥用于加密cookie文件名,防止保存的cookie路径被猜测

 private function http_request($url, $post_data, $referef,$header = true){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);

  if ($post_data != ""){
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  }

  if ($referef != ""){
   curl_setopt($ch, CURLOPT_REFERER, $referef);
  }

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_HEADER, $header);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");

  if ($this->cookie != ""){
   curl_setopt($ch, CURLOPT_COOKIE, $this->cookie);
  }
  $data = curl_exec($ch);
  curl_close($ch);

  if ($header){
   preg_match_all('/Set-Cookie:((.+)=(.+))$/m ', $data, $cookies);
   if(is_array($cookies) && count($cookies) > 1 && count($cookies[1]) > 0){
    foreach($cookies[1] as $i => $k){
     $cookieinfos = explode(";", $k);
     if(is_array($cookieinfos) && count($cookieinfos) > 1){
      $this->cookie .= $cookieinfos[0];
      $this->cookie .= "; ";
     }
    }
   }
  }
  return $data;
 }

 private function login(){
  //生成一个cookie
  $ret = $this->http_request("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true", "", "");

  //获取token并保存cookie
  $ret = $this->http_request("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true", "", "");
  preg_match_all('/login_token='(.+)'/', $ret, $tokens);
  $login_token = $tokens[1][0];

  //登陆并保存cookie
  $post_data = array();
  $post_data['username'] = $this->username;
  $post_data['password'] = $this->password;
  $post_data['token'] = $login_token;
  $post_data['charset'] = "UTF-8";
  $post_data['callback'] = "parent.bd12Pass.api.login._postCallback";
  $post_data['index'] = "0";
  $post_data['isPhone'] = "false";
  $post_data['mem_pass'] = "on";
  $post_data['loginType'] = "1";
  $post_data['safeflg'] = "0";
  $post_data['staticpage'] = "https://passport.baidu.com/v2Jump.html";
  $post_data['tpl'] = "mn";
  $post_data['u'] = "http://www.baidu.com/";
  $post_data['verifycode'] = "";

  $ret = $this->http_request("http://passport.baidu.com/v2/api/?login", $post_data, "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F");

  //记录下所有cookie
  $this->writeCookie();  
 }

 private function writeCookie(){
  if(!file_exists(self::COOKIE_DIR)){
   @mkdir(self::COOKIE_DIR) && touch(self::COOKIE_DIR.'/index.html');
  }
  $filename = self::COOKIE_DIR.'/'.md5($this->username.self::SECRET_KEY);
  file_put_contents($filename, $this->cookie);
 }

 public function baidu($username,$password){
  $this->username = $username;
  $this->password = $password;
  $filename = self::COOKIE_DIR.'/'.md5($this->username.self::SECRET_KEY);
  if ((@filemtime($filename)+ self::COOKIE_VALIDATE > time()) && ($cookie = file_get_contents($filename))!= ''){
  //如果cookie在有效期内且不为空
   $this->cookie = $cookie;
  }else {
   $this->login();
  }
 }

 /** www.111Cn.net
  * 请求页面
  * @param string $url  :页面地址
  * @param string $referef :引用页面
  * @param string $post_data :post数据,如果填写则为post方式否则为get方式
  * 返回页面数据
  */
 public function request($url,$referef = '',$post_data = ''){
  return $this->http_request($url,$referef,$post_data,false);
 }

}

这个只是基本的类,只涉及登陆及请求与提交数据,可在此基础上使用,例如请求百度云网盘:

 代码如下 复制代码

$baidu = new baidu('用户名','密码');
$data = $baidu->request('http://pan.baidu.com/api/list?channel=chunlei&clienttype=0&web=1&num=100&page=1&dir=%2F','http://pan.baidu.com');
echo $data;

还可以用来作为贴吧的发帖或百度空间更新工具.

时间: 2024-10-26 05:29:15

php中curl模拟登陆用户百度知道的例子的相关文章

phpcurl-php用curl模拟登陆问题,出现 Object reference ..

问题描述 php用curl模拟登陆问题,出现 Object reference .. 我用cur模拟登陆网站是,出现错误Object reference not set to an instance of an object.. 我用浏览器登陆时的post参数和我curl中参数时一样的,没问题. 我在代码中添加了 $D为cookies信息. curl_setopt($curl, CURLOPT_COOKIE, $D); 因为需要验证码登陆. 但是模拟登陆中头信息中缺少了 cookies. 我想是

php通过curl模拟登陆DZ论坛

  本文章来给各位同学介绍一下关于Php CURL模拟登陆论坛并采集数据实例,如果你对利用curl模拟登录功能有兴趣可进入参考. libcurl同时也支持HTTPS认证.HTTP POST.HTTP PUT. FTP 上传(这个也能通过PHP的FTP扩展完成).HTTP 基于表单的上传.代理.cookies和用户名+密码的认证. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3

请教下带验证码的网站怎么用php curl模拟登陆呢?

问题描述 请教下带验证码的网站怎么用php curl模拟登陆呢? www.xianbao5.com 这个网站用CURL post登录 谁会能教教我吗? 主要是怎么获取这个网站的验证码?人工输入也可以 我在抓包工具找到了验证码的网址,是 http://www.xianbao5.com/misc.php?mod=seccode&update=11212&idhash=cSB0PJ9T 但是不知道为什么直接在浏览器访问却没有东西! <?php header("content-Ty

php-【PHP求助】通过PHP Curl模拟登陆后抓取远程内容

问题描述 [PHP求助]通过PHP Curl模拟登陆后抓取远程内容 需要抓取的内容:这个页面需要登陆后才能访问http://member1.taobao.com/member/user_profile.jhtml?userID=epni51 如图所示: 解决方案 淘宝有接口实现这个的 解决方案二: 建议你把你的全部需求写出来,出个预算,在猪八戒网或者这里发布一下,或有人直接给你做好的. 解决方案三: 你找到淘宝网的登陆接口,自己用账户名和密码发送到接口登陆后获取返回的cookie,后续的请求附带

Php CURL模拟登陆论坛并采集数据实例

要模拟浏览器访问网站,首选要学会观察浏览器是如何发送http报文的,以及网站服务器返回给浏览器 是什么样的内容.我推荐安装一个国外人开发的httpwatch的软件,最好搞个破解的版本,否则有些功能是使用不了的.这个软件安装完成之后是嵌入在 IE里的,启动Record,在地址栏输入网址后回车,它就会将浏览器和服务器之间的所有通讯扫描出来,让你一览无遗.关于这个软件的使用在本文不做介 绍. 模拟浏览器登陆应用开发,最关键的地方是突破登陆验证.CURL技术不只支持http,还支持https.区别就在多

php通过curl模拟登陆DZ论坛_php实例

libcurl同时也支持HTTPS认证.HTTP POST.HTTP PUT. FTP 上传(这个也能通过PHP的FTP扩展完成).HTTP 基于表单的上传.代理.cookies和用户名+密码的认证. <?php $discuz_url = 'http://www.jb51.net/';//论坛地址 $login_url = $discuz_url .'login.php?action=login';//登录页地址 $post_fields = array(); //以下两项不需要修改 $pos

Shell 利用 curl 模拟登陆

-b 参数 指定使用cookie文件 -c是往cookie文件中写cookie -d 是指定此次登录所需的参数,通过httpfox查看 -L 指定页面自动跳转 #curl -c ck.txt --user-agent Mozilla/4.0 -d "username=****&password=*****&server_id=1&submit=true" 登陆的url #curl -c ck.txt -b ck.txt --user-agent Mozilla/

php中CURL模拟进行微信接口的GET与POST例子

Get提交获取数据  /**   * @desc 获取access_token   * @return String access_token   */   function getAccessToken(){       $AppId = '1232assad13213123';       $AppSecret = '2312312321adss3123213';       $getUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_t

php使用curl模拟登录后采集页面的例子_php实例

今天接到的功课是从一个网站获取商品库存,但是这个网站需要登录,我用fsockopen传递了整个header头都没用,只能求助于curl了.附带说一下curl模块的开启办法:(1)从php目录下拷贝:libeay32.dll,ssleay32.dll 到windows目录下.(2)打开php.ini,查找"extension_dir = xxxxx",确认后面的文件目录内有php_curl.dll文件.(3)同样是php.ini,查找"extension=php_curl.dl