站外登录的实现(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

posted @ 2010-11-12 00:09  clound  阅读(2000)  评论(4编辑  收藏  举报