最近做比赛,因为网站需要保证登陆的用户是本校的学生,而学校又不可能给我们数据库,所以想到用WebRequest和WebResponse模拟登陆学校教务系统来检测学号和密码来解决,由于之前从没接触过,苦苦查了n多博客教程,看了N多图书馆的c#的书,问了N多大神。。。才勉强解决。。。。。总之往事不堪回首上代码。。。。
static void Main(string[] args)
{
string loginUri = "http://xxxxxx/loginAction.do";
//校网登陆的用户名
string username = "xxxxxxx";
//登录密码
string password = "xxxx";
//拼接post的数据
string post = "mm=" + password+"&zjh=" + username ;
//将字符串以UTF格式编码转换成字节数组
byte[] postData = Encoding.UTF8.GetBytes(post);
//存储cookies数据,但是在这里我没用过
CookieContainer cc = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Proxy = null;
request.CookieContainer = cc;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = post.Length;
using (Stream s = request.GetRequestStream())
s.Write(postData, 0, post.Length);
StreamReader sr = null;
//读取服务器响应
using (var response = (HttpWebResponse)request.GetResponse())
//判断连接状态
if (response.StatusCode == HttpStatusCode.OK)
{
sr = new StreamReader(response.GetResponseStream());
String html = sr.ReadToEnd();
//通过判断响应信息的字节数判断是否登陆成功
//Unicode编码中,中英文字符各占两个字节
if (Encoding.Unicode.GetBytes(html).length<1000)
{
Console.WriteLine("login success");
}
Console.Write(html);
}
}
因为只需要确认给出的用户名和密码可以确保登陆成功,所以代码较短,下面来解释一下:
post的数据格式以及相应的响应信息,我在这里用的是火狐浏览器的firebug插件开F12看的,找到登陆界面,确认firebug开启,选定“网络”-“维持”,然后输入正确的用户名、密码
点开上图的Post loginAction.do
如图找到post一栏,据此拼接代码里的post数据:
string post = "mm=" + password+"&zjh=" + username ;
至于登陆成功之后返回的值:
sr = new StreamReader(response.GetResponseStream());
String html = sr.ReadToEnd();
就是字符串html,也就是下图里“响应”一栏里的代码:
就是登陆进去后首页的源代码。。。。
在这里判断用户是否登陆成功,用的是响应返回数据的字节数来判断,上图是成功登陆的响应,unicode编码下大约是500*2字节,没有成功登陆的时候返回的是登陆界面的源代码,我这儿是大约4000*2字节,两者比较好分辨。
不过这方法的确挺笨的,但是我们学校教务系统登陆界面的地址跟登陆进去的首页的地址一样,不知道是不是这个原因,导致输入的学号密码错误的时候,response.StatusCode的值也是200 OK,if根本就没有用。。
写的比较简单,如果有大神有兴趣改进,请不吝赐教。