基本信息
源码名称:C#模拟QQ登陆,并获取qq好友列表
源码大小:3.29KB
文件格式:.rar
开发语言:C#
更新时间:2013-01-08
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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; } }