利用jsoup实现学校图书馆自习室预约系统
程序员文章站
2024-03-22 21:38:28
...
利用jsoup实现学校图书馆自习室预约系统
写在前面
之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座。想到了之前学的python爬虫可以实现,但是不会移植到手机端,电脑端又不是很方便,于是便从网上搜了一些相关资料,整合Android studio的知识,写了一个手机app,如下进行一些心路历程的汇总。
参考博文
分析
学校图书馆系统每个学生卡卡号会分配一个id,图书馆大厅中有一个刷卡机器,机器可以完成签到预约,通过HTML解析可以找到每个座位分配到的id。用自己的卡号的id向图书馆的预约系统发送两条请求,一条登录请求,一条预约座位请求,即可完成一次正常的座位预约。
HTML解析部分
- 通过HTML解析,可以获得需要的Host、Referer、User-Agent等等,另外解析参数列表,可以发现自己的学号作为参数在其中。
- 再解析座位请求的参数列表,其中包括了时间和座位id。
- 提取有用信息。
Android Studio部分
程序示范
if (result1==null)
result1="begin";
if (result2==null)
result2="begin";
while (!result1.equals("欢迎使用【************】")) {
try {
/* //登录部分
//获取当前时间*/
Connection conn = Jsoup.connect("**************").timeout(30000);
conn.header("Host", "*************");
conn.header("Referer", "**************");
conn.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
Map<String, String> map = new HashMap<String, String>();
map.put("cardno", "************");
Connection.Response response = conn.ignoreContentType(true).method(Connection.Method.POST).data(map).execute();
cookies = response.cookies();
Document document = Jsoup.connect("***********").cookies(cookies).get();
Elements name = document.select("a[href=#]");//欢迎使用【16027240023】
result1 = name.text();
System.out.println(name.text() + "!!!---------------------------------------------");
Message m = new Message();
m.what = 3;
handler.sendMessage(m);
} catch (IOException e) {
Log.d(TAG, "onCreate: ------------登录部分抛出异常" + e.toString());
run();
}
}
while (!result2.equals("预约失败,该座位已经被预约!")){
//约座部分
Message mm = new Message();
mm.what = 0;
handler.sendMessage(mm);
//获取当前时间
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int day2 = day+1;
int hour = calendar.get(Calendar.HOUR_OF_DAY);
String date = year + "-" + month + "-" + day;
Log.d(TAG, "run: ---------testdate------" + date);
Map<String, String> seat = new HashMap<String, String>();
seat.put("seat_id", "1301");//四楼200 2451 107.290 2101 /101 1 713/二楼1 1301
seat.put("order_date",date);
Connection conn2 = Jsoup.connect("***************").timeout(30000);
conn2.header("Host", "*************");
conn2.header("Referer", "***************");
conn2.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
Connection.Response re = null;
try {
re = conn2.ignoreContentType(true).method(Connection.Method.POST).cookies(cookies).data(seat).execute();
String body = re.body();
bodys = body.split("\"");
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "run: -----------------预约出错");
run();
}
Document dc = null;
try {
dc = Jsoup.connect("****************").cookies(cookies).get();
} catch (IOException e) {
e.printStackTrace();
}
result2 = bodys[5];
System.out.println(result1+"------------------判断-----+++++++++"+result2);
if (result1.equals("欢迎使用【*********】")&&result2.equals("预约成功!")){
Message m = new Message();
m.what = 1;
handler.sendMessage(m);
break;
}else if(result1.equals("欢迎使用【************】")&&result2.equals("预约失败,该座位已经被预约!")){
Message m = new Message();
m.what = 4;
handler.sendMessage(m);
}
else {
Message m = new Message();
m.what = 2;
handler.sendMessage(m);
}
}`
以上是线程中主要的功能模块实现,Android Studio的main和布局代码我就不罗列了,样式主要是下拉列表的实现是需要在main中进行赋值的,按钮用于调用子进程。
总结分析
程序做的十分简陋,好在能实现简单的约座功能,为了不泄露个人隐私以及不给学校带来麻烦,我将地址以及信息改为了*******,有一点遗憾的是在调试过程处理的一些bug无法及时腾到博客上,还有是我的原始计划是,程序打开后设定时间,设定好时间程序在规定时间自动运行,一直到约好座位。但是没有实现,要实现程序不被“杀死”需要用到的知识还有很多,由于时间以及经理上的原因我没有实现,后期有时间可以再进行完善,初步了解了一下,记录下来以供参考:要监听屏幕关闭(亮度?)。