基本信息
源码名称:C#模拟QQ登陆,并获取qq好友列表
源码大小:3.29KB
文件格式:.rar
开发语言:C#
更新时间:2013-01-08
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

获取qq好友列表


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 QQFriendInfo GetQQFriendInfo()
    {
        if (!isLogin) Login();
        QQFriendInfo qfi = new QQFriendInfo();
        string friendUrl = string.Format("http://r.cnc.qzone.qq.com/cgi-bin/tfriend/friend_mngfrd_get.cgi?uin={0}", _cleintKeyInfo.ClientUin);
        string jsonF = GetWebData<string>(friendUrl);
        StringBuilder script = new StringBuilder();
        script.AppendLine("function _Callback(o){return o; };");
        script.AppendLine(jsonF);
        var data = JavaScriptEngine.Run(script.ToString()) as Dictionary<string, object>;
        var gpnames = data["gpnames"] as object[];//组信息
        var items = data["items"] as object[];//好友信息
        //遍历组
        foreach (var g in gpnames)
        {
            var gitem = (g as Dictionary<string, object>);
            qfi.GroupInfos.Add(new QQFiendGroup()
            {
                GroupId = int.Parse(gitem["gpid"].ToString()),
                Name = gitem["gpname"].ToString(),
                SortId = int.Parse(gitem["sortid"].ToString())
            });
        }
        //遍历成员
        foreach (var f in items)
        {
            var fitem = (f as Dictionary<string, object>);
            qfi.QQFriends.Add(new QQFriendMember()
            {
                FriendGroupId = int.Parse(fitem["groupid"].ToString()),
                NickName = fitem["name"].ToString(),
                QQ = fitem["uin"].ToString()
            });
        }
        return qfi;
    }

    public void Dispose()
    {
        _cookieManager = null;

        JavaScriptEngine = null;

    }
}

public class QQGroupMemberInfo
{
    public string QQ
    {
        get;
        set;
    }
    public string NickName
    {
        get;
        set;
    }
}

public class GroupInfo
{
    public string Name
    {
        get;
        set;
    }
    public string Number
    {
        get;
        set;
    }
    public string Owner
    {
        get;
        set;
    }
    public int MaxNumber
    {
        get;
        set;
    }
    public string Notice
    {
        get;
        set;
    }
    public string Memo
    {
        get;
        set;
    }
    public DateTime CreateTime
    {
        get;
        set;
    }
}

public class CleintKeyInfo
{
    public string PtLang
    {
        get;
        set;
    }
    public string ClientUin
    {
        get;
        set;
    }
    public string ClientKey
    {
        get;
        set;
    }
}

public class QQGroupGeter : WebPageAction, IDisposable
{
    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";
    LoginQQ _login = null;
    public QQGroupGeter(string qq, string pwd, int sa_id)
    {
        _sa_id = sa_id;
        _login = new LoginQQ(_cookieManager, new User() { UserName = qq, Pwd = pwd });
        _login.OnValidateCode  = new ValidateCodeHandler(_login_OnValidateCode);
    }
    int _sa_id = 0;


    ValidateReturn _login_OnValidateCode(object sender, ValidateCodeEventArgs args)
    {
        Console.WriteLine("需要验证码,取消");
        return new ValidateReturn() { IsCancel = true };
    }

    public void WriteQqGroupMemberInfo()
    {
        int memberCount = QQHelperWeb.GetGroupMemberQQListCount(_sa_id);
        if (!QQHelperWeb.ExistsGroup(_sa_id) || memberCount < 1)
        {
            try
            {
                if (!_login.ValidateLogin("http://www.qq.com/"))
                {
                    if (!_login.Login("http://www.qq.com/"))
                    {
                        return;
                    }
                    if (!_login.ValidateLogin("http://www.qq.com/"))
                    {
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("QQ("   _sa_id   ")登陆失败,错误:"   ex.Message);
                return;
            }
            try
            {
                int totalCount = 0;
                DateTime startTime = DateTime.Now;
                Console.WriteLine("获取付QQ("   _sa_id   ")的群列表信息[读取线程] ");
                var gs = this.GetGroupInfos();
                Console.WriteLine("获取付QQ("   _sa_id   ")的的群列表信息完成,时间:"   TimeSpan.FromTicks(DateTime.Now.Ticks - startTime.Ticks).TotalMilliseconds   "毫秒[读取线程]");
                startTime = DateTime.Now;
                Console.WriteLine("写入QQ("   _sa_id   ")群数据信息[读取线程]");
                QQHelperWeb.WriteGroupList(gs, _sa_id);
                Console.WriteLine("写入QQ("   _sa_id   ")群数据信息完成,时间:"   TimeSpan.FromTicks(DateTime.Now.Ticks - startTime.Ticks).TotalMilliseconds   "毫秒[读取线程]");
                foreach (var gInfo in gs)
                {
                    try
                    {
                        startTime = DateTime.Now;
                        Console.WriteLine("获取付QQ("   _sa_id   ")群["   gInfo.Number   "]的成员[读取线程]");
                        var memList = this.GetMemberInfo(gInfo);
                        Console.WriteLine("获取付QQ("   _sa_id   ")群["   gInfo.Number   "]的成员,时间:"   TimeSpan.FromTicks(DateTime.Now.Ticks - startTime.Ticks).TotalMilliseconds   "毫秒[读取线程]");

                        Console.WriteLine("获取到"   memList.Count   "个[读取线程]");

                        startTime = DateTime.Now;
                        Console.WriteLine("写入付QQ("   _sa_id   ")群["   gInfo.Number   "]的成员数据信息[读取线程]");
                        QQHelperWeb.WriteGroupMemberList(gInfo.Number, memList); Thread.Sleep(200);
                        Console.WriteLine("写入付QQ("   _sa_id   ")群["   gInfo.Number   "]的成员数据信息,时间:"   TimeSpan.FromTicks(DateTime.Now.Ticks - startTime.Ticks).TotalMilliseconds   "毫秒[读取线程]");
                        totalCount  = memList.Count;
                        if (totalCount > 80)
                        {
                            Console.WriteLine("已大于80个");
                            break;
                        }

                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("获取付QQ群的成员错误:"   ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                QQHelper.KillProcess(_sa_id);
                QQHelper.WriteLog("付QQ("   _sa_id   ")读取远程数据错误");
            }
        }
    }

    protected override T GetWebData<T>(string url, string charset = null, string referer = null, PostInfo postInfo = null, bool? useProxy = null, System.Collections.Specialized.NameValueCollection headers = null, string userAgent = null, Certificates certificates = null, Version protocol = null, bool? allowAutoRedirect = false, bool? keepAlive = null, string accept = null, string acceptLanguage = null, string acceptCharset = null, string urlEncoding = null, System.Net.Cache.RequestCachePolicy cachePolicy = null)
    {
        while (SysConfig.IsChangeIp)
        {
            Thread.Sleep(1000);
        }
        return base.GetWebData<T>(url, charset, referer, postInfo, useProxy, headers, userAgent, certificates, protocol, allowAutoRedirect, keepAlive, accept, acceptLanguage, acceptCharset, urlEncoding, cachePolicy);
    }

    public List<GroupInfo> GetGroupInfos()
    {
        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)
    {

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

    bool _isLogin = false;
    private void Login()
    {

    }

    public void Dispose()
    {
        _cookieManager = null;
        _login = null;
        JavaScriptEngine = null;
    }
}

/// <summary>
/// QQ好友
/// </summary>
public class QQFriendMember : QQGroupMemberInfo
{
    public int FriendGroupId { get; set; }
}
/// <summary>
/// 好友分组
/// </summary>
public class QQFiendGroup
{
    public string Name { get; set; }
    public int GroupId { get; set; }
    public int SortId { get; set; }
}
/// <summary>
/// 好友信息返回模型
/// </summary>
public class QQFriendInfo
{
    public QQFriendInfo()
    {
        GroupInfos = new List<QQFiendGroup>();
        QQFriends = new List<QQFriendMember>();
    }
    public List<QQFiendGroup> GroupInfos { get; set; }
    public List<QQFriendMember> QQFriends { get; set; }
}