基本信息
源码名称: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; }
}