当前位置:   article > 正文

(图书馆抢座助手)利用jsoup实现学校图书馆自习室预约系统_自习室抢坐神器

自习室抢坐神器

(图书馆抢座助手)利用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);

            }
        }`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

以上是线程中主要的功能模块实现,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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/173949
推荐阅读
相关标签
  

闽ICP备14008679号