首页
社区
课程
招聘
[旧帖] [原创][申请邀请码] 和讯博客自动留言之WebBrowser方法 0.00雪花
发表于: 2009-11-17 09:42 1751

[旧帖] [原创][申请邀请码] 和讯博客自动留言之WebBrowser方法 0.00雪花

2009-11-17 09:42
1751
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using Functions;
using System.IO;
using System.Web;
using System.Xml;
using System.Collections;
using System.Threading;
using mshtml;

namespace HexunBlog
{
public partial class FormWebBrowser : Form
{
public FormWebBrowser()
{
InitializeComponent();
}
private static CookieContainer _ReqCookies = new CookieContainer();
/// <summary>
/// 请求Cookies
/// </summary>
public static CookieContainer ReqCookies
{
get
{
if (_ReqCookies == null)
{
_ReqCookies = new CookieContainer();
}
return _ReqCookies;
}
set { _ReqCookies = value; }
}
public string _cookieStr;
public string cookieStr
{
get
{
return _cookieStr;
}
set
{
_cookieStr = value;
}
}
public string LastUrl
{
get
{
return _LastUrl;
}
set
{
_LastUrl = value;
}
}
private string _LastUrl;
private int _ID;
public int ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}

private string _UserIDList;
public string User_IDList
{
get
{
return _UserIDList;
}
set
{
_UserIDList = value;
}
}

private string _User_NameList;
public string User_NameList
{
get
{
return _User_NameList;
}
set
{
_User_NameList = value;
}
}

private static DataTable _dtUserURLList = new DataTable();
public static DataTable dtUserURLList
{
get
{
return _dtUserURLList;
}

set
{
_dtUserURLList = value;
}
}
System.Threading.AutoResetEvent obj = new System.Threading.AutoResetEvent(false);
private void FormWebBrowser_Load(object sender, EventArgs e)
{
// this.myWebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}

public void btnSubmit_Click(object sender, EventArgs e)
{
//主线程
dtUserURLList.Clear();
myWebBrowser.ScriptErrorsSuppressed = true;
myWebBrowser.Navigate("http://reg.hexun.com/login.aspx?username=" + TextBoxUserName.Text + "&password=" + TextBoxPassword.Text + "");
this.myWebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
obj.Reset();
while (obj.WaitOne(100, false) == false) { Application.DoEvents(); } //WaitOne 在子程序执行Set才继续执行循环

if ((cookieStr != "" || cookieStr != null) & myWebBrowser.Document.Url.ToString().Contains("http://i.hexun.com/"))
{
string[] UserIDString = cookieStr.Split("=;%".ToCharArray());
string FriendsUserIDData = string.Empty;
for (int i = 0; i < UserIDString.Length; i++)
{
if (UserIDString.Equals(" userToken"))
{
FriendsUserIDData = WebRequestMethods.ReGetHtml("http://message.hexun.com/GetFriends.aspx?id=" + Convert.ToInt32(UserIDString[i + 1]) + "");
// FriendsUserIDData = WebRequestMethods.ReGetHtml("http://"+ Convert.ToInt32(UserIDString[i + 1]) +".blog.hexun.com/");
break;
}
}

string[] UserIDData = FriendsUserIDData.Split("\r\n=;".ToCharArray());
User_IDList = UserIDData[3].ToString();
User_NameList = UserIDData[7].ToString();
dgvFriendList_DataBind(User_IDList, User_NameList);
}
}

private void button1_Click(object sender, EventArgs e)
{
//主线程
myWebBrowser.ScriptErrorsSuppressed = true;
foreach (DataRow dr in dtUserURLList.Rows)
{
//string PostMethod= WebRequestMethods.PostWebRequestContext(richTextBox2.Text.ToString(), dr["好友ID"].ToString(), dr["用户名"].ToString(), cookieStr);
this.myWebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
this.myWebBrowser.Navigate(dr["个人主页"].ToString());
obj.Reset();
while (obj.WaitOne(100, false) == false)
{
try
{
Application.DoEvents();//重新绘制窗体
}
catch (System.Exception ex)
{
Thread.Sleep(2050);
break;
}
}

}
//obj.Close();
MessageBox.Show("全部好友留言完毕!");
// myWebBrowser.Dispose();
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// 子线程
//HtmlDocument hd = myWebBrowser.Document.Window.Frames[0].Document;
//IHTMLWindow2 win = (IHTMLWindow2)hd.Window.DomWindow;
//string s = @"function confirm() {";
//s += @"return true;";
//s += @"}";
//s += @"function alert() {}";
//win.execScript(s, "javascript");
cookieStr = myWebBrowser.Document.Cookie;
if (LastUrl != myWebBrowser.Document.Url.ToString() && myWebBrowser.Document.Url.ToString().Contains("messageboard.html"))
{
LastUrl = myWebBrowser.Document.Url.ToString();
HtmlElement btnSubmit = myWebBrowser.Document.All["MbSubmit"];
HtmlElement txtContent = myWebBrowser.Document.All["txtcontent"];
if (txtContent == null || btnSubmit == null) return;
txtContent.SetAttribute("value", richTextBox2.Text);
try
{
btnSubmit.InvokeMember("onclick");
}
catch (System.Exception ex)
{
Thread.Sleep(2050);
return;
}
}
obj.Set();

myWebBrowser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}

/// <summary>
/// 绑定
/// </summary>
/// <param name="pFriendsUserIDList">好友ID</param>
/// <param name="pFriendsUserNameList">用户名</param>
private void dgvFriendList_DataBind(string pFriendsUserIDList, string pFriendsUserNameList)
{
char[] charsToTrim = { '"', ' ', '\'' };
string FriendsUserIDList = pFriendsUserIDList.Trim(charsToTrim);
string FriendsUserNameList = pFriendsUserNameList.Trim(charsToTrim);

DataGridView.CheckForIllegalCrossThreadCalls = false;
dgvFriendList.BackgroundColor = Color.White;
dgvFriendList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;

dgvFriendList.DataSource = StringToDataTable(FriendsUserIDList, FriendsUserNameList);
dgvFriendList.Columns["好友ID"].Width = 100;
dgvFriendList.Columns["用户名"].Width = 100;
dgvFriendList.Columns["个人主页"].DataPropertyName = "个人主页";
dgvFriendList.Columns["个人主页"].SortMode = DataGridViewColumnSortMode.NotSortable;
dgvFriendList.Columns["个人主页"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

}
/// <summary>
/// 分割
/// </summary>
/// <param name="FriendsUserIDList">好友ID</param>
/// <param name="FriendsUserNameList">用户名</param>
/// <returns></returns>
public static DataTable StringToDataTable(string FriendsUserIDList, string FriendsUserNameList)
{
if (((System.Data.InternalDataCollectionBase)(dtUserURLList.Columns)).Count == 0)
{
dtUserURLList.Columns.Add("好友ID", typeof(int));
dtUserURLList.Columns.Add("用户名", typeof(string));
dtUserURLList.Columns.Add("个人主页", typeof(string));//缺省的
}
string[] sArrayIDList = FriendsUserIDList.Split(',');//分割后分别存到sArray数组里,下面语句读出
string[] sArrayNameList = FriendsUserNameList.Split(',');
string[] sArrayUrl = new string[sArrayIDList.Length];

for (int j = 0; j < sArrayIDList.Length; j++)
{
sArrayUrl[j] = "http://hexun.com/" + sArrayIDList[j].ToString() + "/messageboard.html";
// sArrayUrl[j] ="http://i.hexun.com/home.aspx?id=" + sArrayIDList[j].ToString();
}

for (int m = 0; m < sArrayIDList.Length; m++)
{
if (Convert.ToString(sArrayIDList[m]) != "")
{
dtUserURLList.Rows.Add(new object[] { sArrayIDList[m], sArrayNameList[m], sArrayUrl[m] });
}

}

return dtUserURLList;
}

private void FormWebBrowser_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
//obj.Close();
}
}
}



/// <summary>
/// 访问其他页面
/// </summary>
/// <param name="strUrl"></param>
/// <returns></returns>
public static string ReGetHtml(string strUrl)

{
//第二次请求
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(strUrl);
string cookhead = getrequestauthorization(strUrl);
request1.Method = "GET";
request1.Headers.Add("cookie:" + cookhead);
request1.KeepAlive = true;
request1.AllowAutoRedirect = true;
HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
Stream stream2 = response1.GetResponseStream();//获得回应的数据流
//将数据流转成 String
string result1 = new StreamReader(stream2, Encoding.GetEncoding("gb2312")).ReadToEnd();
return result1;
}


模拟登陆过程应该很简单,由WebBrowser自动完成(前提myWebBrowser.Navigate参数组成好就行了),难的就是怎么知道获取所有的好友ID,这个很困难,不过可以通过Fiddler抓包很容易就知道了,这里就是一个页面存放者该ID( GetFriends)下所有好友的ID。

自动留言,虽此留言板是通过JS动态生成的,查看源码没有留言文本框以及提交ID,但通过Ie developer toolbar可以看出此文本框是有ID的,而且WebBrowser可以获取由JS动态生成的这些留言本的所有的ID,可以正常的使用HtmlElement获取Document元素,然后执行OnClick事件提交表单。

此方法还有个就是采用了多线程处理循环事件,因为我们提交表单,需要在WebBrowser成功加载完才能执行。



System.Threading.AutoResetEvent obj = new System.Threading.AutoResetEvent(false);

public void btnSubmit_Click(object sender, EventArgs e)

{

obj.Reset();

while (obj.WaitOne(100, false) == false) { Application.DoEvents(); }

//WaitOne 在子程序执行Set才继续执行循环

}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

{
obj.Set();
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
怎么没有人顶呢? 还是自己顶下吧~~
2009-11-17 10:53
0
雪    币: 695
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持楼主 没在博客留过言
2009-11-17 11:23
0
雪    币: 168
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
晕,看起来好像很强大,不过我对博客没兴趣,辛苦楼主了
2009-11-18 10:16
0
游客
登录 | 注册 方可回帖
返回
//