欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用jsoup实现学校图书馆自习室预约系统

程序员文章站 2024-03-22 21:38:28
...

利用jsoup实现学校图书馆自习室预约系统

写在前面

之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座。想到了之前学的python爬虫可以实现,但是不会移植到手机端,电脑端又不是很方便,于是便从网上搜了一些相关资料,整合Android studio的知识,写了一个手机app,如下进行一些心路历程的汇总。

参考博文

分析

学校图书馆系统每个学生卡卡号会分配一个id,图书馆大厅中有一个刷卡机器,机器可以完成签到预约,通过HTML解析可以找到每个座位分配到的id。用自己的卡号的id向图书馆的预约系统发送两条请求,一条登录请求,一条预约座位请求,即可完成一次正常的座位预约。
利用jsoup实现学校图书馆自习室预约系统

HTML解析部分

利用jsoup实现学校图书馆自习室预约系统利用jsoup实现学校图书馆自习室预约系统

  • 通过HTML解析,可以获得需要的Host、Referer、User-Agent等等,另外解析参数列表,可以发现自己的学号作为参数在其中。
  • 再解析座位请求的参数列表,其中包括了时间和座位id。
  • 提取有用信息。

Android Studio部分

程序示范

利用jsoup实现学校图书馆自习室预约系统

    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无法及时腾到博客上,还有是我的原始计划是,程序打开后设定时间,设定好时间程序在规定时间自动运行,一直到约好座位。但是没有实现,要实现程序不被“杀死”需要用到的知识还有很多,由于时间以及经理上的原因我没有实现,后期有时间可以再进行完善,初步了解了一下,记录下来以供参考:要监听屏幕关闭(亮度?)。