C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码、动态抓取登录位置等,但由于资料很少、进度缓慢,下面这篇文章仅供大家交流阅读。
也许你可能看过一篇文章关于C#实现POST提交方式中三种提取网页HTML的方法:WebBrowser、WebClient、HttpWebRequest。我也看了很多人的博客,尤其是关于WebBrowser和HttpWebRequest方法,但能力有限,很多东西还是没有实现成功,还在继续研究中。
下面先讲讲我该阶段唯一的收获:通过WebBrowser实现简单浏览器自动登录技术。WebBrowser是一个简单浏览器,允许用户在该控件内浏览网页,其实就是封装了IE接口,实现GET/POST功能在WebBrowser的DocumentCompeted中实现。
在“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">登 录</button>
注意:上面的值“Eastmount”、“Eastmount”是被我修改过的值,你需要填写的是自己的密码和用户名。同时登录时会出现一些乱码,这些都是编码问题,有可能有的网站能通过该方法实现自动登录,有的网站不行,但我提供的是一种思想!
在运行时,我首先尝试的是百度网站,但由于异地登录有验证码最终失败;然后采用:https://passport.csdn.net/account/login但好像CSDN是通过https安全方式登录也失败,所以该例仅提供思想参考,最后通过163邮箱和本地网页实现了该功能。
本地网址: http://localhost:1165/WebTest/MyLogin.aspx 查看源代码可以在用户名的Id为”userName”,密码Id为”password”,登录按钮为”loginButton”,用户名和密码为1,设置相应的值即可实现登录。下图为浏览器显示本地登录页面:
四.总结
其实我由于最近研究HttpWebRequest、Cookies较多,更希望通过该类实现同样功能,但编写了几个程序还是没有实现,还在研究中。希望这篇文章能帮助到大家,也不知道我上面的关于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提交方式—陈立国(最经典文章之一,详细讲述了三种方法:WebBrowser、WebClient、HttpWebRequest但不知道最初是那位大师人物写的)
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
C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录的更多相关文章
- 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件
以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件 2007/10/29 Mark BukovecEmpire Down Development 适用于:Mi ...
- WPF编程,通过【帧】动态更改控件属性的一种方法。
原文:WPF编程,通过[帧]动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...
- C# 网络编程之网页简单下载实现
这是根据<C#网络编程实例教程>中学到的知识实现的一个C#网页简单下载器,其中涉及到的知识主要是HTTP协议编程中相关类:HttpWebRequest类.HttpWebResponse类. ...
- iOS项目开发实战——iOS网络编程获取网页Html源码
现在我们身处互联网的时代.不论什么一个软件或是App,都会或多或少与网络打交道,并不断发生数据交互.一个没有涉及网络编程的应用会显得比較low,这里我们将会開始使用Swift开发iOS应用,而且主要来 ...
- 我教女朋友学编程Html系列(6)—Html常用表单控件
做过网页的人都知道,html表单控件十分重要.基本上我们注册会员.登录用户,都需要填写用户名.密码,那些框框都是表单控件. 本来今天就想写一些常用的html表单控件,于是开始搜资料,找到了一个网页,作 ...
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见, ...
- VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)
创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理.比如我们 ...
- MFC编程入门之二十八(常用控件:列表视图控件List Control上)
前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...
- MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)
回顾上一节,讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合 ...
随机推荐
- IE filter & z-index bug
对最近遇到的2个问题的一点总结. 1.IE filter & z-index 重构后的首页即将上线,测试提出fix导航条扩展菜单在ie789滚动后一段无法显示的问题. 疑云重重: 这个问题一开 ...
- Java中double类型的数据精确到小数点后两位
Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...
- java向文件写数据的3种方式
下边列举出了三种向文件中写入数据的方式,当然还有其他方式,帮助自己理解文件写入类的继承关系.类的关系: file->fileoutputstream->outputstreamWriter ...
- [转贴]C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...
- [转贴]gsoap使用心得!
最近换了个工作环境,现在在大望路这边上班,呵,刚上班接到的任务就是熟悉gsoap!废话少说,现在开始gSoap学习! gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在W ...
- ANDROID_MARS学习笔记_S04_007_从服务器获取微博数据时间线
一.代码 1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...
- ScrollView中嵌套两个ListView
做的项目中要使用两个ListView在同一个页面上下显示,因为数据源不同,不能通过在Adapter中设置标志位去区分显示,最后只能硬着头皮做一个ScrollView嵌套两个ListView,但按正常情 ...
- android原生系统裁剪
Andriod 4.0.4系统包 Andriod 4.1.1系统包 说明 ApplicationsProvider.apk ApplicationsProvider.apk 应用程序存储. 程序管 ...
- 【pm2】
告别node-forever,拥抱PM2 pm2及forever模块是目前较常用的nodejs进程守护模块,前者更常用些.功能也更强大(提供负载).其原理主要是pm2开启一个主进程,另行再开子进程运行 ...
- 阮老师讲解TF-IDF算法
TF-IDF与余弦相似性的应用(一):自动提取关键词 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题. 有一篇很长的文章,我要用计算机提取它 ...