工欲善其事,必先利其器
抓包 :这里抓包用的是burp suite 当然它功能很强大,不仅仅可以抓包,用法就不过多描述了。
安装和抓包的教程都在下面的链接里:brup suite安装于使用
还要懂得一点http协议http协议详解
Jsoup,okhttp使用,一边做一边学把!!!
先上效果图:
1.用验证码的链接获取图片以及抓取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
登陆部分就此结束,下一篇博客会讲成绩查询操作