模拟登录学校教务网 获取课程表信息

最终效果:
模拟登录学校教务网 获取课程表信息_第1张图片

模拟登录学校教务网 获取课程表信息_第2张图片

第一步:使用 HttpWatch 对教务网抓包 使用Volley框架和HttpUrlConnection 获取课程表信息

  1. 获取cookie
    模拟登录学校教务网 获取课程表信息_第3张图片

    之前自己在写模拟登录学校教务网信息的时候,找了一下博客上的前辈们的文章。 很多文章上写的cookie是在post登录消息的时候服务器返回的,可是根据我自己的抓包情况我发现我的cookie是在进入教务网登录页面的时候 服务器就返回了的(所以大家还是要以自己的抓包情况来分析)。 在图中我用红色框框标出了 Set-cookie ,它的值就是我们后面发送请求需要的cookie了(获取cookie这个很重要)。

  2. 使用 HttpUrlConnection 将学生的登录信息(学号,密码,验证码)POST 给教务网系统
    抓包截图:
    模拟登录学校教务网 获取课程表信息_第4张图片

    模拟登录学校教务网 获取课程表信息_第5张图片

    个人认为post是整个功能中实现最困难的一步
    写post的时候要特别注意的几个问题:
    注意1:重定向问题 要post的时候要设置重定向为false
    之前一直习惯用Volley框架,可是Volley设置重定向的时候没有直接的方法,最后果断选择HttpUrlConnection

postCon.setInstanceFollowRedirects(false);
注意2:当写post参数的时候注意编码问题,因为正方教务网的编码用的是GB2312的,那么我们在post的时候要将所有参数转换为GBK(GB2312),
__VIEWSTATE和_VIEWSTATEGENERATOR参数的内容,你可以通过解析源码后达到。
 String postData = "__VIEWSTATE=" + URLEncoder.encode(__VIEWSTATE, "GBK") + "&__VIEWSTATEGENERATOR=" + __VIEWSTATEGENERATOR + "&TextBox1=" + account.getText().toString() + "&TextBox2=" + password.getText().toString() + "&TextBox3=" + checkcode + "&RadioButtonList1=" + URLEncoder.encode("学生", "GBK") + "&Button1=";
注意3: post请求头:要将上面获取的那个cookie写入(这样才能让服务器知道是同一个用户在访问服务器  还有 Referer 这个也很重要  不能忘)
  postCon.setRequestProperty("Cookie", cookieString);
  postCon.setRequestProperty("Referer", mainUrl);

到这里 post请求就已经写好了 如果在服务器返回的头信息中能够拿到location的话 就说明你已经登录成功了 ,如果未拿到正确的location信息,请检查一下 我上面说的几点注意 你是否做好。

  1. 登录成功之后, 获取课程表信息
    根据你的抓包结果 向正确的url发送GET请求 (还是要带上之前获取的cookie) 就可以获取正确的课程表网页的源码了,因为根据我抓包的情况来看我不需要设置重定向,那肯定就使用Volley框架了。
 // 获取课表的网页信息
    private void getCourse(String name, String number) {
        StringRequest CourseRequest = null;
        try {
            CourseRequest = new StringRequest(Request.Method.GET, "http://jwxt.zwu.edu.cn/xskbcx.aspx?xh=" + number + "&xm=" + URLEncoder.encode(name, "GBK") + "&gnmkdm=N121603", new Response.Listener() {
                @Override
                public void onResponse(String s) {
//                    Log.e("info", "wangye" + s);
                    Message message = new Message();
                    message.what = 3;
                    message.obj = s;
                    handler.sendMessage(message);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                }
            }) {
                @Override
                public Map getHeaders() throws AuthFailureError {
                    Map headers = new HashMap();
                    headers.put("Cookie", cookieString);
                    headers.put("Referer", mainUrl + location);

                    return headers;
                }
            };
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        CourseRequest.setTag("CourseRequest");
        requestQueue.add(CourseRequest);

发送请求的时候会有一个姓名的参数要放在url中 这个参数也是可以通过解析之前post请求成功后返回的网页源码得到的。

你可能感兴趣的:(模拟登录学校教网)