• 站外登录的实现(BS版的无忧登录),不支持验证码


    应用场景    客户需求是个网站信息管理中心,保存很多站点后台的用户名及密码,要让中心用户可以通过页面浏览可以直接登录到相应站点后台。

        第一种  最简单的方法调用Interop.SHDocVw.dll打开个IE,提交相应数据过去就可以了。

        可以参考:使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
        实现如下:

        说明:tbUserName={0}&tbPassword={1}&btnLogin={2}是相应控件Name。

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Net;
    using System.Text;
    using System.IO;
    using SHDocVw;
    
    
    namespace WebApplication2
    {
        public partial class Login1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
                CookieContainer cookieContainer = new CookieContainer();
    
                ///////////////////////////////////////////////////
                // 1.打开 MyLogin.aspx 页面,获得 GetVeiwState & EventValidation
                ///////////////////////////////////////////////////                
                // 设置打开页面的参数   
                string URI = "***";
                HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
                request.Method = "GET";
                request.KeepAlive = false;
    
                // 接收返回的页面
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                System.IO.Stream responseStream = response.GetResponseStream();
                System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
                string srcString = reader.ReadToEnd();
    
                // 获取页面的 VeiwState                
                string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";
                int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
                int j = srcString.IndexOf("\"", i);
                string viewState = srcString.Substring(i, j - i);
    
                // 获取页面的 EventValidation                
                string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\"";
                i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
                j = srcString.IndexOf("\"", i);
                string eventValidation = srcString.Substring(i, j - i);
    
    
                ///////////////////////////////////////////////////
                // 2.自动填充并提交 MyLogin.aspx 页面
                ///////////////////////////////////////////////////
                // 提交按钮的文本
                string submitButton = "登  录";
    
                // 用户名和密码
                string userName = "***";
                string password = "***";
    
                // 将文本转换成 URL 编码字符串
                viewState = System.Web.HttpUtility.UrlEncode(viewState);
                eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
                submitButton = System.Web.HttpUtility.UrlEncode(submitButton);
    
                // 要提交的字符串数据。格式形如:user=uesr1&password=123
                string formatString = "tbUserName={0}&tbPassword={1}&btnLogin={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
                string postString = string.Format(formatString, userName, password, submitButton, viewState, eventValidation);
                OpenNewIe(URI, postString);
    
            }
    
            public static void OpenNewIe(string url, string postData)
            {
                var ie = new InternetExplorer();
                object vPost, vHeaders, vFlags, vTargetFrame;
                vPost = null;
                vFlags = null;
                vTargetFrame = null;
                vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);
                if (!string.IsNullOrEmpty(postData))
                    vPost = ASCIIEncoding.ASCII.GetBytes(postData);
                ie.Visible = true;
                ie.Navigate(url, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);
    
            }
    
        }
    }
    

         第二种方法 利用mshtml命名空间实现表单赋值。

          可以参考c# 控制IE浏览器

         具体实现如下:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Diagnostics;
    using System.IO;
    
    using SHDocVw;
    using System.Text;
    using System.Net;
    using mshtml;
    
    namespace WebApplication2
    {
        public partial class login2 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string URI = "***";
                var ie = new InternetExplorer();
                object vPost, vHeaders, vFlags, vTargetFrame;
                vPost = null;
                vFlags = null;
                vTargetFrame = null;
                vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);
    
                ie.Visible = true;
                ie.Navigate(URI, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);
                try
                {
                    System.Threading.Thread.Sleep(1000);
                    HTMLDocument doc = (HTMLDocument)ie.Document;
                    HTMLInputElement keyword = (HTMLInputElement)doc.getElementById("tbUserName");
                    keyword.value = "***";
    
    
                    HTMLInputElement keyword1 = (HTMLInputElement)doc.getElementById("tbPassword");
                    keyword1.value = "***";
    
                    HTMLInputElement submit = (HTMLInputElement)doc.getElementById("btnLogin");
                    submit.click();
                }
                catch (Exception)
                {
    
                    return;
                }
            }
        }
    }
    
    

         第三种方法  是自己调用底层dll   来实现打开IE,并对表单赋值。调用的类为I ELoginHelper,

         客户端实现如下:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using IELoginHelper;
    
    namespace WebApplication2
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
               
    
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                IEHelper ie = new IEHelper();
                ie.OpenAVisibleBlankDocument();
    
    
                object p = null;
              
    
                string url = @"***";
                bool ret = ie.Navigate(url, ref p, ref p, ref p, ref p);
    
                ie.SetValueById("txtusername", "***");
                ie.SetValueById("txtpwd", "***");
                ie.ClickButtonByName("***");
    
    
               
            }
        }
    }
    
    

    第一种第二种如果客户端页面JS出错,Button按钮Type不是Submit按钮等可能会出异常。

    附件: IELoginHelper.rar

            WebApplication2.rar

  • 相关阅读:
    函数的声明
    数组遍历的方法
    运算符
    变量命名规则
    js条件判断
    vuex使用
    高盛伦敦分部面试
    野村证券伦敦分部面试
    Linux Performance Monitoring Commands
    Linux server上too many open files问题
  • 原文地址:https://www.cnblogs.com/dooom/p/1875298.html
Copyright © 2020-2023  润新知