如何写一个属于自己的查成绩app

一、准备工作

准备工具:电脑

软件:Fiddler 4(哪个都行,只要抓包)

打开我们学校的教务网站http://202.192.240.29/login!welcome.action


 

点击验证码框,会向服务器发送get请求,这是我抓到的请求内容


服务器返回的是一个验证码


当我输入验证码,然后点击登录,这是我抓到的包


这里可以看到请求的内容是account=311500xxxx&pwd=xxxxxx&verifycode=84ga

这里不用多讲吧,account是学号,pwd当然是password啦,verifycode肯定是验证码啦。

 

当我们登录成功,服务器回返回一个json数据,成功的code0message是“登录成功”,如果错误的话,code-1message会提示你错误的方式。

 

 

然后我们点击成绩查询。


这是我抓到的数据,这里服务器同样返回的是json数据,这很有利于我们的解析。

       到这里,我们的前期准备工作已经完成,下一步,干嘛呢?

 

二、主要思路

    这里我开始介绍,我的主要思路。当然这里需要你对http协议有那么一点的认识,强烈推荐一本快速入门的书《图解http》。

       我们可以看到,我每次发送post请求或者get请求时都会有这么一个东西Cookie:JSESSIONID=BCA9EDDA29865D38E7D7344D975D78A6这是啥东西呢?因为http协议是无状态的,那么我们要怎么确认当前用户就是刚刚登陆的用户呢?所以这里就有了JSESSIONID要是不明白,请百度(JSESSIONID),然后你看看应该就会明白了,这里假设你已经明白了。

   这个JSESSIONID是当我们第一次打开教务网站的时候,服务器给我们分配的。有图有真相,看图。


       这里的Set-Cookie: JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2;Path=/; HttpOnly我们主要关心这个JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2(这里为啥跟上面不一样呢,因为我重新打开了浏览器,系统又重新给我分配的),这里的set-cookie就给我们设置了JSESSIONID,这里就是我们当前登录的唯一标识,所以我们每次发送请求的时候都要带上它。

 

 

 

三、具体实现(Java实现)

 

       class myVerifyThread extends Thread{

        @Override

        public void run() {

            try {

                HttpClient httpClient = newDefaultHttpClient();

                HttpGet httpGet = new HttpGet(“http://202.192.240.29/yzm?d=1515824347343”);

               httpGet.setHeader("Accept","*/*");

               httpGet.setHeader("Connection","keep-alive");

               httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132Safari/537.36");

                HttpResponse httpResponse =httpClient.execute(httpGet);

                if(httpResponse.getStatusLine().getStatusCode() == 200) {

                    SaveCookies(httpResponse);//保存获得的JSESSIONID

                    // 请求和响应都成功了

                    byte[] bytes;

                    bytes =EntityUtils.toByteArray(httpResponse.getEntity());

                    Message message=new Message();

                    Bundle bundle=new Bundle();

                   bundle.putByteArray("verify",bytes);

                    message.setData(bundle);

                    message.what=1001;

                   handle.sendMessage(message);//获取验证码

                }

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

 

这里是想服务器发送get请求,也就是获得验证码。

这里把获得验证码发送出去。


这里把验证码显示出来。

   下面这个函数是保存从服务那边获得的JSESSIONID



然后我们实现登录功能。

   



这里我们再把JSESSIONID给添加到请求头那里去,这样我们就完美欺骗了服务器,我就是刚刚第一访问你的那个我。(其他的头可以根据抓包那里的头来设置)

   



这里解析服务器返回我们的json数据。


 

到这里大家应该都懂了吧。

   具体思路就是给服务器发送http请求,然后保存服务器返回的JSESSIONID,然后我们访问的时候都要把JSESSIONID添加到post请求头那里,这样我们就可以访问了。

 


    欢迎关注我的公众


有问题可以给我留言。

猜你喜欢

转载自blog.csdn.net/wu_lian_nan/article/details/79119080