基于PHP CURL获取邮箱地址的详解
基于PHP CURL获取邮箱地址的详解
发布时间:2016-12-29 来源:查字典编辑
摘要:CURL可谓居家旅行必备之杀人良药,为何如此形容?就是因为他好用方便能实现页面抓取模拟登录采集等一系列功能。记得第一次接触CURL的时候是要...

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><a[^>]*>(.*?)</a></td><td><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教程学习
编程开发子分类