如何用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

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

你可能感兴趣的:(JSoup,awt)