一,分析

1,群数据获取

当访问http://qun.qq.com/air/#mygroup我们通过Fiddler可以查看到QQ群列表是从http://qun.qq.com/air/group/mine?w=a这个URL获取到的群列表信息

其中返回的json数据,json构成如下

从上面我们可以看出c包含的是群列表信息,r包含的是服务器的信息,其中c的某一项构成如下图所示

aaarticlea/png;base64,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" alt="" />

从上面可以看出项名称就是群号,owner为所有者,name为群名称,memo群描述,brief为群公告信息,还有其他的一些信息,大家自己去匹配,我这里就不一一解释了.

2, 单个群的成员获取,在上面我们分析了如何获取群列表,下面我们将分析如何取得单个群成员的数据 
      当我们点开某个群可以看到有查看通讯录的选项 
      
     此时我们通过Fiddler监视可以发现,群成员信息,通过如下地址取得 
            
    但是我经过几次点击测试,发现URL参数规则如下 
       
      贴出参数构造规则

const string groupMemberUrl = "http://qun.qq.com/air/{0}/addr/index/type/1/p/{1}?w=n&_={2}";
string memberURL = string.Format(groupMemberUrl, gInfo.Number, page, JavascriptAction.Random());
  我们按照这样的地址去请求,就会得到QQ群成员的HTML,然后我在解析HTML就可以得到相应的数据了

二,实现 

1, 获取群列表

        public List<GroupInfo> GetGroupInfos()
        {
            if (!isLogin) Login();
            List<GroupInfo> giList = new List<GroupInfo>();
            string json = GetWebData<string>(string.Format(groupListUrl, JavascriptAction.Random()));
            try
            {
                var jsonObj = JavaScriptEngine.Run("var m=" + json + ";m.c") as Dictionary<string, object>;
                foreach (var key in jsonObj.Keys)
                {
                    var gi = (jsonObj[key] as Dictionary<string, object>);
                    if (!gi.ContainsKey("owner")) continue;
                    string owner = gi["owner"].ToString();
                    string name = gi["name"].ToString();
                    string max_member = gi["max_member"].ToString();
                    string create_time = gi["create_time"].ToString();
                    string notice = gi["brief"].ToString();
                    string number = key;
                    string memo = gi["memo"].ToString();
                    giList.Add(new GroupInfo()
                    {
                        CreateTime = JavascriptAction.GetTimeByJsTime(Convert.ToInt64(create_time)),
                        MaxNumber = Convert.ToInt32(max_member),
                        Memo = memo,
                        Name = name,
                        Notice = notice,
                        Number = number,
                        Owner = owner
                    });
                }
            }
            catch { }
            return giList;
        }

上面的函数实现了群列表的获取,需要说明的是获取到的json是同过javascript引擎来运行的,javascript运行我通过Javascript .NET(http://javascriptdotnet.codeplex.com/releases/view/52449)来实现的,获取web数据参考我的blog的另外的文章,文章有实现源代码,至于登陆我最后会说明

2, 获取群成员

        public List<QQGroupMemberInfo> GetMemberInfo(GroupInfo gInfo)
        {
            if (!isLogin) Login();
            List<QQGroupMemberInfo> gmis = new List<QQGroupMemberInfo>();
            int page = 1;
            int pageCount = 0;
        GETMEMBER:
            string memberURL = string.Format(groupMemberUrl, gInfo.Number, page, JavascriptAction.Random());
            string html = GetWebData<string>(memberURL);
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            if (pageCount < 1)
            {
                var seeBtn = doc.DocumentNode.SelectSingleNode(pageBtnPath);
                pageCount = Convert.ToInt32(seeBtn.Attributes["allpage"].Value);
            }
            var trs = doc.DocumentNode.SelectNodes(memberTrPath);
            foreach (var tr in trs)
            {
                var tds = tr.Descendants("td").ToList();
                if (tds.Count < 1) continue;
                string groupNick = tds[1].Element("a").InnerText.Trim();
                string qq = tds[2].Element("span").InnerText.Trim();
                gmis.Add(new QQGroupMemberInfo()
                {
                    NickName = groupNick,
                    QQ = qq
                });
            }
            if (page < pageCount)
            {
                page++;
                goto GETMEMBER;
            }
            return gmis;
        }

上面的函数实现了群成员的获取,其中HTML的解析式通过HtmlAgilityPack(http://htmlagilitypack.codeplex.com/)来实现,HtmlAgilityPack通过XPATH语法去解析实现的,关于xpath不是很难,大家查查资料就会了 
   3,关于登陆的实现 
     QQweb端的登陆有两种实现,第一种是web登陆,通过http://ui.ptlogin2.qq.com/cgi-bin/login?link_target=blank&appid=15000101&hide_title_bar=1&s_url=http%3A%2F%2Fim.qq.com%2Floginproxy.html%3Flogin_level%3D2&f_url=loginerroralert&target=self这样的URL实现来实现登陆,具体的实现原理,我前面有文章描述过了,这里就不罗嗦了,把类贴出来供大家参考

    public class LoginQQ : WebPageAction, ILogin, IValidateCodeAction
    {
        static JavaScriptEngine _javaEngine = new JavaScriptEngine();
        static bool _isInitJava = false;
        Random _r = new Random();
        const string loginFormUrl = "http://ui.ptlogin2.qq.com/cgi-bin/login?link_target=blank&appid=15000101&hide_title_bar=1&s_url=http%3A%2F%2Fim.qq.com%2Floginproxy.html%3Flogin_level%3D2&f_url=loginerroralert&target=self";
        private User User { get; set; }
        string _qq = "";
        public LoginQQ(CookieManager cookieManager, User user)
            : base(user.UserName)
        {
            _cookieManager = cookieManager;
            User = user;
            _qq = user.UserName.Split('@')[0];
            if (!_isInitJava)
            {
                _javaEngine.Run(System.IO.File.ReadAllText(@"JavaScript\qq\md5_3.js"));
                _isInitJava = true;
            }
        }
 
        public override JavaScriptEngine JavaScriptEngine
        {
            get
            {
                return _javaEngine;
            }
            set
            {
                _javaEngine = value;
            }
        }
 
        string vc_type = "";
        public bool Login(string referer)
        {
            DateTime beginTime = DateTime.Now;
            string html = "";
            html = GetWebData<string>(loginFormUrl);
            if (!regForm.IsMatch(html))
                ThrowException(507, html);
            var form = GetFormDataByFormHtml(regForm.Match(html).Value);
            string url = "http://ptlogin2.qq.com/check?uin=" + _qq + "&appid=15000101&" + JavascriptAction.Random();
            html = GetWebData<string>(url, referer: loginFormUrl);
            string vcode = "";
            if (html.Contains("ptui_checkVC('1','"))
            {
                vc_type = html.Replace("ptui_checkVC('1','", "").Replace("'", "").Replace(")", "").Replace(";", "");
                form = new NameValueCollection();
                if (!ValidationImageCode(form, loginFormUrl)) { return false; };
                vcode = form["verifycode"];
            }
            else if (html.Contains("ptui_checkVC('0','"))
            {
                vcode = html.Replace("ptui_checkVC('0','", "").Replace("'", "").Replace(")", "").Replace(";", "");
            }
            TimeSpan _tspan = TimeSpan.FromTicks(DateTime.Now.Ticks - beginTime.Ticks);
            if (_tspan.Seconds < 20)
                Thread.Sleep(TimeSpan.FromSeconds(_r.Next(20 - _tspan.Seconds, 30)));
            string pMd5 = GetPwdString(User.Pwd, vcode);
            string action = "0-0" + "-" + (JavascriptAction.GetTime(DateTime.Now) - JavascriptAction.GetTime(beginTime));
            url = "http://ptlogin2.qq.com/login?u=" + _qq + "&p=" + pMd5 + "&verifycode=" + vcode + "&aid=15000101&u1=http%3A%2F%2Fim.qq.com%2Floginproxy.html%3Flogin_level%3D2&h=1&ptredirect=0&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert&action=" + action + "&mibao_css=";
            html = GetWebData<string>(url, referer: loginFormUrl);
            if (html.Contains("登录成功"))
            {
                return true;
            }
            return false;
        }
 
        private string GetPwdString(string pwd, string vcode)
        {
            string script = "md5(md5_3('" + pwd + "') + '" + vcode + "')";
            return JavaScriptEngine.Run(script).ToString();
        }
 
        public bool ValidateLogin(string referer)
        {
            var cks = _cookieManager.GetCookies(new Uri(referer).Host);
            if (cks["uin"] != null && cks["skey"] != null)
            {
                return true;
            }
            return false;
        }
 
        public bool ValidationCode(string code, string referer)
        {
            return true;
        }
 
        public Image GetValidateCode(string referer)
        {
            string url = "http://captcha.qq.com/getimage?aid=15000101&r=" + JavascriptAction.Random() + "&uin=" + _qq + "&vc_type=" + vc_type;
            return GetWebData<Image>(url, referer: referer);
        }
 
        public bool ValidationImageCode(NameValueCollection customFormItems, string referer)
        {
            ValidateReturn code = null;
            do
            {
                Image image = GetValidateCode(referer);
                code = this.FireValidateCode(image);
                if (code.IsCancel)
                {
                    return false;
                }
                if (customFormItems.AllKeys.Contains("verifycode"))
                {
                    customFormItems.Remove("verifycode");
                }
                customFormItems.Add("verifycode", code.Code);
            }
            while (code.IsChange || !ValidationCode(code.Code, referer));
            return true;
        }
 
 
    }

第二种就是从客户端点击,如QQ空间按钮,客户端会调用浏览器跳转

http://ptlogin2.qq.com/jump?ptlang=2052&clientuin=442799037&clientkey=687E58BB1B99061A S62F0C751CF1763F1A8EEA3E8F2AF52B7956193D947F78B6&u1=http%3A%2F%2Fuser.qzone.qq.com%2F442799037%2Finfocenter&ADUIN=442799037&ADSESSION=1335488190&ADTAG=CLIENT.QQ.3187_Mysrv.0这样的地址,通过这个URL实现登陆,那么我们只需要HOOK ShellExecuteExW这个入口点就可以实现URL的截取,关于钩子如何实现,我前面有文章已说过,同样贴上代码供大家参考

    public class ClientQQWebction : WebPageAction, IDisposable
    {
        const string loginUrl = "http://ptlogin2.qq.com/jump?ptlang={2}&clientuin={0}&clientkey={1}&u1={3}";
        const string getEmail = "http://accountadm.qq.com/cgi-bin/account/ajaxgetmail?uin={0}";
        const string groupListUrl = "http://qun.qq.com/air/group/mine?w=a&_={0}";
        const string groupMemberUrl = "http://qun.qq.com/air/{0}/addr/index/type/1/p/{1}?w=n&_={2}";
        const string pageBtnPath = "//input[@type=\"button\" and @value=\"查看\" and @act=\"gotopage\"]";
        const string memberTrPath = "//table[@class=\"addressList\"]/tr";
 
        CleintKeyInfo _cleintKeyInfo = null;
        bool isLogin = false;
        public ClientQQWebction(CleintKeyInfo cki)
        {
            _cleintKeyInfo = cki;
        }
 
        private void Login()
        {
            string loginURL = string.Format(loginUrl, _cleintKeyInfo.ClientUin, _cleintKeyInfo.ClientKey, _cleintKeyInfo.PtLang, string.Format(getEmail, _cleintKeyInfo.ClientUin));
            var loca = GetWebData<ResponseLocation>(loginURL);
            if (_cookieManager.GetCookies("qq.com")["skey"] != null)
            {
                isLogin = true;
                return;
            }
            throw new Exception("登陆失败");
        }
 
        public string GetEmail()
        {
            if (!isLogin) Login();
            string emailUrl = String.Format(getEmail, _cleintKeyInfo.ClientUin);
            var html = GetWebData<string>(emailUrl);
            if (regEmail.IsMatch(html))
                return regEmail.Match(html).ToString();
            else
                return null;
        }
 
        public List<GroupInfo> GetGroupInfos()
        {
            if (!isLogin) Login();
            List<GroupInfo> giList = new List<GroupInfo>();
            string json = GetWebData<string>(string.Format(groupListUrl, JavascriptAction.Random()));
            try
            {
                var jsonObj = JavaScriptEngine.Run("var m=" + json + ";m.c") as Dictionary<string, object>;
                foreach (var key in jsonObj.Keys)
                {
                    var gi = (jsonObj[key] as Dictionary<string, object>);
                    if (!gi.ContainsKey("owner")) continue;
                    string owner = gi["owner"].ToString();
                    string name = gi["name"].ToString();
                    string max_member = gi["max_member"].ToString();
                    string create_time = gi["create_time"].ToString();
                    string notice = gi["brief"].ToString();
                    string number = key;
                    string memo = gi["memo"].ToString();
                    giList.Add(new GroupInfo()
                    {
                        CreateTime = JavascriptAction.GetTimeByJsTime(Convert.ToInt64(create_time)),
                        MaxNumber = Convert.ToInt32(max_member),
                        Memo = memo,
                        Name = name,
                        Notice = notice,
                        Number = number,
                        Owner = owner
                    });
                }
            }
            catch { }
            return giList;
        }
 
      
        public List<QQGroupMemberInfo> GetMemberInfo(GroupInfo gInfo)
        {
            if (!isLogin) Login();
            List<QQGroupMemberInfo> gmis = new List<QQGroupMemberInfo>();
            int page = 1;
            int pageCount = 0;
        GETMEMBER:
            string memberURL = string.Format(groupMemberUrl, gInfo.Number, page, JavascriptAction.Random());
            string html = GetWebData<string>(memberURL);
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            if (pageCount < 1)
            {
                var seeBtn = doc.DocumentNode.SelectSingleNode(pageBtnPath);
                pageCount = Convert.ToInt32(seeBtn.Attributes["allpage"].Value);
            }
            var trs = doc.DocumentNode.SelectNodes(memberTrPath);
            foreach (var tr in trs)
            {
                var tds = tr.Descendants("td").ToList();
                if (tds.Count < 1) continue;
                string groupNick = tds[1].Element("a").InnerText.Trim();
                string qq = tds[2].Element("span").InnerText.Trim();
                gmis.Add(new QQGroupMemberInfo()
                {
                    NickName = groupNick,
                    QQ = qq
                });
            }
            if (page < pageCount)
            {
                page++;
                goto GETMEMBER;
            }
            return gmis;
        }
 
 
        public void Dispose()
        {
            _cookieManager = null;
 
            JavaScriptEngine = null;
 
        }
    }

OK,到此完成,下篇实现qq好友数据获取

最近失业了,求职中………

QQ 讨论组广告群发工具(已开发完成)索引

转载请注明:http://www.cnblogs.com/Rolends 

C# 获取QQ群数据的实现的更多相关文章

  1. 获取QQ群中的所有群友QQ

    package com.jm.mail.tools; import java.io.BufferedReader; import java.io.IOException; import java.io ...

  2. 使用腾讯开发平台获取QQ用户数据资料

    <今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...

  3. 腾讯QQ群数据下载方法(7000万个qq群资料全泄漏)

    仔细读完一定能找到自己需要的东西 据新华网报道,国内知名安全漏洞监测平台乌云20日公布报告称,腾讯QQ群关系数据被泄露,网上可以轻易就能找到数据下载链接,根据这些数据,通过QQ号可以查询到备注姓名.年 ...

  4. 9 行 javascript 代码获取 QQ 群成员

    昨天看到一条微博:「22 行 JavaScript 代码实现 QQ 群成员提取器」. 本着好奇心点击进去,发现没有达到效果,一是 QQ 版本升级了,二是博客里面的代码也有些繁琐. 于是自己试着写了一个 ...

  5. (获取qq群成员信息,并下载头像,每个群保存一个文件夹)

    # 1.获取到自己qq里面所有的群,并且保存每个群里面的群成员信息到mongodb里面# 下载每个群的群成员的头像# 1.抓包,抓到获取自己所有qq群的接口 requests模块 https://qu ...

  6. PHP获取QQ群成员QQ号码

    .加入某个群 .进入群空间http://qun.qzone.qq.com/group#!/25998059/member 备注:25998059为群号码 .进入群成员列表 .使用浏览,在某个群成员头像 ...

  7. chrome浏览器扩展--QQ群查看器(1)

    QQ群查看器--chrome浏览器扩展 源码及程序下载地址:http://pan.baidu.com/share/link?shareid=3636190804&uk=1678089569 关 ...

  8. 精准营销、批量提取QQ群成员号码

    有时我们在做精准营销时,需要从社群里提取群成员的QQ号,群发邮件,常规的做法是手工一个个复制粘贴,这样的效率无疑是很低的,下面我来分享一个批量获取社群的QQ号方法. 需要具备以下工具: 1.大量精准Q ...

  9. 使用python UIAutomation从QQ2017(v8.9)群界面获取所有群成员详细资料,

    首先安装pip install uiautomation, 运行本文代码.或者下载https://github.com/yinkaisheng/Python-UIAutomation-for-Wind ...

随机推荐

  1. Swagger学习和实践

    Swagger学习和实践 学习了:https://www.cnblogs.com/zxtceq/p/5530396.html swagger 英 [ˈswægə(r)] 美 [ˈswæɡɚ] vi.昂 ...

  2. 安装 - LNMP一键安装包

    https://lnmp.org/ 系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存( ...

  3. [Algorithm] JavaScript Graph Data Structure

    A graph is a data structure comprised of a set of nodes, also known as vertices, and a set of edges. ...

  4. git 强制覆盖,分支合并

    强制合并 git fetch --all && git reset --hard origin/master && git pull 合并代码 git commit - ...

  5. solaris软件管理 FTP

    安装一些常用软件 一.应用程序与系统命令的关系: 系统命令文件位置在 /bin /sbin下面或为shell内部指令:完成对系统的基本管理工作:一般在字符操作界面中运行:一般包括命令字.命令选项和命令 ...

  6. 转载---- 使用opencv源码自己编制android so库的过程

    http://blog.csdn.net/lantishua/article/details/21182965 工作需要,在Android上使用OpenCV.opencv当前的版本(2.4.8)已经有 ...

  7. 无线(仅WIFI)攻击思路总结

    从事信息安全相关工作5年了,虽然主要工作是安全产品售前.安全服务等方向,但既然选择了安全,想必都是有点黑客情节的,因此也前前后后杂七杂八的学了点东西.最近在研究无线(主要是WIFI)安全,相关书籍看了 ...

  8. Linux快捷键和vim快捷键

    系统下常用快捷键   ctrl+左右键      在单词之间跳转 Ctrl + a            光标移动到行首(ahead of line),相当于通常的Home键 Ctrl + e     ...

  9. 使用 sigaction 函数实现可靠信号

    前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便.那就是调用 sigaction ...

  10. launchMode之的几种取值

    Activity的launchMode launchMode之standard   ·标准模式.每次激活Activity时均在当前任务栈中创建新的实例. 在配置文件里把activity节点的属性配置为 ...