一步一步來作WebQQ機器人-(四)(獲取好友列表和羣列表)

本篇主要是: 獲取好友列表,羣列表javascript

我會盡可能詳細一點,盡我所知的分享一些可能你們已經掌握的或者還不清楚的經驗html

利於你們閱讀,文章樣式再也不復雜化,根據內容取固定色java

目前總進度大概65%

全系列預計會有這些步驟,固然某些步驟可能會合並:

  • 驗證碼
  • 第一次登錄
  • 第二次登錄
  • 保持在線和接收消息
  • 獲取好友和羣列表
  • 發送消息
  • 變成智能的(*゚∀゚*)

        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中拿到)c++

 

  • 地址: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);

 

返回json對象由兩部分組成:retcoderesult,前者表示請求是否成功不提,咱們主要看result,裏面包含了這些東西:web

  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; }
            }
        }
    } 

 

上面返回的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屬性算法

 

  • 地址: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);

 

結構和獲取好友有些相似,不一樣的是:羣的惟一標識是gid,好友的是uin,名稱不一樣。如下是對應的實體類:json

    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; }
            }
        }

    } 

到目前爲止,已經能夠完整的登錄,並保持在線,獲取消息(解析消息還未說明),獲取好友和羣列表

接下來我想對每一篇文章寫上對應的demo,來幫助你們更好的理解整個過程,畢竟文章主要講的是流程,實際操做中可能遇到這種或者那種的問題。

爲以前的文章附上demo,可能會花一點時間,原計劃的每日一更就難實現了...儘可能吧

使用C#模擬http請求能夠參考猛戳這裏c#

您有沒有對這篇文章感興趣呢?api

瀏覽器

 

 

自制QQ分組控件(本身寫的,湊合用=。=):
一步一步來作WebQQ機器人-(四)(獲取好友列表和羣列表):

本步驟的demo,一步一步來作WebQQ機器人-(四)(獲取好友列表和羣列表+自制QQ分組控件),更新於2015/2/5

能夠到該系列最後一篇文章查看是否可能有最新demo

轉載請保留本頁連接:http://www.cnblogs.com/lianmin/p/4237723.html

 

 

 

 

 

.

相關文章
相關標籤/搜索