`
tdwm
  • 浏览: 50018 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php获取qq邮箱用户好友的方法

阅读更多

此方法应用 jinhao7773   的blog中的方法

使用Python模拟登录QQ邮箱获取QQ好友列表

代码于2010年6月3日1:07:42 更新。

我用php做了改写,可能有不完善的地方。

 

附件中有代码,

主要的类为class.qqhttp.php

 

<?php
/** 
* @file class.qqhttp.php
* qq邮箱登陆获取类
* @author wc<cao8222@gmail.com>
* @date 2009-04-27
 */

class QQHttp {

    var $cookie = '';

    function __cunstrut() {
    }

    function makeForm() {
        $form = array(
            'url' => "http://mail.qq.com/cgi-bin/loginpage",
        );
        $data = $this->curlFunc($form);
        preg_match('/name="ts"\svalue="(\d+)"/',$data['html'], $tspre);
        $ts = $tspre[1];
        preg_match('/action="http:\/\/(m\d+)\.mail\.qq\.com/',$data['html'], $server);
        $server_no = $server[1];

        /*  login.html 载入 */
        $html = file_get_contents(dirname(__FILE__).'/login.htm');
        $html = str_replace('{_ts_}',$ts, $html);
        $html = str_replace('{_server_no_}',$server_no, $html);
        return $html;
    }

    function curlFunc($array)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $array['url']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if( isset($array['header']) && $array['header'] ) {
            curl_setopt($ch, CURLOPT_HEADER, 1);
        }
        if(isset($array['httpheader'])) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $array['httpheader']);
        }
        if(isset($array['referer'])) {
            curl_setopt($ch, CURLOPT_REFERER, $array['referer']);
        }
        if( isset($array['post']) ) {
            curl_setopt($ch, CURLOPT_POST, 1 );
            curl_setopt($ch, CURLOPT_POSTFIELDS, $array['post']);
        }
        if( isset($array['cookie']) ){
            curl_setopt($ch, CURLOPT_COOKIE, $array['cookie']);
        }
        $r['erro'] = curl_error($ch);
        $r['errno'] = curl_errno($ch);
        $r['html'] = curl_exec($ch);
        $r['http_code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $r;
    }

    /** 
     * 获取验证码图片和cookie
     * @param Null
     * 
     * @return array('img'=>String, 'cookie'=>String)
     */
    function getVFCode () 
    {
        $t = 'http://m127.mail.qq.com/cgi-bin/getverifyimage?aid=23000101&0.8881121444410955';
        $t = 'ttp://mail.qq.com/cgi-bin/getinvestigate?t=loginpage&stat=verifyimg&verifyuser=49450402';
        $vfcode = array(
            'header' => true,
            'cookie' => false,
            'url'=>'http://'.$_GET['server_no'].'.mail.qq.com/cgi-bin/getverifyimage?aid='.$_GET['aid'].'&'.@$_GET['t'],
        );
        //var_dump($vfcode);

        $r = $this->curlFunc($vfcode);
        if ($r['http_code'] != 200 ) return false;
        $data = split("\n", $r['html']);
        //var_dump($data);exit;
        preg_match('/verifyimagesession=([^;]+);/',$data[7], $temp);
        $cookie = trim($temp[1]);
        $img = $data[11];
        return  array('img'=>$img,'cookie'=>$cookie, 'data'=>$data);
    }

    /** 
     * 登陆qq邮箱
     * 
     * @param $cookie getvfcode中生成的cookie
     * 
     * @return array(
     *   sid=>String , //用户认证的唯一标示
     *   login => Boolean, //true 登陆成功 ,false 登陆失败
     *   server_no => String // 服务器编号
     *   active => Boolean //true 已开通 ,false 未开通 邮箱
     *   cookie => String // 获取数据cookie
     *
     * );
     */
    function login($cookie) 
    {
        /* 生成参数字符串 */
        $post = array();
        foreach($_POST as $k => $v) {
            $post[] = $k.'='.urlencode($v);
        }
        $poststr = implode('&',$post);
        $r['server_no'] = $_GET['server_no'];

        $login = array(
            'url'=>'http://'.$r['server_no'].'.mail.qq.com/cgi-bin/login?sid=0,2,zh_CN',
            'header' => true,
            'cookie' => 'verifyimagesession='.$cookie,
            'referer' => 'http://mail.qq.com/cgi-bin/loginpage',
            'httpheader'=>array(
                "Host: " . $r['server_no'] . '.mail.qq.com',
                "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
                "Content-Type: application/x-www-form-urlencoded",
            ),
            'post' => $poststr ,
        );
        $data = $this->curlFunc($login);
        $data['html'] = iconv("gb2312", "UTF-8", $data['html']);
        if ($data['http_code'] != 200) {
            $this->error($data);
            return false;
        }

       // var_dump(str_replace('script','',$data));exit;
        /* 测试数据 */
        //$data['html'] =file_get_contents('./r.txt');
        $r['uin'] = $_POST['uin'];
        /* 登陆错误的判断 */
        if (preg_match('|errtype=(\d)|', $data['html'], $temp_err)) {
            $r['login'] = false;
            if ($temp_err[1] == 1) {
                $r['msg'] = '账号和密码错误';
            } elseif ($temp_err[1] == 2) {
                $r['msg'] = '验证码错误';
            }
            return $r;
        }
        /* 登陆成功 */
        preg_match('|urlHead="([^"]+)"|i',$data['html'],$temp_url);
        $urlhead = $temp_url[1];
        if (preg_match('|frame_html\?sid=([^"]+)"|i',$data['html'],$temp_sid) ) {
            $r['sid'] = $temp_sid[1];
            $r['active'] = true;
        } elseif (preg_match('|autoactivation\?sid=([^&]+)?&|i',$data['html'],$temp_sid) ) {
            $r['sid'] = $temp_sid[1];
            $r['active'] = false;
        }
        /* 登录后cookie的获取 ,在后续操作中用到 */
        if (preg_match_all('|Set-Cookie:([^=]+=[^;]+)|i', $data['html'], $new_cookies) ) {
            $cookiestr = implode('; ', $new_cookies[1]);
            $cookiestr .= '; verifyimagesession='.$cookie;
        }

        $r['login'] = true;
        $r['cookie'] = $cookiestr;
        return $r;
    }

    function openEmail($param) 
    {
        $openEmail = array(
            'url'=>'http://'.$param['server_no'].'.mail.qq.com/cgi-bin/autoactivation?actmode=6&sid='.$param['sid'],
            'header' => true,
            'cookie' => $param['cookie'],
            'referer' => 'http://'.$param['server_no'].'mail.qq.com/cgi-bin/autoactivation?sid='.$param['sid'].'&action=reg_activate&actmode=6', 
            'httpheader'=>array(
                "Host: " . $param['server_no'] . '.mail.qq.com',
                'Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7',
                "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
            ),
        );

        $data =  $this->curlFunc($openEmail);
        if (preg_match('|Set-Cookie:qqmail_activated=0|i', $data['html'])) {
            $param['active'] = true;
            $param['cookie'] = $param['cookie'] .'; qqmail_activated=0; qqmail_alias=';
        }
        return $param;
    }

    /** 
     * 
     * 获取friends数据 
     * 
     * @param $param = array(
     *   sid=>String , //用户认证的唯一标示
     *   login => Boolean, //true 登陆成功 ,false 登陆失败
     *   server_no => String // 服务器编号
     *   active => Boolean //true 已开通 ,false 未开通 邮箱
     *   cookie => String // 获取数据cookie
     *
     * );
     * @return Array(
     *   key=>value, // key:qq号,value: nickname
     * );
     */
    function getFriends($param)
    {

        $friend = array(
            'url'=>'http://'.$param['server_no'].'.mail.qq.com/cgi-bin/addr_listall?type=user&&category=all&sid='.$param['sid'],
            'header' => true,
            'cookie' => $param['cookie'],
            'referer' => 'http://m151.mail.qq.com/cgi-bin/addr_listall?sid='.$param['sid'].'&sorttype=null&category=common',
            'httpheader'=>array(
                "Host: " . $param['server_no'] . '.mail.qq.com',
                'Accept-Charset:utf-8;q=0.7,*;q=0.7',
                "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
            ),
        );
        $r = $this->curlFunc($friend);
        if ($r['http_code'] != 200) {
            $this->error($r);
            return false;
        }
        $data =  $r['html'];
        $preg = preg_match_all('|<p class="L_n"><span t="1" u="(\d+)" n="([^"]+)" e="([^"]+)">|i', $data, $temp_list);
        if ($preg == 0) return array();
        $list = array_combine($temp_list[1],$temp_list[2]);
        return $list;
    }

    /** 
     * 错误显示
     * 
     * @param $str array
     * 
     * @return 
     */
    function error($str) {
        $str['html'] = str_replace('script','', $str['html']);
        var_dump($str);
        exit;
    }
}

?>
 

 

 

代码可以下载,最新的

 

 

 

 

  • qq.rar (13 KB)
  • 下载次数: 658
分享到:
评论
7 楼 owner888 2009-12-25  
验证码错误是是么原因,看着没错,怎么输都错
6 楼 wengbin22 2009-07-23  
楼主收我为徒吧!!我很诚心的!!!楼主!!!!!
5 楼 GT07 2009-05-25  
有个开源的第三方类库snoopy.class.php可以实现模拟浏览器登陆抓取网页,这个类也可以从wordpress源代码里面找到。
4 楼 tdwm 2009-04-29  
kaki 写道

和开心网上的方法是不是一样的?现在这个很流行哦!

开心的我不清楚啊,据jinhao7773推测,海内的可能是用这种方法
3 楼 tdwm 2009-04-29  
七月十五 写道

个人感觉以抓取页面的方法来获取一些信息,费时费力,又不能保证持久有效,姑息之策。
万一哪天人家不高兴,换了个网页模板,或是用了一些加密技术,又不能用了。
但是在各“大”应用商没有共享相应API之前,只能这么痛苦着。

是啊,有很多im都提供了api就是qq很另类,没有办法啊
2 楼 七月十五 2009-04-28  
个人感觉以抓取页面的方法来获取一些信息,费时费力,又不能保证持久有效,姑息之策。
万一哪天人家不高兴,换了个网页模板,或是用了一些加密技术,又不能用了。
但是在各“大”应用商没有共享相应API之前,只能这么痛苦着。
1 楼 kaki 2009-04-27  
和开心网上的方法是不是一样的?现在这个很流行哦!

相关推荐

    php获取邮箱email好友

    在PHP编程中,获取邮箱Email好友是一个常见的需求,特别是在开发社交网络或邮件营销应用时。这个任务涉及到与各种邮箱服务提供商的API交互,以便获取用户的联系人列表。在这个场景下,我们关注的是Yahoo、Google...

    PHP CURL QQ好友邀请 QQ邮箱登录

    本案例聚焦于使用PHP和cURL实现QQ邮箱登录并邀请QQ好友的功能,这是一个涉及Web自动化和API交互的重要应用场景。 首先,让我们深入理解PHP中的cURL库。cURL(Client URL Library)是一个强大的工具,允许开发者在...

    最新获取GMAIL 163 QQ(有验证码) SINA MSN 邮箱列表 (2011-10-12)

    === 最新获取 GMAIL 163 QQ(含图片验证码) SINA MSN 好友邮箱列表 (2011-10-12) === 欢迎访问我们的平台 http://t.cn/aNsQmD 在“邀请好友” 里有实例的 为了实现这个几个功能,我在百度上搜索了很多实例, 可是...

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

    完成登录操作后,代码通过另一个CURL会话去访问邮箱好友列表。这次访问同样通过设置各种CURLOPT选项来完成,包括URL、HTTP头部等。 需要注意的是,代码示例中的登录方式可能受到163邮箱的保护策略影响,实际应用中...

    五种方法快速查找对方IP地址

    许多即时通讯软件如QQ、Skype等,通常会显示与你聊天的用户的状态信息,其中包括他们的在线IP地址。只需查看对方的在线状态详情,就能找到IP地址。 5. **网络共享服务**: 当双方共享文件或使用P2P软件时,系统...

    PHP支付接口WAP版源码,微信个人收款二维码+支付宝收款,支付宝即时到账免签约接口.rar

    1、邮件提醒+手机短信提醒{手机邮箱开启短信提示功能即可},特别增强对将QQ邮箱设置为订单发件箱的支持;邮件标题进一步优化,显示订单编号、姓名(会员名)、联系电话 2、产品套餐选择支持单选、复选、下拉选择,...

    WFPHP订单系统 WAP手机版 v2.0.zip

    1、邮件提醒 手机短信提醒{手机邮箱开启短信提示功能即可},特别增强对将QQ邮箱设置为订单发件箱的支持;邮件标题进一步优化,显示订单编号、姓名(会员名)、联系电话 2、产品套餐选择支持单选、复选、下拉选择,...

    支付宝+微信竞价单页订单系统自适应手机端源码

    3.带邮件提醒+手机短信提醒{手机邮箱开启短信提示功能即可},特别增强对将 QQ 邮箱设置为订单发件箱的支持;邮件标题进一步优化,显示订单编号、姓名、联系电话 4.产品套餐选择支持单选、复选、下拉选择,迎合亲们的...

    H5竞价单页网站源码带订单系统

    3.带邮件提醒+手机短信提醒{手机邮箱开启短信提示功能即可},特别增强对将QQ邮箱设置为订单发件箱的支持;邮件标题进一步优化,显示订单编号、姓名、联系电话 4.产品套餐选择支持单选、复选、下拉选择,迎合亲们的...

    驴友社交系统(实用1).zip

    此外,系统还支持用户添加好友,构建自己的社交网络,以便于分享和接收来自朋友的信息。 动态发布与浏览是社交系统的核心部分。用户可以发布文字、图片、视频等形式的动态,分享旅行中的点滴,同时也可以查看和评论...

    WFPHP订单系统纯WAP手机版

    1、邮件提醒+手机短信提醒{手机邮箱开启短信提示功能即可},特别增强对将QQ邮箱设置为订单发件箱的支持;邮件标题进一步优化,显示订单编号、姓名(会员名)、联系电话 2、产品套餐选择支持单选、复选、下拉选择,...

    Shopnc b2b2c 好商城V5 33hao-V5完整源码.zip

    商家后台增加实体店经纬度获取坐标功能 √ 商家填写经纬度获取坐标后,手机端用户可在店铺街查看商家具体坐标。 商家后台PC成交情况 √ 商家后台显示今日和昨日PC客单价、成交额、子订单数 商家账户冻结资金 √ ...

    Discuz! X2 R20120628 简体UTF-8.zip

    FIX QQ互联暴露匿名帖用户信息的问题 FIX 专题模块可使用字段说明文字错误 FIX 密码偿试次数限制修改回原来的IP验证模式 FIX 存档后主题分页出错时的兼容处理 FIX DIY模块调取含有$和\...

    交友相亲社交网站模板支持手机wap版

    获取Love币 我的积分 积分帐单明细 我的资料 基本资料 内心独白 详细资料 个性展示 联系方法 我的日记 我的日记 发表日记 日记收藏 评论管理 我发的评论 爱情诊所 我的病历 挂号看病 病历收藏 处方管理 我开的...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

Global site tag (gtag.js) - Google Analytics