软件制作:模拟登陆之WebBrowser

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();

}

模拟登陆Demo

地址一

原文地址:https://www.cnblogs.com/Gemgin/p/3136328.html