设为首页 收藏本站
查看: 549|回复: 0

[经验分享] PHP的CURL 获取邮箱地址

[复制链接]

尚未签到

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

01<?php

09

10error_reporting( 0 );

11set_time_limit ( 0 );

12header ("Content-Type: text/html; charset=GB2312");

13

14//邮箱用户名密码

15$user= 'username';

16$pass= 'password';

17

18//创建一个文件用于存放cookie信息

19define ("COOKIEJAR", tempnam (ini_get( "upload_tmp_dir"), "cookie") );

20

21$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';

22$refer= 'http://mail.163.com';

23$fields_post= array('username'=> $user,'password'=> $pass,'verifycookie'=> 1, 'style'=> - 1, 'product'=> 'mail163','selType'=> - 1, 'secure'=> 'on');

24$fields_string= http_build_query ( $fields_post,'&' );

25$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');

26

27//登录

28$ch= curl_init ( $url);

29curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true );

30curl_setopt ($ch, CURLOPT_HEADER, true );

31curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 120 );

32curl_setopt ($ch, CURLOPT_POST, true );

33curl_setopt ($ch, CURLOPT_REFERER,$refer);

34curl_setopt ($ch, CURLOPT_COOKIESESSION, true );

35curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR );

36curl_setopt ($ch, CURLOPT_HTTPHEADER,$headers_login);

37curl_setopt ($ch, CURLOPT_POST,count( $fields) );

38curl_setopt ($ch, CURLOPT_POSTFIELDS,$fields_string);

39$result= curl_exec ( $ch);

40curl_close ($ch );

41

42//跳转

43$url= 'http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=loki_wuxi';

44$headers= array('User-Agent'=> 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0');

45

46$ch= curl_init ( $url);

47curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true );

48curl_setopt ($ch, CURLOPT_HEADER, true );

49curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 120 );

50curl_setopt ($ch, CURLOPT_POST, true );

51curl_setopt ($ch, CURLOPT_HTTPHEADER,$headers);

52curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIEJAR );

53curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR );

54$result= curl_exec ( $ch);

55curl_close ($ch );

56

57//取得sid

58preg_match ('/sid=[^\"].*/',$result,$location);

59$sid= substr( $location[0], 4, - 1 );

60

61//通讯录地址

62$url= 'http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid='. $sid. '&gid=all';

63$headers= array('User-Agent'=> 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0');

64

65$ch= curl_init ( $url);

66curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true );

67curl_setopt ($ch, CURLOPT_HEADER, true );

68curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 120 );

69curl_setopt ($ch, CURLOPT_POST, true );

70curl_setopt ($ch, CURLOPT_HTTPHEADER,$headers);

71curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIEJAR );

72curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR );

73$result= curl_exec ( $ch);

74curl_close ($ch );

75unlink ( COOKIEJAR );

76

77//开始抓取内容

78preg_match_all ('/<td class="Ibx_Td_addrName"><a[^>]*>(.*?)<\/a><\/td><td class="Ibx_Td_addrEmail"><a[^>]*>(.*?)<\/a><\/td>/i',$result,$infos, PREG_SET_ORDER );

79//1:姓名2:邮箱

80print_r ($infos);

81

82?>



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

  
  源代码如下:
-getEms.html

01<html>

02<head>

03<metahttp-equiv="Content-Type"content="text/html; charset=gb2312">

04<title>EMS快递查询</title>

05</head>

06<body>

07<?php

08fclose(fopen('cookie.txt','w')); //文件 cookie.txt 用于存放取得的cookie

09$cookiejar= realpath('cookie.txt');

10$fp= fopen("example_homepage.txt", "w"); //文件 example_homepage.txt 用于存放取得的页面内容

11$ch= curl_init("http://www.ems.com.cn/servlet/ImageCaptchaServlet");

12curl_setopt($ch, CURLOPT_FILE, $fp);

13curl_setopt($ch, CURLOPT_COOKIESESSION, 1);

14curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);

15curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);

16curl_setopt($ch, CURLOPT_HEADER, 0);

17curl_exec($ch);

18curl_close($ch);

19fclose($fp);

20

21//readfile($cookiejar); //查看取到的 cookie

22//readfile("example_homepage.jpg"); //查看取到的图片

23?>

24<formaction="getems.php"method="post"name="form1">

25快递号:<inputname="mailNum"type="text"value="EA739701017CS"/>(13位 首尾2位都是字母)

26<inputname="code"type="text"value=""/>

27<?phpecho "<img src='example_homepage.txt'>";?>

28<inputtype="submit"value="提交">

29</form>

30

31</body>

32</html>



  -getems.php
01<?php

02if($_POST){

03//使用先前验证码的cookie文件

04$cookiejar= realpath('cookie.txt');

05//获取myEmsbarCode号 和验证码变量名

06$ch= curl_init("http://www.ems.com.cn");

07curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

08curl_setopt($ch, CURLOPT_HEADER, 0);

09curl_setopt($ch, CURLOPT_COOKIEFILE,$cookiejar);

10curl_setopt($ch, CURLOPT_COOKIEJAR,$cookiejar);

11$result= curl_exec($ch);

12curl_close($ch);

13preg_match("/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.*)\"\/>/isU",$result,$myEmsbarCode);

14preg_match("/<\/span><input name=\"(.*)\" type=\"text\"/isU",$result,$codename);

15

16$parm= array($codename[1]=>$_POST['code'],

17mailNum =>$_POST['mailNum'],

18myEmsbarCode=>$myEmsbarCode[1],

19reqCode=>'browseBASE'

20);

21

22$ch= curl_init("http://www.ems.com.cn/qcgzOutQueryAction.do");

23curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

24curl_setopt($ch, CURLOPT_HEADER, 0);

25curl_setopt($ch, CURLOPT_COOKIEFILE,$cookiejar);

26curl_setopt($ch, CURLOPT_COOKIEJAR,$cookiejar);

27curl_setopt($ch, CURLOPT_POST, 1);

28curl_setopt($ch, CURLOPT_REFERER,"http://www.ems.com.cn");

29curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parm));

30$_source= curl_exec($ch);

31curl_close($ch);

32

33//搞定

34var_dump($_source);

35exit;

36}

37?>



对于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的例子 (摘自网络)
01/*

02*判断一个url是否为有效链接

03*/

04functionisRealUrl($url){

05$ch= curl_init();

06$options= array(

07CURLOPT_URL =>$url,

08CURLOPT_HEADER => true,

09CURLOPT_RETURNTRANSFER => true,

10CURLOPT_NOBODY => true

11);

12curl_setopt_array($ch,$options);

13curl_exec($ch);

14if(!curl_errno($ch)){

15return200==curl_getinfo($ch,CURLINFO_HTTP_CODE)?true:false;

16}

17curl_close($ch);

18}

19

20$url= 'http://testpic1.tomoimg.cn/240x180/394/855/517932781/200901/12312215602409.jpg';

21if(isRealUrl($url)){echo'yes';}else{echo'no';}

22

23/异步请求的例子:

24$userid= 517932781;

25$imageid= 1520;

26$albumid= 2637;

27$tags= 'aa';

28extract($_POST);

29$url= 'http://'.$_SERVER['HTTP_HOST'].'/ajax/image.php';

30$fields= array(

31'userid'=> $userid,

32'imageid'=> $imageid,

33'albumid'=> $albumid,

34'tags'=> $tags,

35'optype'=> 'del'

36);

37$ch= curl_init() ;

38curl_setopt($ch, CURLOPT_URL,$url);

39curl_setopt($ch, CURLOPT_POST,true) ;

40curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);

41$result= curl_exec($ch) ;

42curl_close($ch) ;

43

44//上传文件

45$ch= curl_init();

46curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/import.php');

47$fields= array(

48'tname'=> '道德经',

49'country'=> 1,

50'author'=> '老子',

51'tags'=> '道德经',

52'desc'=> '道可道,非常道。名可名,非常名。无名天地之始。有名万物之母。故常无欲以观其妙。常有欲以观其徼。此两者同出而异名,同谓之玄。玄之又玄,众妙之门。',

53'volume'=> 2,

54'cover'=> '@'.realpath('/data/lianhuanhua/deal/1.jpg')

55);

56curl_setopt($ch, CURLOPT_POST, true) ;

57curl_setopt($ch, CURLOPT_POSTFIELDS,$fields) ;

58curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);

59$result= curl_exec($ch);

60curl_close($ch);

61

62//多文件上传

63$ch= curl_init();

64curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/addpic.php');

65$j= 0;

66$fields= array(

67'vid'=> 103,

68'upfile['.$j++.']'=> '@'.realpath('/data/lianhuanhua/deal/1.jpg'),

69'upfile['.$j++.']'=> '@'.realpath('/data/lianhuanhua/deal/2.jpg')

70);

71curl_setopt($ch, CURLOPT_POST, true) ;

72curl_setopt($ch, CURLOPT_POSTFIELDS,$fields) ;

73curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);

74$result= curl_exec($ch);

75curl_close($ch);



  当你掌握了php curl库你就能做很多你想做的事情了,呵呵,前不久玩开心网的X世界,战斗实在繁琐,我直接写了个战斗助手非常好用,本代码就不开源了 :)掌握原理一样开源实现。

网站计数器

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359344-1-1.html 上篇帖子: PHP类实例教程(二十):PHP类接口的实现接口 下篇帖子: PHP中调用Java类的两种方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表