实例介绍
【实例简介】
获取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; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论