一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)

×

本篇主要是: 获取好友列表,群列表

我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验

利于大家阅读,文章样式不再复杂化,根据内容取固定色

目前总进度大概65%

全系列预计会有这些步骤,当然某些步骤可能会合并:

  • 验证码
  • 第一次登陆
  • 第二次登陆
  • 保持在线和接收消息
  • 获取好友和群列表
  • 发送消息
  • 变成智能的(*?∀?*)

获取好友 1-获取QQ好友的hash算法

        P = function (b, j) {
            for (var a = j + "password error", i = "", E = []; ;)
                if (i.length <= a.length) {
                    if (i += b, i.length == a.length) break;
                } else {
                    i = i.slice(0, a.length);
                    break
                }
            for (var c = 0; c < i.length; c++) E[c] = i.charCodeAt(c) ^ a.charCodeAt(c);
            a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
            i = "";
            for (c = 0; c < E.length; c++) i += a[E[c] >> 4 & 15], i += a[E[c] & 15];
            return i
        }

传入了2个参数:QQ号码ptwebqq(文章2中从cookie中拿到)

获取好友 2-请求

  • 地址:http://s.web2.qq.com/api/get_user_friends2
  • referer:http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1
  • post字符串:string.Format("r={{\"vfwebqq\":\"{0}\",\"hash\":\"{1}\"}}", this.VfWebQQ, this.Hash);

获取好友 3-返回和分析

返回json对象由两部分组成:retcoderesult,前者表示请求是否成功不提,我们主要看result,里面包含了这些东西:

  1. categories,分类,即你的QQ好友分组,index可以看做分组表的主键sort排序,name该组的别名。《我的好友》分组默认是index:0
  2. friends好友,flag表示默认头像序号,后文同不提,uin是贯穿全文的参数,是在网页关闭前,浏览器客户端的唯一标识categories对应上面分组信息
  3. info 储存了好友的信息--昵称nickuin对应唯一标识
  4. marknames 备注名称,同样uin对应唯一标识,markname对应备注名称,这里要说的是,如果没有备注,在这里是不显示的
  5. vipinfo,vip信息,无用

我建立了一个类去用于反序列化它

class JsonFriendModel
    {
        public int retcode { get; set; }

        public paramResult result = new paramResult();

        public class paramResult
        {
            ///
            /// 分组信息
            ///
            public List categories = new List();
            ///
            /// 好友汇总
            ///
            public List friends = new List();
            ///
            /// 好友信息
            ///
            public List info = new List();
            ///
            /// 备注
            ///
            public List marknames = new List();

            ///
            /// 分组
            ///
            public class paramCategories
            {
                public string index { get; set; }

                public int sort { get; set; }

                public string name { get; set; }
            }
            ///
            /// 好友汇总
            ///
            public class paramFriends
            {
                public string flag { get; set; }

                public string uin { get; set; }

                public string categories { get; set; }
            }
            ///
            /// 好友信息
            ///
            public class paramInfo
            {
                public string face { get; set; }

                public string nick { get; set; }

                public string uin { get; set; }
            }
            ///
            /// 备注
            ///
            public class paramMarkNames
            {
                public string uin { get; set; }

                public string markname { get; set; }
            }
        }
    }

小扩展 linq中的left join 左查询

上面返回的result信息,包含了4个对象,互相使用uin或者其它进行关联,使用for循环固然可以,当然有更漂亮的方法也会跟大家分享一下,如果写的不好也请大家多提意见:

            var query = from f in model.result.friends
                        join i in model.result.info on f.uin equals i.uin into table1
                        from t1 in table1.DefaultIfEmpty()
                        join m in model.result.marknames on f.uin equals m.uin into table2
                        from t2 in table2.DefaultIfEmpty()
                        select new Friend()
                        {
                            Uin = f.uin,
                            Face = t1 == null ? string.Empty : t1.face,
                            Category = f.categories,
                            Nick = t1 == null ? string.Empty : t1.nick,
                            MarkName = t2 == null ? string.Empty : t2.markname
                        };

以上是使用了left join 多表进行关联查询,model即对应了返回json的result属性

获取群 1-请求信息

  • 地址:http://s.web2.qq.com/api/get_group_name_list_mask2
  • referer:http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1
  • post字符串:string.Format("r={{\"vfwebqq\":\"{0}\",\"hash\":\"{1}\"}}", this.VfWebQQ, this.Hash);

获取群 2-返回信息

结构和获取好友有些类似,不同的是:群的唯一标识是gid,好友的是uin,名称不同。以下是对应的实体类:

    class JsonGroupModel
    {
        public int retcode { get; set; }

        public paramResult result = new paramResult();

        public class paramResult
        {
            public List gnamelist = new List();

            public class paramGnamelist
            {
                public string flag { get; set; }

                public string gid { get; set; }

                public string code { get; set; }

                public string name { get; set; }
            }
        }

    }

×Close

到目前为止,已经可以完整的登陆,并保持在线,获取消息(解析消息还未说明),获取好友和群列表

接下来我想对每一篇文章写上对应的demo,来帮助大家更好的理解整个过程,毕竟文章主要讲的是流程,实际操作中可能遇到这种或者那种的问题。

为之前的文章附上demo,可能会花一点时间,原计划的每日一更就难实现了...尽量吧

使用C#模拟http请求可以参考猛戳这里

您有没有对这篇文章感兴趣呢?

还好啦 WQNMLGB

.

时间: 2024-08-06 05:11:33

一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)的相关文章

一步一步来做WebQQ机器人-(五)(发送消息||完结)

× 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个demo我已经上传到对应页面的尾部,剩下的会抽时间补,外包经常加班且没外网,尽量本周弄完 目前总进度大概100% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) 回顾基础 一般抓包模拟请求的方

一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)

× 本篇的目的是让你的QQ真正的上线:挤下你的PCQQ,和让好友状态栏显示webqq在线 目前总进度大概50% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) 第二次登陆 真正的在线,挤下PCQQ.WebQQ在线状态 首先看看这个请求 请求报文分析 referer是不可少的,先告诉TX的服务器请求是来自于这里:http://d.web2.qq.com/proxy.html?v=201309

一步一步来做WebQQ机器人-(二)(第一次登陆)

预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) webqq的登陆,分为2步,本文主要讲第一次登陆 加密 对密码加密处理得到P参数 截止到现在,加密方式是这样的: var hexcase = 1; var b64pad = ""; var chrsz = 8; var mode = 32; function md5(A) { return hex_md5(A) } function he

一步一步来做WebQQ机器人-(一)(验证码)

× Well done! 为了探究webqq的http请求流程和数据交互,我付出了很多心血. 写下这篇文章!!!这是我逝去的青春 系列写完之后我会把源码打包奉上~ ------我的征途是星辰大海 一. 进入webqq页面 二. 检查是否需要验证码 对这个页面先get一次,保存下cookie 在用户输入完QQ号之后,会触发一个http请求,用来检测该账号是否需要验证码. 请求地址: "https://ssl.ptlogin2.qq.com/check?uin=" + QQNum + &q

web开发之web 验证码--- webqq 机器人

一步一步来做WebQQ机器人-(一)(验证码) http://www.cnblogs.com/lianmin/p/4231340.html http://www.cnblogs.com/liulun/p/4234745.html cbs(client+ broser +service)

自己动手做聊天机器人教程

自己动手做聊天机器人 一-涉及知识(2016-06-09) 自己动手做聊天机器人 二-初识NLTK库(2016-06-10) 自己动手做聊天机器人 三-语料与词汇资源(2016-06-12) 自己动手做聊天机器人 四-何须动手?完全自动化对语料做词性标注(2016-06-17) 自己动手做聊天机器人 五-自然语言处理中的文本分类(2016-06-21) 自己动手做聊天机器人 六-教你怎么从一句话里提取出十句话的信息(2016-06-22) 自己动手做聊天机器人 七-文法分析还是基于特征好啊(20

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

一步一步带你做WebApi迁移ASP.NET Core2.0

随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP.NET Core 是新一代的 ASP.NET,第一次出现时的代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,这表明它已不是 ASP.NET 的升级,而是一个重新设计的Web开发框架.而它一个非常重要的变化就是它不再依赖于I

一步一步学习Vue(十一)

本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var list = []; var Todo = (function () { var id = 1; return function (title, desc) { this.title = title; this.desc = desc; this.id = id++; } })(); /** *