Android实现模拟登陆正方系统查成绩
相信有很多小伙伴的学校在使用的都是正方系统作为教务系统,在平时我们会图方便利用各种微信公众号、超级课程表之类的东西查成绩,今天就跟大家示范一下如何自己编码模拟登陆正方系统并获得我们需要的信息。
本次教程需要备有如下知识:了解http协议、抓包、Java网络请求的写法、解析html页面的开源库Jsoup、以及方便网络操作的OkHttp(这个如果不熟悉可以用Android原生的HttpUrlConnection,但这里推荐使用OkHttp,因为写起来确实很方便啊,哈哈哈哈)
好,话不多说,马上开始!!!
以我们学习的教务系统为例子,通常我们访问的链接如下:
http://210.38.162.117
然后正方系统就会很诡异将我们访问的链接变成如下形式:
http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/default2.aspx
中间有着24个随机的字符:iwpzdwm0xckdu055dwq5jb45
在这个了地方我纠结了很久,我本以为需要先通过访问
再获得变化后的
http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/default2.aspx
,然后再次发起链接,但经过多次实验后发现,特么这24个随机字符其实是可以固定写死的Orz,可就是说我们一开始就可以通过访问第二条链接实现登陆。
String loginUrl = "http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/default2.aspx";
现在我们就要通过抓包的形式获得登陆时浏览器向服务器提供的数据,怎么抓包可以详情百度,这里简单地说一下,通常现在的浏览器都自带了抓包功能(个人喜欢用UC浏览器哈哈)
在浏览器中右键->审查元素(不同浏览器可能名字不同)
抓包页面如图所示,不同浏览器的抓包功能也不一,有的好有的坏。
在登陆前先打开审查元素功能,输入用户名、密码后登陆
登陆后,点击那个default2.aspx会看到旁边的一些请求头、回复头、表单数据。(看不懂的童鞋赶紧去恶补一下Http协议吧)
__VIEWSTATE:dDwyODE2NTM0OTg7Oz4EdrhGRK2tAP2OLlvKpVtfzXS17g%3D%3D
txtUserName:131110142
TextBox2:******
txtSecretCode:
RadioButtonList1:%D1%A7%C9%FA
Button1:
lbLanguage:
hidPdrs:
hidsc:
这个就是我们表单的数据,实际上我们在向服务器发送请求时,只需要传过去这些数据就行了,
__VIEWSTATE 是一个固定的字符串,是可以写死的。(不同学校的系统不知会不会有所变化)
txtUserName 是学号
TextBox2 是密码,这里被我打了马赛克哈哈哈
txtSecretCode 是验证码
RadioButtonList1 后面那个字符串是学生,在提交的时候经过了Url编码
剩下的几个字段默认都是空,也不必在意它是什么了。
知道了访问所需要的字段,现在开始编码,还是用简单快速的OkHttp。
String loginUrl = "http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/default2.aspx";
public void login() throws UnsupportedEncodingException {
//构建表单数据
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("__VIEWSTATE", "dDwyODE2NTM0OTg7Oz4EdrhGRK2tAP2OLlvKpVtfzXS17g==");
builder.add("txtUserName", "131110142");
builder.add("TextBox2", "******");
builder.add("txtSecretCode", "");
builder.add("lbLanguage", "");
builder.add("RadioButtonList1",