实例介绍
【实例简介】
获取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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论