android 用(okhttp+jsoup+burp suite) 登陆(带cookie) 以及 获取正方教务系统成绩

工欲善其事,必先利其器

抓包 :这里抓包用的是burp suite 当然它功能很强大,不仅仅可以抓包,用法就不过多描述了。
安装和抓包的教程都在下面的链接里:brup suite安装于使用
还要懂得一点http协议http协议详解
Jsoup,okhttp使用,一边做一边学把!!!

先上效果图:

1.用验证码的链接获取图片以及抓取cookie

在这里插入图片描述
​​第一个是请求的方式:**get**,第二个是**链接**,第三个是我们要的**cookie**
请求验证码链接: http://jwjx.njit.edu.cn/CheckCode.aspx
那么就是用这个链接来获取cookie了

OkHttpClient取消了setCookieHandler(CookieHandler cookieHandler);
改而使用:setCookieJar(CookieJar cookieJar);
CookieJar是一个接口,需要自己实现CookieJar的定义。

mCookieClient = new OkHttpClient().newBuilder()
                .cookieJar(new CookieJar() {
                    //cookie的缓存区
                    private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();//
                    @Override
                    public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {
                        //添加cookie
                        cookieStore.put(url.host(), cookies);
                        //保存请求回来的cookie登陆和查成绩要用到
                        Constant.sCookieList = cookies;
                        //保存cookie的字符串
                        Constant.sCookie = Constant.sCookieList.toString();
                        Log.e(TAG, "saveFromResponse: " + Constant.sCookie + "," + Constant.sCookie.substring(19, 43));
                    }
                    @Override
                    public List<Cookie> loadForRequest(@NonNull HttpUrl url) {
                        List<Cookie> cookies = cookieStore.get(url.host());
                        //当Request 连接到网络的时候,OkHttp会调用loadForRequest()
                        return cookies != null ? cookies : new ArrayList<>();
                    }
                }).build();
   //Constant.CHECK_CODE_URL:验证码链接
        Request request = new Request.Builder().url(Constant.CHECK_CODE_URL).build();
        mCookieClient.newCall(request).enqueue(new Callback() {
			.....//返回回来的数据处理成bitmap
        });    

拿到cookie之后就是登陆操作啦;

2.登陆

在这里插入图片描述
在这里插入图片描述

登陆部分__VIEWSTATE是不变的可以写死,请求成绩部分需要额外获取

            RequestBody requestBody = new FormBody.Builder()
                    .add("ASP.NET_SessionId", Constant.sCookie)
                    .add("__VIEWSTATE", Constant.LOGIN_VIEWSTATE)
                    .add("txtUserName", studentID)
                    .add("Textbox1", "")
                    .add("TextBox2", password)
                    .add("txtSecretCode", s)
                    .add("RadioButtonList1", "学生")
                    .add("Button1", "")
                    .add("lbLanguage", "")
                    .add("hidPdrs", "")
                    .add("hidsc", "").build();
            Request request = new Request.Builder()
                    .url(Constant.POST_LOGIN_URL)
                    .post(requestBody).build();
            OkHttpClient loginPostClient = new OkHttpClient().newBuilder().
                    cookieJar(mCookieJar).build();
            loginPostClient.newCall(request).enqueue(new Callback() {
        	.....//数据处理操作
        	}

请求成功后会得到一个loginUrl:“http://jwjx.njit.edu.cn/xs_main.aspx?xh=+studentID
response.isSuccessful()这方法很鸡肋,判断验证码,学号,密码是否正确需要对请求回来的h5数据进行判断操作,这里就不贴代码了,相信都会,很简单,post请求之后会发现有一个302,说明发生了重定向,要完成请求必须进行更进一步的操作,第二个请求方式是get

	//get请求的url用刚刚请求回来的loginUrl
    Request request = new Request.Builder()
                .url(loginUrl)
                .addHeader("Cookie", Constant.sCookie)
                .addHeader("Referer", loginUrl)
                .addHeader("Host", Constant.HOST)
                .build();
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder().cookieJar(mCookieJar).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) { }
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                searchScore(name);//进行成绩查询操作
            }
        });

mCookieJar也是自己定义的返回之前获取验证码时保留的Constant.sCookieList

登陆部分就此结束,下一篇博客会讲成绩查询操作

猜你喜欢

转载自blog.csdn.net/qq_37963018/article/details/83045449
今日推荐