您的位置:首页 > 其它

安卓客户端模拟登陆学校图书馆,并抓取借阅记录等信息,同时实现续借图书的功能。

2017-06-08 20:51 459 查看

前言

前几个月做过这样的功能,而且实现起来非常简单。因为学校图书馆以前的系统登录的时候连验证码都不用输入就可以直接登陆进去了。

前几天使用的时候,突然程序报BUG,自己查看Log,并自己登陆的时候发现,图书馆的系统升级了。现在需要输入验证码才能登陆了,而且自己在抓包的时候发现:登陆过程中,页面进行了好几次跳转。

一、 数据分析

数据分析采用的Fidder4。

下面是分析过程:

1. 首先登陆到主页面:
http://218.199.76.6:8991/F/
。在这里页面就进行了一次跳转


2. 接下来页面又跳转了几次

经过不断分析,得知登陆URL在图一中划红线的最后一个
&
号后面。

3. 所以我们在客户端中可以直接请求该网址,返回数据如下

这个网址,就是 我们最后的登陆网址。

4. 登陆该网址后,抓取验证码,随后发现登陆过程中有几个重要的参数。

分析网页源码,我发现这些数据在请求第3步图中网址上都是可以抓取到的。

5. 现在我们就可以POST数据进行登陆了,POST成功后,返回的返回头数据中,有一个关键参数Set-Cooke,我们需要把它保存下来。

6. 在登陆成功后返回的数据中,我解析到了下一步跳转的URL。接下来的步骤就像前面的一样。

直接上代码:

package com.xiang.hzauhelper.network;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.xiang.hzauhelper.entities.Book;
import com.xiang.hzauhelper.entities.BookHistory;
import com.xiang.hzauhelp
4000
er.mvp.presenter.LibHistoryPresenter;

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
* Created by xiang on 2017/6/7.
*
*/
class LoginToLib {
LoginToLib() {
bookHistories = new ArrayList<>();
}

private final String LOGIN_URL = "https://sso.hzau.edu.cn:7002/cas/login";
private final String HOST_URL = "http://218.199.76.6:8991/F/";
private final String CHECK_CODE_URL = "https://sso.hzau.edu.cn:7002/cas/captcha.htm";
private String unReturnedUrl, returnedUrl;
private String s;
private OkHttpClient okHttpClient = new OkHttpClient();
private Request request;
private Response response;
private String cookie;
private String lt;
private String execution;
private String _eventId;
private List<BookHistory> bookHistories;

List<BookHistory> getDocument(String userName, String password
, String checkCode) throws Exception {
String url = cookie.substring(10, cookie.indexOf(';'));
url = LOGIN_URL + ';'+ "jsessionid" +url + s;
FormBody formBody = new FormBody.Builder()
.add("lt", lt)
.add("execution", execution)
.add("_eventId", _eventId)
.add("username", userName)
.add("password", password)
.add("authCode", checkCode)
.build();
request = new Request.Builder()
.post(formBody)
.url(url)
.addHeader("cookie", cookie)
.addHeader("Referer", LOGIN_URL + s)
.build();
response = okHttpClient.newCall(request).execute();
cookie = response.header("Set-Cookie");
String psd_handle = response.body().string();
Document document = Jsoup.parse(psd_handle);
url = document.getElementsByTag("a").get(0).attr("href");
url = url.substring(12);
psd_handle = psd_handle.substring(psd_handle.indexOf("pds_handle="), psd_handle.indexOf("&calling"));

request = new Request.Builder()
.url(url)
//                .addHeader("Cookie", cookie)
//                .addHeader("Cookie", psd_handle)
.build();
response = okHttpClient.newCall(request).execute();

document = Jsoup.parse(response.body().string());
Elements elements = document.getElementsByTag("a");
url = elements.get(2).attr("href");

request = new Request.Builder()
.url(url)
.build();
response = okHttpClient.newCall(request).execute();
document = Jsoup.parse(response.body().string());

elements = document.getElementsByClass("indent1").get(0).getElementsByTag("a");
unReturnedUrl = elements.get(0).attr("href");
returnedUrl = elements.get(1).attr("href");

unReturnedUrl = unReturnedUrl.substring(24, unReturnedUrl.length()-3);
returnedUrl = returnedUrl.substring(24, returnedUrl.length()-3);

return getBookHistories();
}

Bitmap getCheckCodeImage() throws IOException {     //设置验证码,并保证验证码的cookie和post的cookie是一样的。
setCookie();
request = new Request.Builder()
.addHeader("Cookie", cookie)
.url(CHECK_CODE_URL)
.build();
response = okHttpClient.newCall(request).execute();
return BitmapFactory.decodeStream(response.body().byteStream());
}

private void setCookie() throws IOException {
String url ;
Request request = new Request.Builder()
.url(HOST_URL)
.build();
okHttpClient = new OkHttpClient();
Response response = okHttpClient.newCall(request).execute();
String content = response.body().string();
content = content.substring(content.lastIndexOf("http"));
url = content.substring(0, content.indexOf('\''));
request = new Request.Builder()
.url(url)
.build();
response = okHttpClient.newCall(request).execute();
Document document = Jsoup.parse(response.body().string());
String referer = document.getElementsByTag("a").get(0).attr("href");
url = referer.substring(url.lastIndexOf("http"));
String s1 = url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('-'));
String s2 = url.substring(url.lastIndexOf('-') + 1, url.lastIndexOf('?'));
s= "?service=http%3a%2f%2f218%2e199%2e76%2e6%3a8991%2fcas%2fpds%5fmain%3ffunc%3dload%2dl" +
"ogin%26calling%5fsystem%3daleph%26institute%3dHZA50%26PDS%5fHANDLE%3d%26url%3dhttp%3a%2f%2f" +
"218%2e199%2e76%2e6%3a8991%2fF%2f"+ s1 +"%2d"+ s1 +"%3ffunc%3d%26filer%3d";

//到这里为止,就抓取到了登陆的URL地址,并且获取到了Cookie,和一些关键数据
request = new Request.Builder()
.url(LOGIN_URL+s)
.build();
response = okHttpClient.newCall(request).execute();
document = Jsoup.parse(response.body().string());
Elements elements = document.getElementsByAttributeValue("type", "hidden");
lt = elements.get(0).attr("value");
execution = elements.get(1).attr("value");
_eventId = elements.get(2).attr("value");
cookie =  response.header("Set-Cookie");
}

String continuedBook(String url) throws IOException {
request = new Request.Builder()
.url(url)
.build();
response = okHttpClient.newCall(request).execute();
return response.code()+"";

}

List<BookHistory> getBookHistories() throws IOException {   //登陆成功,并返回数据
Document document;
Elements elements;
request = new Request.Builder()
.url(unReturnedUrl)
.build();
response = okHttpClient.newCall(request).execute();
document = Jsoup.parse(response.body().string());
elements = document.getElementsByClass("td1");
elements.remove(0);
for (int i=0; i<elements.size(); i+=11) {
String bookName = elements.get(i+3).text();
String author = elements.get(i+2).text();
String year = elements.get(i+4).text();
String continueUrl = elements.get(i).getAllElements().attr("href");
bookHistories.add(new BookHistory(bookName, year, author, continueUrl));
}

request = new Request.Builder()
.url(returnedUrl)
.build();
response = okHttpClient.newCall(request).execute();
document = Jsoup.parse(response.body().string());
elements = document.getElementsByClass("td1");
elements.remove(0);
for (int i=0; i<elements.size(); i+=10) {
String bookName = elements.get(i+2).text();
String author = elements.get(i+1).text();
String year = elements.get(i+3).text();
String borrowTime = "应还日期:" + elements.get(i+4).text();
String retrunTime = "归还日期:" + elements.get(i+6).text();
String fin```
后后
elements.get(i+8).text();
bookHistories.add(new BookHistory(bookName, year, author, retrunTime, fine, borrowTime));
}
return bookHistories;
}

}


最后上效果图

APP开源地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐