C#模拟网站用户登录
我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。
HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务 器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这 个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。
服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建 立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该 Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。
现在原理已经搞清楚了,那么我们就来实现一个网站的登录嘛,这里就以盛大纵横天下的登录为例。
要写这种面向协议的网络程序,抓包工具是少不了的,我们首先是要使用抓包工具分析在普通浏览器中登录时发送和接收的内容才好进一步使用C#来模拟浏 览器发包。抓包工具很多,看个人爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于我们分析。
1.最好能清除IE的所有Cookie记录,以免对抓包分析造成影响,然后开启抓包程序。
2.在IE中输入http://zh.sdo.com/web1.0/home/fastlogin.asp 这个快速登录地址,我们将看到已经抓到了很多请求和响应的包。
3.输入用户名和密码,点击登录,IE中正常登录,停止抓包,我们要的所有信息都被抓取好了。
4.盛大的登录机制还是属于比较复杂的,中间涉及到好几个服务器,经过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登录机制为:
1)IE请求https://cas.sdo.com:80/cas/login?service=http://zh.sdo.com/web1.0/home/index.asp页面,该页面给IE一个SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/
2)IE同时在该HTTP的正文中得到一个ticket,这个ticket将在登录中有用,当然其他网站肯定不是这样做的,这里分析的是纵横天下的。location.href = http://www.sdo.com/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.sdo.com%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1; 这里lt参数就是我说的ticket了。
3)将获得的lt、用户名、密码还有一些其他的无关紧要的参数都Post到https://cas.sdo.com:80/cas/Login.PostTarget.aspx?service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp 中,具体抓到的Post的数据如:warn=false&_eventId=submit&idtype=0& gamearea=0&gametype=0&challenge=3623<=sd-1420e593-d2cf- 4c9c-b249-07fe27932a21-2008-05-06_01%3A25%3A41.484&username=studyzy& amp;password=1234&ekey=&challenge=3623,这里我们就只关心 lt,username,password这三个参数。
4)获取一个只有登录後才能访问的页面,测试是否登录成功。
5.好,整个登录机制我们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、 WebResponse、HttpWebRequest和HttpWebResponse等类。我们主要就基于这些类进行操作,当然完全基于Socket 编程也可以,但是这里就没有这个必要了。
在不设置Cookie、PostData的情况下要获得一个页面的HTML的方法很简单:
public static string GetHtml(string URL)
{
WebRequest wrt;
wrt = WebRequest.Create(URL);
wrt.Credentials = CredentialCache.DefaultCredentials;
WebResponse wrp;
wrp = wrt.GetResponse();
return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();
} 当需要获得服务器返回的Cookie的话,可以通过wrp.Headers.Get("Set-Cookie")方法来获取。
如果需要将Cookie加入到请求另外还Post数据的话其实也很简单,只需要将httpWebRequest对象中设置ContentLength 和Request的Stream就可以了。
httpWebRequest.ContentLength = byteRequest.Length;
Stream stream;
stream = httpWebRequest.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close(); 代码我就不都贴出了,我做了一个Demo在附件中,大家有兴趣研究的可以看一下。 LoginSdoDemo.rar
代码中实现了盛大账号的登录,其实纵横天下的登录还没有完成,接下来还有选择具体服务器,将ticket转到具体服务器上再进行验证,原理也是一样的,我这里就不再累述了。
成功登录后,接下来我们只需要每次发送请求是跟上该Cookie,服务器就认为是登录的用户在操作了,接下来就可以随便灌水、Download资源了,具体要做什么就大家自己弄了,只需要在IE中操作一篇,抓包分析出来,用C#实现同样的发包就OK!
附:

1
private void Form1_Load(object sender, EventArgs e)2
{3

4
string username = "xxxx";//用户名5
string password = "xxxx";//密码6
//新建一个用于保存cookies的容器 7
CookieContainer container = new CookieContainer();8
//拼接post数据9
string postData = ("username=" + username);10
postData += ("&passwd=" + password);11
postData += ("&login=%B5%C7%A1%A1%C2%BC");12
ASCIIEncoding encoding = new ASCIIEncoding();13
byte[] data = encoding.GetBytes(postData);14
HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/login.asp");15
request.Method = "Post";16
request.ContentType = "application/x-www-form-urlencoded";17
request.ContentLength = data.Length;18
request.KeepAlive = true;19
request.CookieContainer = container; //返回的cookie会附加在这个容器里面20
//发送数据21
Stream newStream = request.GetRequestStream();22
newStream.Write(data, 0, data.Length);23
newStream.Close();24
//以下俩句不可缺少25
HttpWebResponse response =(HttpWebResponse)request.GetResponse();26
response.Cookies = container.GetCookies(request.RequestUri);27

28
HttpWebRequest requestScore =(HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/Score.asp");29
postData ="term=&TermList=%C7%EB%D1%A1%D4%F1&ckind=&lwPageSize=100&lwBtnquery=%B2%E9%D1%AF";30
data = encoding.GetBytes(postData);31
requestScore.Method = "Post";32
requestScore.ContentType = "application/x-www-form-urlencoded";33
requestScore.ContentLength = data.Length;34
requestScore.KeepAlive = true;35

36
//使用登陆的cookies通过接下来的验证37
requestScore.CookieContainer = container;38
Stream stream = requestScore.GetRequestStream();39
stream.Write(data, 0, data.Length);40
stream.Close();41
HttpWebResponse responseSorce =(HttpWebResponse)requestScore.GetResponse();42
StreamReader reader = newStreamReader(responseSorce.GetResponseStream(), Encoding.Default);43
string content = reader.ReadToEnd();44
textBox1.Text = content;45

46
}C#模拟网站用户登录的更多相关文章
- 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...
- python入门:模拟简单用户登录(自写)
#!/usr/bin/env python # -*- coding: utf-8 -*- #模拟简单用户登录(自写) import getpass a = raw_input("Pleas ...
- 使用C#实现网站用户登录
我们在写灌水机器人.抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录.那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的.H ...
- Java-->IO流模拟实现用户登录以及登录信息
--> Test 测试类 package com.dragon.java.hwlogin; import java.io.FileNotFoundException; import java.u ...
- sonar + jacoco + mockMvc 模拟session 用户登录 配合SpringSecurity 权限 快速测试代码覆盖率.
遇到mock 测试简直就是神器,特别是要做代码覆盖率,直接测试controller就好了,缺点,虽然可以回滚事务,但是依赖数据库数据,解决,根据SpringBoot ,再建立一个专门跑单元测试的数据库 ...
- discuz !NT 3.5 论坛整合 .net 网站用户登录,退出
using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlCont ...
- 用java程序模拟网站的登录以及文件批量上传
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; ...
- Session案例-用户登录场景
package com.loaderman.demo; import java.io.IOException; import java.io.PrintWriter; import javax.ser ...
- c# winform实现网页上用户自动登陆,模拟网站登录
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...
随机推荐
- iphone UIScrollView缩放
allImageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)]; allImageScrol ...
- HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之全然具体解释
HTML:scrollLeft,scrollWidth,clientWidth,offsetWidth究竟指的哪到哪的距离之全然具体解释scrollHeight: 获取对象的滚动高度. scrol ...
- hdu 5080 2014ACM/ICPC鞍山K题 polya计数
首先,中心点是能够直接算出来的 把全部的坐标相加再除n就能够 然后枚举一个不靠近中心的点,枚举它绕中心点旋转的角度.仅仅要枚举50次就能够了 计算出当前枚举的的角度能否形成一个置换群 计算循环节,再用 ...
- Caused by: java.lang.ClassNotFoundException: javassist.ClassPool
1.错误原因 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Kerberos-KDC
Kerberos提供一种较好的解决方案,它是由MIT发明的,Kerberos建立了一个安全的.可信任的密钥分发中心(KDC, Key Distribution Center).Kerberos是一种认 ...
- 页面全部加载完毕和页面dom树加载完毕
dom树加载完毕 $(document).ready()//原生写法document.ready = function (callback) { ///兼容FF,Google ...
- PL/SQL中字符串变量的分割转化
在编写PL/SQL时,有时候我们需要处理这样一个输入的变量,它的格式是由多个值通过分隔符组成的字符串,如“1,2,3”,我们需要将这个变量加入到我们的SQL中,形成诸如in('1','2','3')的 ...
- Asp.net mvc4 + HighCharts + 柱状图
前端代码: @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport ...
- Windows下Mysql解压缩版配置安装与卸载
安装: ①解压Mysql到合适的位置! ②以管理员身份运行命令提示符(cmd),cd C:\Documents and Settings\Administrator\桌面\mysql-5.6.24-w ...
- Form 表单常用正则验证 (收藏)
1.^\d+$ //匹配非负整数(正整数 + 0) 2.^[0-9]*[1-9][0-9]*$ //匹配正整数 3.^((-\d+)|(0+))$ //匹配非正整数(负整数 + 0) 4.^-[0-9 ...