PHP的CURL 获取邮箱地址
来源:互联网 发布:知乎 咖喱饭 编辑:程序博客网 时间:2024/05/05 18:21
CURL可谓居家旅行必备之杀人良药,为何如此形容?就是因为他好用方便能实现页面抓取模拟登录采集等一系列功能。
记得第一次接触CURL的时候是要实现完成从邮箱用户列表的抓取。当时为了赶进度没有细细研究只是网上找了一些资料实现了功能。现在把当初的代码整理一下功能依旧能用
01
<?php
09
10
error_reporting
( 0 );
11
set_time_limit ( 0 );
12
header (
"Content-Type: text/html; charset=GB2312"
);
13
14
//邮箱用户名密码
15
$user
=
'username'
;
16
$pass
=
'password'
;
17
18
//创建一个文件用于存放cookie信息
19
define (
"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
);
29
curl_setopt (
$ch
, CURLOPT_RETURNTRANSFER, true );
30
curl_setopt (
$ch
, CURLOPT_HEADER, true );
31
curl_setopt (
$ch
, CURLOPT_CONNECTTIMEOUT, 120 );
32
curl_setopt (
$ch
, CURLOPT_POST, true );
33
curl_setopt (
$ch
, CURLOPT_REFERER,
$refer
);
34
curl_setopt (
$ch
, CURLOPT_COOKIESESSION, true );
35
curl_setopt (
$ch
, CURLOPT_COOKIEJAR, COOKIEJAR );
36
curl_setopt (
$ch
, CURLOPT_HTTPHEADER,
$headers_login
);
37
curl_setopt (
$ch
, CURLOPT_POST,
count
(
$fields
) );
38
curl_setopt (
$ch
, CURLOPT_POSTFIELDS,
$fields_string
);
39
$result
= curl_exec (
$ch
);
40
curl_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
);
47
curl_setopt (
$ch
, CURLOPT_RETURNTRANSFER, true );
48
curl_setopt (
$ch
, CURLOPT_HEADER, true );
49
curl_setopt (
$ch
, CURLOPT_CONNECTTIMEOUT, 120 );
50
curl_setopt (
$ch
, CURLOPT_POST, true );
51
curl_setopt (
$ch
, CURLOPT_HTTPHEADER,
$headers
);
52
curl_setopt (
$ch
, CURLOPT_COOKIEFILE, COOKIEJAR );
53
curl_setopt (
$ch
, CURLOPT_COOKIEJAR, COOKIEJAR );
54
$result
= curl_exec (
$ch
);
55
curl_close (
$ch
);
56
57
//取得sid
58
preg_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
);
66
curl_setopt (
$ch
, CURLOPT_RETURNTRANSFER, true );
67
curl_setopt (
$ch
, CURLOPT_HEADER, true );
68
curl_setopt (
$ch
, CURLOPT_CONNECTTIMEOUT, 120 );
69
curl_setopt (
$ch
, CURLOPT_POST, true );
70
curl_setopt (
$ch
, CURLOPT_HTTPHEADER,
$headers
);
71
curl_setopt (
$ch
, CURLOPT_COOKIEFILE, COOKIEJAR );
72
curl_setopt (
$ch
, CURLOPT_COOKIEJAR, COOKIEJAR );
73
$result
= curl_exec (
$ch
);
74
curl_close (
$ch
);
75
unlink ( COOKIEJAR );
76
77
//开始抓取内容
78
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 );
79
//1:姓名2:邮箱
80
print_r (
$infos
);
81
82
?>
建立一个PHP文件复制以上代码保存后效果立竿见影,记得更改邮箱账户和密码,账户不需要@后缀。CURL初体验,如何,还不错吧。
后来在CSDN上又看到别人发帖问一个获取快递查询的问题,他想把一些大的快递公司查询业务做在一个页面中,的确是个很不错的实用小工具,但是因为快递查询有验证码,不由的又让我想起了CURL利器。后来帮帖主实现功能,思路很简单,先用CURL模拟抓取验证码,然后显示到用户提交页面中,同时保存验证码的COOKIE等用户查询一起提交就保证了COOKIE的同步。
源代码如下:
-getEms.html
01
<
html
>
02
<
head
>
03
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=gb2312"
>
04
<
title
>EMS快递查询</
title
>
05
</
head
>
06
<
body
>
07
<?
php
08
fclose(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");
12
curl_setopt($ch, CURLOPT_FILE, $fp);
13
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
14
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
15
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
16
curl_setopt($ch, CURLOPT_HEADER, 0);
17
curl_exec($ch);
18
curl_close($ch);
19
fclose($fp);
20
21
//readfile($cookiejar); //查看取到的 cookie
22
//readfile("example_homepage.jpg"); //查看取到的图片
23
?>
24
<
form
action
=
"getems.php"
method
=
"post"
name
=
"form1"
>
25
快递号:<
input
name
=
"mailNum"
type
=
"text"
value
=
"EA739701017CS"
/>(13位 首尾2位都是字母)
26
<
input
name
=
"code"
type
=
"text"
value
=
""
/>
27
<?
php
echo "<img
src
=
'example_homepage.txt'
>";?>
28
<
input
type
=
"submit"
value
=
"提交"
>
29
</
form
>
30
31
</
body
>
32
</
html
>
-getems.php
01
<?php
02
if
(
$_POST
){
03
//使用先前验证码的cookie文件
04
$cookiejar
=
realpath
(
'cookie.txt'
);
05
//获取myEmsbarCode号 和验证码变量名
06
$ch
= curl_init(
"http://www.ems.com.cn"
);
07
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, true);
08
curl_setopt(
$ch
, CURLOPT_HEADER, 0);
09
curl_setopt(
$ch
, CURLOPT_COOKIEFILE,
$cookiejar
);
10
curl_setopt(
$ch
, CURLOPT_COOKIEJAR,
$cookiejar
);
11
$result
= curl_exec(
$ch
);
12
curl_close(
$ch
);
13
preg_match(
"/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.*)\"\/>/isU"
,
$result
,
$myEmsbarCode
);
14
preg_match(
"/<\/span><input name=\"(.*)\" type=\"text\"/isU"
,
$result
,
$codename
);
15
16
$parm
=
array
(
$codename
[1]=>
$_POST
[
'code'
],
17
mailNum =>
$_POST
[
'mailNum'
],
18
myEmsbarCode=>
$myEmsbarCode
[1],
19
reqCode=>
'browseBASE'
20
);
21
22
$ch
= curl_init(
"http://www.ems.com.cn/qcgzOutQueryAction.do"
);
23
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, 1);
24
curl_setopt(
$ch
, CURLOPT_HEADER, 0);
25
curl_setopt(
$ch
, CURLOPT_COOKIEFILE,
$cookiejar
);
26
curl_setopt(
$ch
, CURLOPT_COOKIEJAR,
$cookiejar
);
27
curl_setopt(
$ch
, CURLOPT_POST, 1);
28
curl_setopt(
$ch
, CURLOPT_REFERER,
"http://www.ems.com.cn"
);
29
curl_setopt(
$ch
, CURLOPT_POSTFIELDS, http_build_query(
$parm
));
30
$_source
= curl_exec(
$ch
);
31
curl_close(
$ch
);
32
33
//搞定
34
var_dump(
$_source
);
35
exit
;
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
*/
04
function
isRealUrl(
$url
){
05
$ch
= curl_init();
06
$options
=
array
(
07
CURLOPT_URL =>
$url
,
08
CURLOPT_HEADER => true,
09
CURLOPT_RETURNTRANSFER => true,
10
CURLOPT_NOBODY => true
11
);
12
curl_setopt_array(
$ch
,
$options
);
13
curl_exec(
$ch
);
14
if
(!curl_errno(
$ch
)){
15
return
200==curl_getinfo(
$ch
,CURLINFO_HTTP_CODE)?true:false;
16
}
17
curl_close(
$ch
);
18
}
19
20
$url
=
'http://testpic1.tomoimg.cn/240x180/394/855/517932781/200901/12312215602409.jpg'
;
21
if
(isRealUrl(
$url
)){
echo
'yes'
;}
else
{
echo
'no'
;}
22
23
/异步请求的例子:
24
$userid
= 517932781;
25
$imageid
= 1520;
26
$albumid
= 2637;
27
$tags
=
'aa'
;
28
extract(
$_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() ;
38
curl_setopt(
$ch
, CURLOPT_URL,
$url
) ;
39
curl_setopt(
$ch
, CURLOPT_POST,true) ;
40
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$fields
) ;
41
$result
= curl_exec(
$ch
) ;
42
curl_close(
$ch
) ;
43
44
//上传文件
45
$ch
= curl_init();
46
curl_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
);
56
curl_setopt(
$ch
, CURLOPT_POST, true) ;
57
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$fields
) ;
58
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, false);
59
$result
= curl_exec(
$ch
);
60
curl_close(
$ch
);
61
62
//多文件上传
63
$ch
= curl_init();
64
curl_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
);
71
curl_setopt(
$ch
, CURLOPT_POST, true) ;
72
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$fields
) ;
73
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, false);
74
$result
= curl_exec(
$ch
);
75
curl_close(
$ch
);
当你掌握了php curl库你就能做很多你想做的事情了,呵呵,前不久玩开心网的X世界,战斗实在繁琐,我直接写了个战斗助手非常好用,本代码就不开源了 :)掌握原理一样开源实现。
- PHP的CURL 获取邮箱地址
- 获取邮箱地址薄的PHP API
- 获取网页上的邮箱地址
- 对邮箱地址的校验和获取文字里的邮箱地址
- PHP curl 获取响应的状态码
- PHP获取curl传输进度
- php用curl获取sessionid
- PHP CURL POST无法获取响应内容的问题
- php用curl获取163邮箱的联系人
- PHP CURL访问HTTPS获取HTTPS网页源码的函数
- php 中curl获取用户文件的大小
- https php使用curl获取https请求的方法
- php使用CURL不依赖COOKIEJAR获取COOKIE的方法
- PHP通过curl获取接口URL的数据
- 获取邮箱地址代码
- 获取页面所有邮箱地址
- php判断邮箱地址
- PHP的CURL详解
- DB2基本概念 —— 实例、数据库、表空间、容器
- php源码学习笔记之一
- 在Struts2里使用JSON
- jqgrid 事件说明
- 开学一个月学习总结和展望
- PHP的CURL 获取邮箱地址
- mysql中删除完全重复数据的准确SQL语句
- jbpm4的错误汇总
- Weblogic集群介绍 以及简单搭建
- 分配servlet初始化参数
- 代码定位:__FILE__, __FUNCTION__, __LINE__
- ubuntu11.04 修改默认启动顺序
- liunx 常用命令全集
- QMessageBox::about()在系统托盘状态下确定后退出应用程序的解决