当前位置: 首页 > news >正文

C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录

最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码、动态抓取登录位置等,但由于资料很少、进度缓慢,下面这篇文章仅供大家交流阅读。

也许你可能看过一篇文章关于C#实现POST提交方式中三种提取网页HTML的方法:WebBrowserWebClientHttpWebRequest我也看了很多人的博客,尤其是关于WebBrowserHttpWebRequest方法,但能力有限,很多东西还是没有实现成功,还在继续研究中。

下面先讲讲我该阶段唯一的收获:通过WebBrowser实现简单浏览器自动登录技术。WebBrowser是一个简单浏览器,允许用户在该控件内浏览网页,其实就是封装了IE接口,实现GET/POST功能在WebBrowserDocumentCompeted中实现。

在“C#网络编程之最简单浏览器实现”(http://blog.csdn.net/eastmount/article/details/9490009)中我通过WebBrowser控件完成了一个最简单的浏览器,这里实在该程序基础上继续完成网页自动登录的功能实现。

一. 界面设计

界面如上,主要是添加一个WebBrowser控件。设置的详细参数见网址:http://blog.csdn.net/eastmount/article/details/9490009

重点:点击”WebBrowser1”控件为其在属性对话框中添加一个事件DocumentCorr(Web浏览器控件中承载的文档全部加载后发生)

该程序主要的实现过程是:

1.点击按钮button事件Click中添加简单浏览器功能;

2.再在DocumentCorr事件中查找用户名、密码、登录按钮三个html元素——HtmlElement,并赋值设置登录状态实现自动登录。

二.源代码

我看了很多博客代码,但自己实现起来还是非常困难的,所以我填出了所有的代码并详细的注释及实现过程,希望能帮助初学者,高手亦可巩固知识,对否!同时最重要的是思想。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//新添加命名空间
using System.Net;
using System.IO;

namespace HttpWeb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //双击"浏览"添加Click事件
        private void button1_Click(object sender, EventArgs e)
        {
            //获取输入的URL
            string url = textBox1.Text;
            //string url = "http://mail.163.com/";

            //创建http链接
            //HttpWebRequest对象实例:该类用于获取和操作HTTP请求 var可改成HttpWebRequest
            var request = (HttpWebRequest)WebRequest.Create(url);   //创建WebRequest对象

            //HttpWebResponse对象实例:该类用于获取和操作HTTP应答 var可改成HttpWebResponse
            var response = (HttpWebResponse)request.GetResponse();  //GetResponse:获取答复

            //构造数据流对象实例
            Stream stream = response.GetResponseStream();  //GetResponseStream:获取应答流
            StreamReader sr = new StreamReader(stream);    //从字节流中读取字符

            //从流当前位置读取到末尾并显示在WebBrower控件中
            string content = sr.ReadToEnd();
            webBrowser1.DocumentText = content;
        }

        //web浏览器控件中承载的文档全部加载后发生
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //定义html元素 通过Name获取控件值
            //HtmlElement tbUserid = webBrowser1.Document.All["userName"];
            //HtmlElement tbPasswd = webBrowser1.Document.All["password"];
            
            //定义html元素 通过ID获取控件值 (用户名 密码 登录按钮)
            HtmlElement tbUserid = webBrowser1.Document.GetElementById("idInput");
            HtmlElement tbPasswd = webBrowser1.Document.GetElementById("pwdInput");
            HtmlElement btnSubmit = webBrowser1.Document.GetElementById("loginBtn");

            //三个元素其一为空返回 加载后才执行赋值 否则会出现为null值的崩溃错误
            if (tbUserid == null || tbPasswd == null || btnSubmit == null)
            {
                return;
            }
            
            //设置元素value属性值 (用户名 密码值)
            tbUserid.SetAttribute("value", "Eastmount");
            tbPasswd.SetAttribute("value", "Eastmount");
            
            //执行元素的方法:如click submit
            btnSubmit.InvokeMember("click");     
        }
    }
}

其实使用WebBrowser控件实现网页自动登录的核心代码就是:

//获取网页元素 (用户名 密码 登录按钮)
HtmlElement tbUserid = webBrowser1.Document.GetElementById("idInput");
HtmlElement tbPasswd = webBrowser1.Document.GetElementById("pwdInput");
HtmlElement btnSubmit = webBrowser1.Document.GetElementById("loginBtn");

//用相应方法为元素赋值
tbUserid.SetAttribute("value", "Eastmount");
tbPasswd.SetAttribute("value", "Eastmount");
btnSubmit.InvokeMember("click");

三.运行结果

上面源代码中是自动登录163邮箱的实现:http://mail.163.com运行程序,输入网址即可实现自动登录163邮箱。如图:

其中通过查找该登录页面发现用户名Id为“idInput”,密码Id为“pwdInput”,登录按钮ID为“loginBtn”。如下图id和name:

<inputclass="loginFormTdIpt"tabindex="1"title="请输入帐号"id="idInput"name="username"type="text"maxlength="50"value=""..

<inputclass="loginFormTdIpt"tabindex="2"title="请输入密码"id="pwdInput"name="password"type="password"autocomplete="off"/>

<buttonid="loginBtn"class="btnbtn-login formSubmit"tabindex="6"type="submit">&nbsp;&nbsp;</button>

注意:上面的值“Eastmount”、“Eastmount”是被我修改过的值,你需要填写的是自己的密码和用户名。同时登录时会出现一些乱码,这些都是编码问题,有可能有的网站能通过该方法实现自动登录,有的网站不行,但我提供的是一种思想!

在运行时,我首先尝试的是百度网站,但由于异地登录有验证码最终失败;然后采用:https://passport.csdn.net/account/login但好像CSDN是通过https安全方式登录也失败,所以该例仅提供思想参考,最后通过163邮箱和本地网页实现了该功能。

本地网址: http://localhost:1165/WebTest/MyLogin.aspx查看源代码可以在用户名的Id”userName”,密码Id”password”,登录按钮为”loginButton”,用户名和密码为1,设置相应的值即可实现登录。下图为浏览器显示本地登录页面:


四.总结

其实我由于最近研究HttpWebRequestCookies较多,更希望通过该类实现同样功能,但编写了几个程序还是没有实现,还在研究中。希望这篇文章能帮助到大家,也不知道我上面的关于WebBrowser使用的叙述是否正确,如果有错误或不足之处,更希望大家指正,希望大家多多交流,相互学习共同进步!

同时感谢一些博客的博主,下面是一些关于WebBrowser该方面的博客,有时间可以看看,我认为都是非常优秀的文章,同时我上面讲诉的核心思想都与下面的相似的,感谢下面的博主及文章:(By:Eastmount 2013-8-1 下午4点)

1.C#网页自动填表自动登录—sonicrang(最简单的代码阐述了使用WebBrowser实现自动登录)

http://blog.csdn.net/sonicrang/article/details/5878611

2.C#中的WebBrowser控件的使用方培工作室(详细讲述了WebBrowser控件中的使用方法)

http://www.cnblogs.com/txw1958/archive/2012/09/24/CSharp-WebBrowser.html

3.C#实现POST提交方式陈立国(最经典文章之一,详细讲述了三种方法:WebBrowserWebClientHttpWebRequest但不知道最初是那位大师人物写的)

http://www.cnblogs.com/cgli/archive/2011/04/09/2010497.html

5.C#自动登录Login代码珍惜当下(比较完整的代码讲述登录功能,仅有代码)

http://hi.baidu.com/zkbob22/item/da897035b65516362e0f8181

6.暴力破解网站密码—相信自己(一个暴力破解全代码,重点是思想,万能密码尝试,但我没有实现成功)

http://blog.sina.com.cn/s/blog_4de05339010109g7.html

7.关于C#模拟登录的论坛讨论(其中一些代码比较优秀)

http://bbs.csdn.net/topics/330239749?page=1

8.编程代码实现网站自动登录C#(与我的思想方法类似)

http://wenku.baidu.com/view/bc46ff9d6bec0975f465e208.html

9.C# WinForm WebBrowser模拟登录打卡—Kelvin峰(过于高深,有待以后研究)

http://blog.csdn.net/llftc/article/details/7036746

相关文章:

  • 文章收录1
  • windows服务器应对高并发和DDOS攻击
  • 公开课可下载资源汇总
  • 将solr3.5整合到Tomcat6.x中
  • 自己写Lucene分词器原理篇——ChineseAnalyzer简单讲解
  • 一个Java程序员应该掌握的10项技能
  • 自己写Lucene分词器示例篇——写一个简单点额分析器
  • java中的接口和抽象类是什么?
  • 并查集专题【完结】
  • Apache配置优化
  • hdu1010 Tempter of the Bone 成长---纠错
  • lucene 4.x中如何只存储不做索引
  • Win32_8有意思的程序——抓取屏幕
  • php调试和日志记录函数
  • Android实战技术:IPC方式简介教程
  • canvas 五子棋游戏
  • chrome扩展demo1-小时钟
  • express + mock 让前后台并行开发
  • in typeof instanceof ===这些运算符有什么作用
  • JAVA 学习IO流
  • Java读取Properties文件的六种方法
  • node入门
  • October CMS - 快速入门 9 Images And Galleries
  • SpiderData 2019年2月13日 DApp数据排行榜
  • spring-boot List转Page
  • springMvc学习笔记(2)
  • vue数据传递--我有特殊的实现技巧
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 安卓应用性能调试和优化经验分享
  • 前端代码风格自动化系列(二)之Commitlint
  • 手写一个CommonJS打包工具(一)
  • 网页视频流m3u8/ts视频下载
  • 系统认识JavaScript正则表达式
  • 小程序开发之路(一)
  • 小程序开发中的那些坑
  • 智能合约Solidity教程-事件和日志(一)
  • linux 淘宝开源监控工具tsar
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (二)Linux——Linux常用指令
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (十五)使用Nexus创建Maven私服
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 项目指定SDK版本
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET开发人员必知的八个网站
  • .NET中的Exception处理(C#)
  • .net中应用SQL缓存(实例使用)