如何用Java监控XX挂号平台X科的可用号

最近媳妇儿颈椎总难受,就想着在网上挂个骨科去看一下,无奈离得最近的北XX院骨科总是爆满。但是偶尔发现有时能有几个号,想想可能是临时加号或者是别人退的,可也不能让我总一直刷吧。写几段小代码吧~

在简单分析了挂号平台内容后,发现有以下特征:

  1. 查询剩余号/挂号需要登录
  2. 查询时服务器使用cookie验证了登录状态,使用Referer进行判断来源,不符合的请求返回登录页面或者不返回任何内容
    package health.guahao;
    import java.awt.AWTException;
    import java.awt.Desktop;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.io.IOException;
    import java.net.SocketTimeoutException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.jsoup.Connection;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class ShuaGuahao {
        static String url = "http://www.xxxxxphp?xxx";
        public static List<String> run() throws IOException {
            Connection conn = Jsoup.connect(url)
                    .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                    .header("Accept-Encoding", "gzip, deflate, sdch")
                    .header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6")
                    .header("Host", "www.xxxx")
                    // Referer必须有
                    .header("Referer", "www.xxxx/ref")
                    .cookie("Hm_*****af", "1*****9")
                    .cookie("__c_*****9f", "e*****4")
                    .cookie("__c_*****HC", "f*****7")
                    .cookie("Hm_*****8b", "1*****4")
                    .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36")
                    .header("Connection","keep-alive");
            conn.timeout(10000); // 超时 10秒
            Document doc = conn.get();
            if(doc.getAllElements().size() < 5){
                System.err.println(doc);
            }
            Elements eles = doc.select(".greenbg a");
            if(eles != null && eles.size() > 0){
                System.out.println(eles);
                            // 这个list保存了挂号剩余量的页面url,其实没什么用,因为这个页面不能直接打开
                List<String> list = new ArrayList<String>();
                for(Element ele : eles){
                    String uri = ele.attr("href");
                    list.add(uri);
                }
                return list;
            }
            return null;
    
        }
        public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException, AWTException {
            int x = 0;
            for(;;){
                List<String> list = null;
                try{
                    list = run();
                }catch(SocketTimeoutException e){
                    e.printStackTrace();
                }
                if(list != null){
                    // 打开IE
    //              String cmdStr = "cmd /c start iexplorer "+url;
    //              Runtime.getRuntime().exec(cmdStr);
                    // 打开默认浏览器
    //              Desktop.getDesktop().browse(new URI(url));
                    openChrome();
                }
                Thread.sleep(10*1000);
                System.out.println("已刷"+(++x)+"次");
            }
        }
        private static void openChrome() throws IOException, URISyntaxException, AWTException {
            Desktop.getDesktop().browse(new URI("http://www.baidu.com/s?wd=%E5%88%B7%E5%A5%BD%E5%BF%AB%E5%8E%BB"));
                    // 模拟按键
            Robot r = new Robot();
            r.delay(1000);
            r.keyPress(KeyEvent.VK_CONTROL);
            r.keyPress(KeyEvent.VK_W);
    
            r.keyRelease(KeyEvent.VK_CONTROL);
            r.keyRelease(KeyEvent.VK_W);
    
            r.delay(500);
    
            r.keyPress(KeyEvent.VK_CONTROL);
            r.keyPress(KeyEvent.VK_1);
    
            r.keyRelease(KeyEvent.VK_CONTROL);
            r.keyRelease(KeyEvent.VK_1);
    
            r.delay(500);
            r.keyPress(KeyEvent.VK_F5);
            r.keyRelease(KeyEvent.VK_F5);
        }
    
    }
    

程序每隔10秒使用Jsoup请求页面并解析是否含有相应元素,当发现有余号时,会自动打开默认浏览器,这里用的是Chrome,需要在Chrome的第一个标签页登录好挂号网站并转到科室挂号查询页。程序会自动进行刷新。以前没怎么玩过awt,今天发现写点小工具也有点意思 :P

本博文仅限技术交流,切勿以此用于非法及不正当用途!如进行非法用途,本人概不负责哈

时间: 2024-08-07 09:29:28

如何用Java监控XX挂号平台X科的可用号的相关文章

开源Java监控平台Zorka的基本使用方法

在Java的插桩工具方面,我们一直在使用Kieker,今天简单研究了另外一个Java监控平台Zorka,这里以Windows+Tomcat为例记录一下最基本的安装过程: 其主页是:http://zorka.io/,GitHub上的项目主页是:https://github.com/jitlogic/zorka,在其主页上有其Agent端的下载页面:http://zorka.io/downloads.html .下载zorka-1.0.11.zip并将其解压.将解压后的文件夹拷贝到Tomcat根目录

运用Java对微信公众平台二次开发技术——开发者模式接入

当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWeb知识:JSP/Servlet/JDBC/EL 二.开发环境 Eclipse EE JDK 1.7(用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!重要的事情说4遍,当初被坑了,愣是不知道错在哪,检查了无数遍代码,就是不知道哪里错了) 三.注册微信号 http

最新工控\建模仿真\组态\监控集成开发平台源码解决方案2018

最新工控\建模仿真\组态\监控集成开发平台源码解决方案2018 -- ---所有VC++源码100%提供! 使用E-Form++可视化企业版本,构建属于自己的专业工控.建模仿真. 监控组态.培训仿真平台! -- 100%源码 (全部采用Visual C++/MFC编写)彻底开放组态平台!  下载E-Form++全功能免费评估版本 -- 下载地址 (2018年全新!)  下载此组态解决方案-- 下载地址1 下载地址2 (2018年全新!) HMI硬件采集数据接口代码及说明: 下载硬件数据接口dll

Java大型互联网-构建高并发和高可用的电商平台架构实践原理

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. "高可用性"(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性. 一. 设计理念 1. 空间换时间 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才是检索结果.首先,电商的搜索引擎并没有爬虫系统,因为所有的数据都是结构化的,一般都是微软的数据库或者 Oracle 的数据库,所以不用像百度一样用「爬虫」去不断去别的网站找内容,当然,电商其实也有自己的「爬虫」系统,一般都是抓取友商的价格,再对自己进行调整. 第二点,就是电商搜索引擎的过滤功能其实比

Java生鲜电商平台-微服务架构概述

Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中.尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化的速度迟缓并且变革动力不足. 其中的原因存在着复杂性以及多样性,我想主要的原因是没有一套整体的解决方案能够让工程师在面临稳定性风险下,毅然决然地实施系统重构.当系统应用规模随着业务的迅速发展时,系统的重要性愈发突出,开发人员将对系统的改造尤为敏感,从之前的徘徊犹豫,随之变得更加保守,只能延续过去的技

Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品时,结算时满足一定条件会减免一定金额.通过发放优惠券,引导用户购买相应的商品,在下单的时候抵扣一定的费用,达到促销.提高客单价的目标. 优惠券不论在线上还是线下,适用范围都比较广泛.例如滴滴发的专车券.外卖平台发的外卖券.京东淘宝的优惠券等. 1.优惠券的类型和应用场景 优惠券有多种分类方式,按照使

[Java] 监控java对象回收的原理与实现

监控Java对象回收的原理与实现 一.监控Java对象回收的目的 监控Java对象是否回收的目的是:为了实现内存泄露报警. 内存泄露是指程序中对象生命周期(点击查看详情)已经进入不可见阶段,但由于编码错误或系统原因,仍然存在着GC roots持有或间接持有该对象的引用,导致该对象的生命周期无法继续向下流转,也就无法释放的现象.简单的来说即是:已实例化的对象长期被持有且无法释放或不能按照对象正常的生命周期进行释放.(点击这里查看<[Android]内存泄露排查实战手记>) 实现内存泄露报警,可以

eclipse不能自动编译XX.java为XX.classs

问题描述:eclipse不能自动编译XX.java为XX.classs 原因:今天下午写代码,因为需要引入jstl包,引入后发现原来项目中已经引入了,然后我又把包删除了,忘记删除java build path 中的jar包.但是一直不报错.我觉得郁闷惨了. 解决办法:将java build path 中的有错的jar包 remove掉就可以了. 总结:经验不足,慢慢积累吧.