标签:
最近媳妇儿颈椎总难受,就想着在网上挂个骨科去看一下,无奈离得最近的北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
本博文仅限技术交流,切勿以此用于非法及不正当用途!如进行非法用途,本人概不负责哈
标签:
原文地址:http://my.oschina.net/bfleeee/blog/382656