在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#网络编程 → C#模拟QQ登陆,并获取qq好友列表

C#模拟QQ登陆,并获取qq好友列表

C#网络编程

下载此实例
  • 开发语言:C#
  • 实例大小:3.29KB
  • 下载次数:101
  • 浏览次数:4735
  • 发布时间:2013-01-08
  • 实例类别:C#网络编程
  • 发 布 人:chaogu
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 模拟 QQ

实例介绍

【实例简介】

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

标签: 模拟 QQ

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警