赞
踩
之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座。想到了之前学的python爬虫可以实现,但是不会移植到手机端,电脑端又不是很方便,于是便从网上搜了一些相关资料,整合Android studio的知识,写了一个手机app,如下进行一些心路历程的汇总。
学校图书馆系统每个学生卡卡号会分配一个id,图书馆大厅中有一个刷卡机器,机器可以完成签到预约,通过HTML解析可以找到每个座位分配到的id。用自己的卡号的id向图书馆的预约系统发送两条请求,一条登录请求,一条预约座位请求,即可完成一次正常的座位预约。
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无法及时腾到博客上,还有是我的原始计划是,程序打开后设定时间,设定好时间程序在规定时间自动运行,一直到约好座位。但是没有实现,要实现程序不被“杀死”需要用到的知识还有很多,由于时间以及经理上的原因我没有实现,后期有时间可以再进行完善,初步了解了一下,记录下来以供参考:要监听屏幕关闭(亮度?)。
Connection conn = Jsoup.connect("http://210.44.64.139/touchscreen/seatOrderAction.php?action=payCardLogin");
conn.header("Host", "210.44.64.139");
conn.header("Referer", "http://210.44.64.139/touchscreen/index.php");
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> requestmap = new HashMap<String, String>();
requestmap.put("cardno","3236699395");
Connection.Response response = null;
try {
response = conn.ignoreContentType(true).method(Connection.Method.POST).data(requestmap).execute();
} catch (IOException e) {
e.printStackTrace();
}
Map<String, String> cookies = response.cookies();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。