public partial class LoginForm : Form
{
public string Cookies { get; set; }
public LoginForm()
{
InitializeComponent();
}
private void LoginForm_Load(object sender, EventArgs e)
{
Browser.Navigate("http://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=1006102&daid=1&style=23&hide_border=1&s_url=http://id.qq.com/cgi-bin/get_base_key?r=" + Common.GetRand());
Browser.DocumentCompleted += Browser_DocumentCompleted;
}
private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (Browser.Document.Cookie.IndexOf("ldw") >= 0)
{
Cookies = Browser.Document.Cookie;
DialogResult = DialogResult.OK;
Close();
}
}
}
partial class LoginForm
{
private System.ComponentModel.IContainer components = null
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose()
}
base.Dispose(disposing)
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.Browser = new System.Windows.Forms.WebBrowser()
this.SuspendLayout()
//
// Browser
//
this.Browser.Dock = System.Windows.Forms.DockStyle.Fill
this.Browser.Location = new System.Drawing.Point(0, 0)
this.Browser.MinimumSize = new System.Drawing.Size(20, 20)
this.Browser.Name = "Browser"
this.Browser.ScriptErrorsSuppressed = true
this.Browser.ScrollBarsEnabled = false
this.Browser.Size = new System.Drawing.Size(434, 361)
this.Browser.TabIndex = 0
//
// LoginForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F)
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
this.ClientSize = new System.Drawing.Size(434, 361)
this.Controls.Add(this.Browser)
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
this.MaximizeBox = false
this.MinimizeBox = false
this.Name = "LoginForm"
this.ShowIcon = false
this.ShowInTaskbar = false
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
this.Text = "登录"
this.Load += new System.EventHandler(this.LoginForm_Load)
this.ResumeLayout(false)
}
#endregion
private System.Windows.Forms.WebBrowser Browser
}
MainForm.cs代码:
public partial class MainForm : Form
{
private Dictionary<string, Friend> Friends { get; set; }
public MainForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
private void LoginButton_Click(object sender, EventArgs e)
{
var form = new LoginForm();
if (form.ShowDialog() == DialogResult.OK)
{
var thread = new Thread(GetFriends);
thread.IsBackground = true;
thread.Start(form.Cookies);
}
}
private void GetFriends(object cookies)
{
LoginButton.Enabled = false;
SaveText.Enabled = false;
var url = "http://id.qq.com/cgi-bin/qqlevel_rank?page_type=1&ldw={0}&s={1}&n={2}&r={3}";
var ldw = Regex.Match(cookies.ToString(), "ldw=(?<ldw>.+?)(;|$)").Groups["ldw"].Value;
var n = 50;
var s = 1;
var loop = true;
FriendList.Items.Clear();
Friends = new Dictionary<string, Friend>();
while (loop)
{
var web = new WebClient();
web.Encoding = Encoding.UTF8;
web.Headers.Set(HttpRequestHeader.Cookie, cookies.ToString());
var response = web.DownloadString(string.Format(url, ldw, s, n, Common.GetRand()));
var json = JsonMapper.ToObject(response);
var count = int.Parse(json["c"].ToString());
foreach (JsonData friend in json["ls"])
{
if (Friends.ContainsKey(friend["u"].ToString()) == false)
{
Friends.Add(friend["u"].ToString(), new Friend()
{
Number = friend["u"].ToString(),
Name = HttpUtility.HtmlDecode(friend["n"].ToString()),
Level = int.Parse(friend["l"].ToString())
});
FriendList.Items.Add(new ListViewItem(new[]
{
friend["r"].ToString(),
friend["u"].ToString(),
HttpUtility.HtmlDecode(friend["n"].ToString()),
friend["l"].ToString() + " 级"
}));
FriendList.EnsureVisible(FriendList.Items.Count - 1);
}
}
if (Friends.Count < count) s += n;
else loop = false;
}
LoginButton.Enabled = true;
SaveText.Enabled = true;
MessageBox.Show(this, "加载完成!", "提示", MessageBoxButtons.OK);
}
private void SaveText_Click(object sender, EventArgs e)
{
var dialog = new SaveFileDialog()
{
Filter = "文本文档|*.txt",
DefaultExt = ".txt",
AddExtension = true,
OverwritePrompt = true
};
if (dialog.ShowDialog() == DialogResult.OK)
{
var text = new StringBuilder();
foreach (var friend in Friends.Values)
{
text.AppendLine(string.Format("{0}|{1}|{2}", friend.Number, friend.Name, friend.Level));
}
File.WriteAllText(dialog.FileName, text.ToString(), Encoding.UTF8);
}
}
}
MainForm.Designer.cs
partial class MainForm
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose()
}
base.Dispose(disposing)
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.LoginButton = new System.Windows.Forms.Button()
this.FriendList = new System.Windows.Forms.ListView()
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()))
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()))
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()))
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()))
this.SaveText = new System.Windows.Forms.Button()
this.SuspendLayout()
//
// LoginButton
//
this.LoginButton.Location = new System.Drawing.Point(12, 12)
this.LoginButton.Name = "LoginButton"
this.LoginButton.Size = new System.Drawing.Size(90, 30)
this.LoginButton.TabIndex = 0
this.LoginButton.Text = "登录帐号"
this.LoginButton.UseVisualStyleBackColor = true
this.LoginButton.Click += new System.EventHandler(this.LoginButton_Click)
//
// FriendList
//
this.FriendList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4})
this.FriendList.FullRowSelect = true
this.FriendList.GridLines = true
this.FriendList.Location = new System.Drawing.Point(12, 48)
this.FriendList.Name = "FriendList"
this.FriendList.Size = new System.Drawing.Size(460, 351)
this.FriendList.TabIndex = 1
this.FriendList.UseCompatibleStateImageBehavior = false
this.FriendList.View = System.Windows.Forms.View.Details
//
// columnHeader1
//
this.columnHeader1.Text = "序号"
//
// columnHeader2
//
this.columnHeader2.Text = "QQ"
this.columnHeader2.Width = 120
//
// columnHeader3
//
this.columnHeader3.Text = "名称"
this.columnHeader3.Width = 150
//
// columnHeader4
//
this.columnHeader4.Text = "等级"
this.columnHeader4.Width = 90
//
// SaveText
//
this.SaveText.Enabled = false
this.SaveText.Location = new System.Drawing.Point(108, 12)
this.SaveText.Name = "SaveText"
this.SaveText.Size = new System.Drawing.Size(120, 30)
this.SaveText.TabIndex = 2
this.SaveText.Text = "导出 TXT 列表"
this.SaveText.UseVisualStyleBackColor = true
this.SaveText.Click += new System.EventHandler(this.SaveText_Click)
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F)
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
this.ClientSize = new System.Drawing.Size(484, 411)
this.Controls.Add(this.SaveText)
this.Controls.Add(this.FriendList)
this.Controls.Add(this.LoginButton)
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)))
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4)
this.MaximizeBox = false
this.MinimizeBox = false
this.Name = "MainForm"
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
this.Text = "QFriends"
this.ResumeLayout(false)
}
#endregion
private System.Windows.Forms.Button LoginButton
private System.Windows.Forms.ListView FriendList
private System.Windows.Forms.ColumnHeader columnHeader1
private System.Windows.Forms.ColumnHeader columnHeader2
private System.Windows.Forms.ColumnHeader columnHeader3
private System.Windows.Forms.ColumnHeader columnHeader4
private System.Windows.Forms.Button SaveText
}
项目运行结果如图:

