安卓客户端模拟登陆学校图书馆,并抓取借阅记录等信息,同时实现续借图书的功能。
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开源地址
相关文章推荐
- 续借图书功能实现---图书馆客户端
- Android客户端读取PHP服务器的图片等信息,并用ListView列出来,实现缓存功能。
- 使用Java实现B/S系统常见的获取客户端信息功能!
- 记录下最近在研究的使用AndroidStudio 实现untiy3d调用安卓内置的API接口实现刷新相册的功能
- Servlet字符编码过滤器,实现图书信息的添加功能,避免产生文字乱码现象的产生
- 安卓通过经纬度,实现intent调用百度,高德,Google地图客户端实现驾车导航功能
- 学生信息记录系统,主要实现增删改查功能,考虑用堆栈、队列来写下
- 银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能
- 安卓客户端微信支付功能实现
- 安卓新闻客户端编写(一) JSOUP抓取网页信息
- EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
- 使用模版列完成课上例子的实现,用一列显示 全部信息,同时完成修改的功能
- 图书检索功能实现---图书馆客户端
- SWING实现新浪微博客户端(1)自动登录功能 (2)提取关注好友信息
- 安卓项目开发之新闻客户端---新闻客户端app抓取信息
- oracle的blob对象在客户端转化为java.sql.Blob,实现上传图片功能,同时将图片在客户端显示案例
- java Web项目中,利用其过滤功能,实现访问者每次访问服务器时,记录访问者的IP,访问时间,Url等信息,并保存到文件的操作
- 学生信息记录系统,主要实现增删改查功能
- EXCEL增加审计功能,记录每个单元格的修改日志(支持记录多个单元格同时修改时记录审计信息)
- 想请问一下大家安卓信息反馈功能怎么实现呢?