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)
{
}
/// <summary>
/// 登陆并获取所有好友ID
/// </summary>
public void btnSubmit_Click(object sender, EventArgs e)
{
//主线程
dtUserURLList.Clear();
myWebBrowser.ScriptErrorsSuppressed = true;
myWebBrowser.Navigate("http://***.*****.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://***.*****.com/"))//成功登陆后跳转的页面
{
//这里需要认真的分析下Cookie了
string[] UserIDString = cookieStr.Split("=;%".ToCharArray());
string FriendsUserIDData = string.Empty;
for (int i = 0; i < UserIDString.Length; i++)
{
if (UserIDString[i].Equals(" userToken"))
{
FriendsUserIDData =ReGetHtml("http:/***.*****.com/******.aspx?id=" + Convert.ToInt32(UserIDString[i + 1]) + "");//获取所有好友ID,这样自动留言就不会有限制
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)
{
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;
}
}
}
MessageBox.Show("全部好友留言完毕!");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
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://*****.com/" + sArrayIDList[j].ToString() + "/messageboard.html";//拼接好友留言板地址
}
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();
}
}
/// <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();
}