现在人人手机不离身,相比笨重的电脑,手机实在是太方便了。但是学校又没有一个手机客户端,作为学生总是会偶尔查查课表,成绩什么的。这样来说就实在是太不方便了。那么今天我就教大家如何写一个app在手机上就能查看成绩。主要用到的技术是android的HttpClient和Fiddler。
相信很多人也许并没有用过Fiddler。Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。
那么首先我们先打开学校的登录页面,同时也打开Fiddler。在浏览器中输入我们的学号和密码,我们发现此时Fiddler已经捕捉到了网页所提交的数据。
我们看到一共提交了4个参数,username,password,x和y。username和password很好理解。但是后面的x和y一开始我想了很久都没有搞明白。随后我自己又抓取了几次。但是发现x和y的提交的值是随机变化的。那我就想会不会是网页里的随机函数(并不是很懂,但对我们查成绩没有影响)。那干脆就直接只提交username和password就好了。最后发现是完全可行的。既然这样那么我们就开始编写用HttpClient来进行模拟登录的代码好了。
URL是登录教务系统的网址。
利用上面的就可以进行模拟登录了,因为是登录,所以使用HttpPost来提交表单给服务器进行认证。如果登录成功的话,浏览器会返回一个Cookie作为身份认证。因此我们就尝试去获取Cookie来查看是否成功登录。
此时我们发现Cookie是可以获取到的,那么我们初期进行登录的工作就完成了。登录成功后,其实有很多事情可以做的,比如查成绩,查课表。甚至可以进行选课(选课的痛苦大家都懂)。但是这边文章我打算只实现查成绩的功能,至于更多的功能其实大同小异罢了。
既然登录成功了,那么我们就需要从网页上去获取我们的成绩了。我们再次回到浏览器页面,进行点击成绩查询。
我们使用Fiddler发现它再次提交了学号给服务器进行请求。
那么我们就可以进行接下来的获取成绩单的编码了。
上面这段代码就是获取到的服务器返回给手机的数据。
服务器返回的数据如图所示,虽然我们可以知道这是一串json数据,但是这个json数据我们无法用常规的JsonObject库来进行解析。但是我们发现它的tableHtml是一段HTML代码。于是我想到了可以使用Jsoup库来进行解析(代码已在上面图里)。
其中DATA_URL就是学校的查成绩的地址,这个地址我们学校的教务系统是采用的frame来显示的,在浏览器地址栏看不到,但是借助Fiddler神器,我们还是可以抓取到这个地址的。具体的地址每个学校都不一样,相信大家都能搞定的。
获取到成绩以后,我们需要在android手机页面里面显示出来。但是因为android系统要求网络操作不允许在UI线程进行操作,但是我们需要在UI线程里去更新成绩显示出来。于是我想到了Handler。通过Handler来进行主线程和子线程的切换,就可以很好的解决这个问题了。
那么这样手机上查看成绩的app就算完成了。页面很是简陋的,但自用还是足够了。当然也可以进行更多的功能开发,那都是后话了。