62 |
$url = '
63 |
$headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );
|
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 );
|
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 );
|
建立一个PHP文件复制以上代码保存后效果立竿见影,记得更改邮箱账户和密码,账户不需要@后缀。CURL初体验,如何,还不错吧。 后来在CSDN上又看到别人发帖问一个获取快递查询的问题,他想把一些大的快递公司查询业务做在一个页面中,的确是个很不错的实用小工具,但是因为快递查询有验证码,不由的又让我想起了CURL利器。后来帮帖主实现功能,思路很简单,先用CURL模拟抓取验证码,然后显示到用户提交页面中,同时保存验证码的COOKIE等用户查询一起提交就保证了COOKIE的同步。
源代码如下: -getEms.html
03 |
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
|
04 |
<title>EMS快递查询</title>
|
08 |
fclose(fopen('cookie.txt','w')); //文件 cookie.txt 用于存放取得的cookie |
09 |
$cookiejar = realpath('cookie.txt');
|
10 |
$fp = fopen("example_homepage.txt", "w"); //文件 example_homepage.txt 用于存放取得的页面内容
|
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); |
21 |
//readfile($cookiejar); //查看取到的 cookie |
22 |
//readfile("example_homepage.jpg"); //查看取到的图片 |
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="提交">
|
-getems.php
04 |
$cookiejar = realpath('cookie.txt');
|
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);
|
13 |
preg_match("/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.*)\"\/>/isU",$result,$myEmsbarCode);
|
14 |
preg_match("/<\/span><input name=\"(.*)\" type=\"text\"/isU",$result,$codename);
|
16 |
$parm = array($codename[1]=>$_POST['code'],
|
17 |
mailNum =>$_POST['mailNum'],
|
18 |
myEmsbarCode=>$myEmsbarCode[1],
|
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);
|
29 |
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parm));
|
30 |
$_source = curl_exec($ch);
|
对于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的例子 (摘自网络)
04 |
function isRealUrl($url){
|
08 |
CURLOPT_HEADER => true,
|
09 |
CURLOPT_RETURNTRANSFER => true,
|
10 |
CURLOPT_NOBODY => true
|
12 |
curl_setopt_array($ch, $options);
|
15 |
return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)?true:false;
|
21 |
if(isRealUrl($url)){echo 'yes';}else{echo 'no';}
|
29 |
$url = 'http://'.$_SERVER['HTTP_HOST'].'/ajax/image.php';
|
32 |
'imageid' => $imageid,
|
33 |
'albumid' => $albumid,
|
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) ;
|
52 |
'desc' => '道可道,非常道。名可名,非常名。无名天地之始。有名万物之母。故常无欲以观其妙。常有欲以观其徼。此两者同出而异名,同谓之玄。玄之又玄,众妙之门。',
|
54 |
'cover' => '@'.realpath('/data/lianhuanhua/deal/1.jpg')
|
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);
|
68 |
'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/1.jpg'),
|
69 |
'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/2.jpg')
|
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);
|
当你掌握了php curl库你就能做很多你想做的事情了,呵呵,前不久玩开心网的X世界,战斗实在繁琐,我直接写了个战斗助手非常好用,本代码就不开源了 :)掌握原理一样开源实现。
博客已经搬家,请访问如下地址:http://www.czhphp.com
|