这是在博客园里开博以来写的第一篇博客。

因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲。

废话不多说,先po两张效果图:

界面做得比较随意,有空会再完善的。

接下来便说说是如何实现的了。

首先,你得有个抓包工具(其实用浏览器自带的f12工具应该也是可以的,就是比较麻烦),很多人都是用Httpwatch(貌似支持IE跟火狐),这里我就随波逐流,也用Httpwatch。安装好Httpwatch之后便可以直接打开浏览器登录教务系统抓包啦

在点击登录按钮的时候记得先点击记录

登录进去之后便可以看到Httpwatch中有数据变化了。

这时先选中方法为Post的这一行(记下此时的URL,后面有用到),再选中Post数据来看看要提交的表单有哪些。

这里面我们只要用到上面圈出的五个参数。

第一个参数“_VIEWSTATE”要自己获得(获取登录首页的html内容然后在里面提取就行了)

第二个参数RadioButtonList1的乱码数值其实是“学生”(有的Httpwatch版本可以显示,有的则是乱码),提交表单时提交“学生”即可;

第三个参数TextBox2是密码;

第四个参数txtSecretCode是登录界面的验证码,有的学校系统可以直接绕过,我学校的则不行(开始看了别人的说可以直接填空写死,结果在这里被坑了好久,最后只能老老实实把验证码加上去),所以具体可不可以还得自己试试;

第五个参数是学号;

(每个学校提交的参数应该都是不同的,不过依葫芦画瓢就行了)

其实表单中还有一个更重要的参数:Cookie

Cookie的值在每一次提交的时候都得加上去,Cookie同“_VIEWSTATE”一样得自己先获得,不过不一样的是Cookie获取一次就可以,但“_VIEWSTATE”必须每次提交都得获取一次。

现在就来提交表单尝试登录

String URL = "http://jwgl.gdut.edu.cn/default2.aspx";//上面说到的URL
HttpPost mHttpPost = new HttpPost(URL);//建立连接
mHttpPost.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);//禁止重定向
mHttpPost.setHeader("Cookie", Cookie);//设置Cookie
//填写表单
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("__VIEWSTATE",viewstate));
list.add(new BasicNameValuePair("txtUserName",学号));
list.add(new BasicNameValuePair("TextBox2", 密码));
list.add(new BasicNameValuePair("RadioButtonList1","学生"));
list.add(new BasicNameValuePair("txtSecretCode", 验证码));
//下面几个都直接填空写死即可(事实上下面几个只需添加Button1即可)
list.add(new BasicNameValuePair("Button1", ""));
list.add(new BasicNameValuePair("lbLanguage", ""));
list.add(new BasicNameValuePair("hidPdrs", ""));
list.add(new BasicNameValuePair("hidsc", ""));
mHttpPost.setEntity(new UrlEncodedFormEntity(list, "GBK"));//提交表单
HttpResponse mHttpResponse = new DefaultHttpClient().execute(mHttpPost);// 响应请求
int statusCode = mHttpResponse.getStatusLine().getStatusCode();//状态码若为200则表示登录失败,此时需检查是否表单有误;若状态码为302则表示成功

上述状态码为302时可继续往下,若为200请继续检查测试。

实际上要用到的地址是刚刚302下面的跳转的地址

我们再来对它建立连接尝试登录

String URL = "http://jwgl.gdut.edu.cn/xs_main.aspx?xh=" + 学号;
HttpPost mHttpPost = new HttpPost(URL);//这里用post跟get都可以
//这里要比上次多添加一个值“Referer”,即将它的值置为此时的URL地址
mHttpPost.setHeader("Referer", URL);
mHttpPost.setHeader("Cookie", Cookie);//Cookie还是原来的值
HttpResponse mHttpResponse = new DefaultHttpClient().execute(mHttpPost);//响应请求
//此时的状态码若为200则表示成功登录进入教务系统
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
HttpEntity mHttpEntity = mHttpResponse.getEntity();
String html = EntityUtils.toString(mHttpEntity);//获取网页内容
String studentName = Jsoup.parse(html).getElementById("xhxm").text();//获取学生名字,后面查询成绩时需要用到
}

登录成功之后再回到浏览器先把刚刚抓取的数据清空,再重新点击记录,再进行成绩的查询,便可以抓取到数据了

同样我们找到方法为Post的这一行,选中它,同时记下它的URL,同样再在下面选中Post数据来看看需要提交的表单

这时我们需要提交的参数有上面四个,

第一个参数“_VIEWSTATE”同样需要自己重新获得(注意,这里的参数已经跟上面的不一样了,此时应该获取的是登录成功后的页面的html内容,然后再提取即可)

第二个参数Button1又乱码了,实际上是刚刚三个按钮的值

第三个参数ddlXN是学年;

第四个参数ddlXQ是学期;

在这里如果点击按学期查询,那么就必须提交第三个跟第四个参数;如果点击按学年查询,那么就必须提交第三个参数;如果点击在校学习成绩查询,那么第三个跟第四个参数都不用提交,所以我们可以在代码中加个判断

接下来我们用已有的参数来建立连接:

String URL = "http://jwgl.gdut.edu.cn/xscj.aspx?xh=" + 学号 + "&xm=" + 学生姓名 + "&gnmkdm=N121605";//学生姓名就是上面获取到的studentName
HttpPost mHttpPost = new HttpPost(URL);
//填写表单
List<NameValuePair> list= new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("__VIEWSTATE", viewstate));
list.add(new BasicNameValuePair("Button1", "按学期查询"));//这里我用学期查询,因此需要添加下面两个参数
list.add(new BasicNameValuePair("ddlXN", "2014-2015"));
list.add(new BasicNameValuePair("ddlXQ", "1"));
mHttpPost.setEntity(new UrlEncodedFormEntity(params, "GBK"));//提交表单
//这里我们同样需要设置两个头信息。后面的套路跟前面的是差不多的
mHttpPost.setHeader("Referer", "http://jwgl.gdut.edu.cn/xs_main.aspx?xh=" + 学号);
mHttpPost.setHeader("Cookie", Cookie);
HttpResponse mHttpResponse = new DefaultHttpClient().execute(mHttpPost);
HttpEntity mHttpEntity = mHttpResponse.getEntity();
String html = EntityUtils.toString(mHttpEntity);//此时就获取到含有成绩信息的页面了
//用Jsoup将里面的课程成绩提取出来
Elements mElements = Jsoup.parse(html).select("td");
//再根据需要向mElements中提取需要的数据,再将其添加到listview中就大功告成了

当然,实现了成绩查询,其他的功能像什么课表查询、考试查询也都可以一一实现了,原理都是差不多的。

转载前请附上地址http://www.cnblogs.com/easen/p/5745242.html

在Android上模拟登录广工正方教务系统查询成绩的更多相关文章

  1. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  2. HttpURLConnection模拟登录学校的正方教务系统

    教务系统登录界面 如图1-1 1-1 F12-->network查看登录教务系统需要参数: __VIEWSTAT txtUserName TextBox2 txtSecretCode Radio ...

  3. Golang模拟用户登陆,突破教务系统

    目录 一.Golang模拟用户登陆,突破教务系统 1.1 请求登陆页面 1.2 抓包分析登陆请求 1.3 golang使用js引擎合成salt 1.4 模拟表单提交,完成登陆 1.5 进入成绩查询页, ...

  4. HttpClient+Jsoup模拟登陆贺州学院教务系统,获取学生个人信息

    前言 注:可能学校的教务系统已经做了升级,当前的程序不知道还能不能成功获取信息,加上已经毕业,我的账户已经被注销,试不了,在这里做下思路跟过程的记录. 在我的毕业设计中”基于SSM框架贺州学院校园二手 ...

  5. 如何调试 Android 上 HTTP(S) 流量

    http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/ 如何调试 Android 上 HTTP(S) ...

  6. Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

  7. Android利用HttpURLConnection实现模拟登录

    最近在做一个APP,需要模拟登录教务处,之前曾经用HttpClient做过,点这里,但是发现最新的Android SDK已经不支持Httpclient了,所以只好在琢磨一下HttpURLConnect ...

  8. Android实现模拟表单上传

    很久以前,写过一篇关于下载的文章:基于HTTP协议的下载功能实现,今天对于Android上的文件上传,也简单的提两笔.在Android上,一般使用Http 模拟表单或者FTP来进行文件上传,使用FTP ...

  9. C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总

    由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件.在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助.因为技术有限,可能有些内容并不完 ...

随机推荐

  1. 全球AI界最值得关注的十位科学家

    全球AI界最值得关注的十位科学家   我们可以看到AI已经从象牙塔里的高冷研究,逐步转换为科技公司.互联网公司的最核心竞争力.AI代表了这时代人类的前沿智慧,也正达到一种科学的极致. 这两天在美国加利 ...

  2. java线程(2)-线程间通信

    方法一 通过访问共享变量的方式(注:需要处理同步问题) 方法二 通过管道流 其中方法一有两种实现方法,即 方法一a)通过内部类实现线程的共享变量  public class Innersharethr ...

  3. 【转】android-support-v7-appcompat.jar 的安装及相关问题解决 --- 汇总整理

    原文网址:http://tdppro.blog.51cto.com/749956/1388853 1.DownLoading the Support Libraries 1)Start the And ...

  4. GCC参数详解

    GCC参数详解 [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇 ...

  5. ADO.NET 增删查改小总结

    转自:http://www.cnblogs.com/ashu123/archive/2010/10/10/ado_1.html 三套路-----增删改 1 using System.Data.SqlC ...

  6. 数学(容斥计数):LNOI 2016 方

    Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...

  7. 畅通工程 HDOJ--1863

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. Web开发需要关注的技术细节

    摘要:在网站发布前,开发者需要关注有许多的技术细节,比如接口设计.用户体验.安全性.Web标准.性能.SEO等,倘若一个疏忽就会影响到整体的体验效果.作为一名Web开发者,哪些技术细节需要考虑呢? [ ...

  9. btrace 笔记

    转载请注明原链接地址 http://www.cnblogs.com/dongxiao-yang/p/6134393.html btrace 是一个可以不用重启线上java业务查问题的神器,记一下自己折 ...

  10. 解决@media screen (自适应)IE浏览器不兼容问题

    1.解决兼容性问题 (1)页面最顶部必须定义:<!DOCTYPE html> (2)点击:下载 respond.js 文件 (3)引入<script src="respon ...