最近媳妇儿颈椎总难受,就想着在网上挂个骨科去看一下,无奈离得最近的北XX院骨科总是爆满。但是偶尔发现有时能有几个号,想想可能是临时加号或者是别人退的,可也不能让我总一直刷吧。写几段小代码吧~
在简单分析了挂号平台内容后,发现有以下特征:
- 查询剩余号/挂号需要登录
- 查询时服务器使用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