zoukankan      html  css  js  c++  java
  • 软件制作:模拟登陆之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

    地址一

  • 相关阅读:
    js 作用域
    js 实现二级联动
    JavaScript 基础(四)
    JavaScript 基础(三)
    数据库事务的基本概念
    二进制安装 kubernetes 1.12(五)
    二进制安装 kubernetes 1.12(四)
    二进制安装 kubernetes 1.12(三)
    二进制安装 kubernetes 1.12(二)
    Centos 7.x 安装 Docker-ce
  • 原文地址:https://www.cnblogs.com/Gemgin/p/3136328.html
Copyright © 2011-2022 走看看