基于PHP CURL获取邮箱地址的详解


Posted in PHP onJune 03, 2013

CURL可谓居家旅行必备之杀人良药,为何如此形容?就是因为他好用方便能实现页面抓取模拟登录采集等一系列功能。
记得第一次接触CURL的时候是要实现完成从邮箱用户列表的抓取。当时为了赶进度没有细细研究只是网上找了一些资料实现了功能。现在把当初的代码整理一下功能依旧能用

<?php
  error_reporting ( 0 );
  set_time_limit ( 0 );
  header ( "Content-Type: text/html; charset=GB2312" );  //邮箱用户名密码
  $user = 'username';
  $pass = 'password';
  //创建一个文件用于存放cookie信息
  define ( "COOKIEJAR", tempnam ( ini_get ( "upload_tmp_dir" ), "cookie" ) );
  $url = 'http://reg.163.com/logins.jsp?type=1&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D-1';
  $refer = 'http://mail.163.com';
  $fields_post = array ('username' => $user, 'password' => $pass, 'verifycookie' => 1, 'style' => - 1, 'product' => 'mail163', 'selType' => - 1, 'secure' => 'on' );
  $fields_string = http_build_query ( $fields_post, '&' );
  $headers_login = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0', 'Referer' => 'http://www.163.com' );
  //登录
  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
  curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_REFERER, $refer );
  curl_setopt ( $ch, CURLOPT_COOKIESESSION, true );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers_login );
  curl_setopt ( $ch, CURLOPT_POST, count ( $fields ) );
  curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields_string );
  $result = curl_exec ( $ch );
  curl_close ( $ch );
  //跳转
  $url = 'http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=loki_wuxi';
  $headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );
  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
 curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
  curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  $result = curl_exec ( $ch );
  curl_close ( $ch );
 //取得sid
  preg_match ( '/sid=[^\"].*/', $result, $location );
  $sid = substr ( $location [0], 4, - 1 );
  //通讯录地址
  $url = 'http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid=' . $sid . '&gid=all';
  $headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );
  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
  curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
  curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  $result = curl_exec ( $ch );
  curl_close ( $ch );
  unlink ( COOKIEJAR );
  //开始抓取内容
  preg_match_all ( '/<td class="Ibx_Td_addrName"><a[^>]*>(.*?)<\/a><\/td><td class="Ibx_Td_addrEmail"><a[^>]*>(.*?)<\/a><\/td>/i', $result, $infos, PREG_SET_ORDER );
  //1:姓名2:邮箱
  print_r ( $infos );
  ?>

建立一个PHP文件复制以上代码保存后效果立竿见影,记得更改邮箱账户和密码,账户不需要@后缀。CURL初体验,如何,还不错吧。
后来在CSDN上又看到别人发帖问一个获取快递查询的问题,他想把一些大的快递公司查询业务做在一个页面中,的确是个很不错的实用小工具,但是因为快递查询有验证码,不由的又让我想起了CURL利器。后来帮帖主实现功能,思路很简单,先用CURL模拟抓取验证码,然后显示到用户提交页面中,同时保存验证码的COOKIE等用户查询一起提交就保证了COOKIE的同步。

源代码如下:
-getEms.html

<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <title>EMS快递查询</title>
  </head>
  <body>
  <?php
  fclose(fopen('cookie.txt','w')); //文件 cookie.txt 用于存放取得的cookie
  $cookiejar = realpath('cookie.txt');
  $fp = fopen("example_homepage.txt", "w"); //文件 example_homepage.txt 用于存放取得的页面内容
  $ch = curl_init("http://www.ems.com.cn/servlet/ImageCaptchaServlet");
  curl_setopt($ch, CURLOPT_FILE, $fp);
  curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_exec($ch);
  curl_close($ch);
  fclose($fp);  //readfile($cookiejar); //查看取到的 cookie
  //readfile("example_homepage.jpg"); //查看取到的图片
  ?>
  <form action="getems.php" method="post" name="form1">
  快递号:<input name="mailNum" type="text" value="EA739701017CS" />(13位 首尾2位都是字母)
 <input name="code" type="text" value="" />
  <?php echo "<img src='example_homepage.txt'>";?>
  <input type="submit" value="提交">
  </form>
  </body>
  </html>

-getems.php
<?php
  if($_POST){
  //使用先前验证码的cookie文件
  $cookiejar = realpath('cookie.txt');
  //获取myEmsbarCode号 和验证码变量名
  $ch = curl_init("http://www.ems.com.cn");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
  $result = curl_exec($ch);
  curl_close($ch);
  preg_match("/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.*)\"\/>/isU",$result,$myEmsbarCode);
  preg_match("/<\/span><input name=\"(.*)\" type=\"text\"/isU",$result,$codename);  $parm = array($codename[1]=>$_POST['code'],
  mailNum =>$_POST['mailNum'],
  myEmsbarCode=>$myEmsbarCode[1],
  reqCode=>'browseBASE'
  );
  $ch = curl_init("http://www.ems.com.cn/qcgzOutQueryAction.do");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_REFERER, "http://www.ems.com.cn");
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parm));
  $_source = curl_exec($ch);
  curl_close($ch);
  //搞定
  var_dump($_source);
  exit;
  }
  ?>

对于CURL库的参数详解,网上有很多我直接收录了
函数列表CURL库一共有17个函数:
curl_close:关闭CURL会话
curl_copy_handle:复制一个CURL会话句柄,同时3复制其所有参数
curl_errno:返回最后一个错误码
curl_error:返回一个字符串,用以描述当前会话的最后一个错误
curl_exec:执行当前会话
curl_getinfo:获取特定信息
curl_init:初始化CURL会话
curl_multi_add_handle:在一个多连接会话中添加一个句柄
curl_multi_close:关闭一个多句柄CRUL会话
curl_multi_exec:执行一个多句柄CURL会话
curl_multi_getcontent:返回一个句柄执行后的内容,如果设置了CURLOPT_RETURNTRANSFER
curl_multi_info_read:获取当前所有连接的信息
curl_multi_init:初始化一个多句柄会话
curl_multi_remove_handle:从一个多句柄会话中删除一个句柄
curl_multi_select:获取所有绑定的套接字
curl_setopt:设置CURL传输选项
curl_version:获取CURL版本
常用设置选项布尔值选项
CURLOPT_AUTOREFERER:当返回的信息头含有转向信息时,自动设置前向连接
CURLOPT_BINARYTRANSFER:TRUEtoreturntherawoutputwhenCURLOPT_RETURNTRANSFERisused.
CURLOPT_COOKIESESSION:标志为新的cookie会话,忽略之前设置的cookie会话
CURLOPT_CRLF:将Unix系统的换行符转换为Dos换行符
CURLOPT_DNS_USE_GLOBAL_CACHE:使用全局的DNS缓存
CURLOPT_FAILONERROR:忽略返回错误
CURLOPT_FILETIME:获取请求文档的修改日期,该日期可以用curl_getinfo()获取。
CURLOPT_FOLLOWLOCATION:紧随服务器返回的所有重定向信息
CURLOPT_FORBID_REUSE:当进程处理完毕后强制关闭会话,不再缓存供重用
CURLOPT_FRESH_CONNECT:强制建立一个新的会话,而不是重用缓存的会话
CURLOPT_HEADER:在返回的输出中包含响应头信息
CURLOPT_HTTPGET:设置HTTP请求方式为GET
CURLOPT_HTTPPROXYTUNNEL:经由一个HTTP代理建立连接
CURLOPT_NOBODY:返回的输出中不包含文档信息.
CURLOPT_NOPROGRESS:禁止进程级别传输,PHP自动设为真
CURLOPT_NOSIGNAL:忽略所有发往PHP的信息
CURLOPT_POST:设置POST方式提交数据,POST格式为application/x-www-form-urlencoded
CURLOPT_PUTTRUE:设置PUT方式上传文件,同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE
CURLOPT_RETURNTRANSFER:返回字符串,而不是调用curl_exec()后直接输出
CURLOPT_SSL_VERIFYPEER:SSL验证开启
CURLOPT_UNRESTRICTED_AUTH:一直链接后面附加用户名和密码,同时设置CURLOPT_FOLLOWLOCATION
CURLOPT_UPLOAD:准备上传整数值选项
CURLOPT_BUFFERSIZE:缓存大小
CURLOPT_CONNECTTIMEOUT:连接时间设置,默认0为无限制
CURLOPT_DNS_CACHE_TIMEOUT:内存中保存DNS信息的时间,默认2分钟
CURLOPT_INFILESIZE:上传至远程站点的文件尺寸
CURLOPT_LOW_SPEED_LIMIT:传输最低速度限制andabort.
CURLOPT_LOW_SPEED_TIME:传输时间限制
CURLOPT_MAXCONNECTS:最大持久连接数
CURLOPT_MAXREDIRS:最大转向数
CURLOPT_PORT:连接端口
CURLOPT_PROXYAUTH:*****验证方式
CURLOPT_PROXYPORT:*****端口
CURLOPT_PROXYTYPE:*****类型
CURLOPT_TIMEOUT:CURL函数的最大执行时间字符串选项
CURLOPT_COOKIE:HTTP头中set-cookie中的cookie信息
CURLOPT_COOKIEFILE:包含cookie信息的文件,cookie文件的格式可以是Netscape格式,或者只是HTTP头的格式
CURLOPT_COOKIEJAR:连接结束后保存cookie信息的文件
CURLOPT_CUSTOMREQUEST:自定义请求头,使用相对地址
CURLOPT_ENCODING:HTTP请求头中Accept-Encoding的值
CURLOPT_POSTFIELDS:POST格式提交的数据内容
CURLOPT_PROXY:代理通道
CURLOPT_PROXYUSERPWD:代理认证用户名和密码
CURLOPT_RANGE:返回数据的范围,以字节记
CURLOPT_REFERER:前向链接
CURLOPT_URL:要连接的URL地址,可以在curl_init()中设置
CURLOPT_USERAGENT:HTTP头中User-Agent的值
CURLOPT_USERPWD:连接种使用的验证信息数组选项
CURLOPT_HTTP200ALIASES:200响应码数组,数组中的响应吗被认为是正确的响应
CURLOPT_HTTPHEADER:自定义请求头信息只能是流句柄的选项:
CURLOPT_FILE:传输要写入的晚间句柄,默认是标准输出
CURLOPT_INFILE:传输要读取的文件句柄
CURLOPT_STDERR:作为标准错误输出的一个替换选项
CURLOPT_WRITEHEADER:传输头信息要写入的文件回调函数选项
CURLOPT_HEADERFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息按行返回。设置返回值为字符串长度。
CURLOPT_READFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此函数,将自行处理返回的数据。返回值为数据尺寸。
CURLOPT_WRITEFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息是整个字符串。设置返回值为字符串长度。
其他一些CURL的例子 (摘自网络)
  /*
  *判断一个url是否为有效链接
  */
  function isRealUrl($url){
  $ch = curl_init();
  $options = array(
  CURLOPT_URL => $url,
  CURLOPT_HEADER => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_NOBODY => true
  );
  curl_setopt_array($ch, $options);
  curl_exec($ch);
  if(!curl_errno($ch)){
  return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)?true:false;
  }
  curl_close($ch);
  }  $url = 'http://testpic1.tomoimg.cn/240x180/394/855/517932781/200901/12312215602409.jpg';
  if(isRealUrl($url)){echo 'yes';}else{echo 'no';}
  /异步请求的例子:
  $userid = 517932781;
  $imageid = 1520;
  $albumid = 2637;
  $tags = 'aa';
  extract($_POST);
  $url = 'http://'.$_SERVER['HTTP_HOST'].'/ajax/image.php';
  $fields = array(
  'userid' => $userid,
  'imageid' => $imageid,
  'albumid' => $albumid,
  'tags' => $tags,
  'optype' => 'del'
  );
  $ch = curl_init() ;
  curl_setopt($ch, CURLOPT_URL,$url) ;
  curl_setopt($ch, CURLOPT_POST,true) ;
  curl_setopt($ch, CURLOPT_POSTFIELDS,$fields) ;
  $result = curl_exec($ch) ;
  curl_close($ch) ;
  //上传文件
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/import.php');
  $fields = array(
  'tname' => '道德经',
  'country' => 1,
  'author' => '老子',
  'tags' => '道德经',
  'desc' => '道可道,非常道。名可名,非常名。无名天地之始。有名万物之母。故常无欲以观其妙。常有欲以观其徼。此两者同出而异名,同谓之玄。玄之又玄,众妙之门。',
  'volume' => 2,
  'cover' => '@'.realpath('/data/lianhuanhua/deal/1.jpg')
  );
  curl_setopt($ch, CURLOPT_POST, true) ;
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fields) ;
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  $result = curl_exec($ch);
  curl_close($ch);
  //多文件上传
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/addpic.php');
  $j = 0;
  $fields = array(
  'vid' => 103,
  'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/1.jpg'),
  'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/2.jpg')
  );
  curl_setopt($ch, CURLOPT_POST, true) ;
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fields) ;
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  $result = curl_exec($ch);
  curl_close($ch);

当你掌握了php curl库你就能做很多你想做的事情了,呵呵,前不久玩开心网的X世界,战斗实在繁琐,我直接写了个战斗助手非常好用,本代码就不开源了 :)掌握原理一样开源实现。
网站计数器
PHP 相关文章推荐
如何获得PHP相关资料
Oct 09 PHP
php获得当前的脚本网址
Dec 10 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
php实现paypal 授权登录
May 28 PHP
PHP常用的排序和查找算法
Aug 06 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 #PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 #PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 #PHP
PHP CLI模式下的多进程应用分析
Jun 03 #PHP
基于php-fpm 参数的深入理解
Jun 03 #PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 #PHP
You might like
header()函数使用说明
2006/11/23 PHP
PHP Socket 编程
2010/04/09 PHP
破解Session cookie的方法
2006/07/28 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
django 控制页面跳转的例子
2019/08/06 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Python eval函数介绍及用法
2020/11/09 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
建筑安全员岗位职责
2014/03/13 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
离婚代理词范文
2015/05/23 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python