php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)


Posted in PHP onApril 07, 2011

CURL技术说白了就是模拟浏览器的动作实现页面抓取或表单提交,通过此技术可以实现许多有去的功能。

<?php 
error_reporting(0); 
//邮箱用户名(不带@163.com后缀的) 
$user = 'papatata_test'; 
//邮箱密码 
$pass = '000000'; 
//目标邮箱 
//$mail_addr = uenucom@163.com'; 
//登陆 
$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'; 
$ch = curl_init($url); 
//创建一个用于存放cookie信息的临时文件 
$cookie = tempnam('.','~'); 
$referer_login = 'http://mail.163.com'; 
//返回结果存放在变量中,而不是默认的直接输出 
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, $referer_login); 
$fields_post = array( 
'username'=> $user, 
'password'=> $pass, 
'verifycookie'=>1, 
'style'=>-1, 
'product'=> 'mail163', 
'selType'=>-1, 
'secure'=>'on' 
); 
$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' 
); 
$fields_string = ''; 
foreach($fields_post as $key => $value) 
{ 
$fields_string .= $key . '=' . $value . '&'; 
} 
$fields_string = rtrim($fields_string , '&'); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
//关闭连接时,将服务器端返回的cookie保存在以下文件中 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
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'; 
$ch = curl_init($url); 
$headers = array( 
'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' 
); 
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); 
//将之前保存的cookie信息,一起发送到服务器端 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
$result = curl_exec($ch); 
curl_close($ch); 
//取得sid 
preg_match('/sid=[^\"].*/', $result, $location); 
$sid = substr($location[0], 4, -1); 
//file_put_contents('./result.txt', $sid); 
//通讯录地址 
$url='http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid='.$sid.'&gid=all'; 
$ch = curl_init($url); 
$headers = array( 
'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' 
); 
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, $cookie); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
$result = curl_exec($ch); 
curl_close($ch); 
//file_put_contents('./result.txt', $result); 
unlink($cookie); 
//开始抓取内容 
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 相关文章推荐
php array_intersect()函数使用代码
Jan 14 PHP
PHP高级OOP技术演示
Aug 27 PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 PHP
PHP文件操作实现代码分享
Sep 01 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
简单谈谈 php 文件锁
Feb 19 PHP
php微信开发之关键词回复功能
Jun 13 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 #PHP
PHP stream_context_create()作用和用法分析
Mar 29 #PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 #PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 #PHP
php中关于普通表单多文件上传的处理方法
Mar 25 #PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 #PHP
PHP学习 变量使用总结
Mar 24 #PHP
You might like
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
学生会主席竞聘书
2014/03/31 职场文书
博士生导师推荐信
2014/07/08 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
通知格式
2015/04/27 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android