需求:當用戶點擊此按鈕,后臺爬蟲幫我爬當天酷狗飆升榜的列表下來,并返回。 酷狗飆升榜在這。
此handler專門處理爬蟲分類Event事件。
RankHandler.java:(負責處理消息部分)
public class RankHandler implements WxMessageHandler {
private static RankHandler instance = null;
private boolean isRun = false;
private RankHandler() {}
public static synchronized RankHandler getInstance() {
if (instance == null) {
instance = new RankHandler();
}
return instance;
}
@Override
public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService iService)
throws WxErrorException {
StringBuilder result = new StringBuilder();
if (!getIsRun()) {
setRun(true);
try {
result = execute(wxMessage);
} catch (Exception e) {
e.printStackTrace();
} finally {
setRun(false);
}
} else {
result.append(ResponseConst.DUPLICATE_REQUEST);
}
return WxXmlOutMessage.TEXT().content(result.toString()).toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build();
}
private StringBuilder execute(WxXmlMessage wxMessage) throws Exception{
StringBuilder stringBuilder = new StringBuilder();
try {
switch (wxMessage.getEventKey()) {
case MenuKey.HOT_SONG:
collectSongRank(stringBuilder, UrlConst.HOT_RANK_URL);
break;
default:
stringBuilder.append("暫時無此分類噢!");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder;
}
private void collectSongRank(StringBuilder stringBuilder, String url) throws IOException {
RankCollector collector = new RankCollector();
Rank rank = collector.collect(url);
stringBuilder.append("\uD83D\uDD25" + rank.getScope() + "[" + rank.getUpdateTime() + "]\n\n");
for (HotSinger hotSinger : rank.getHotSingerList()) {
stringBuilder.append(hotSinger.getName() + "-" + hotSinger.getHotSong() + "\n");
}
}
private synchronized boolean getIsRun() {
return isRun;
}
private synchronized void setRun(boolean run) {
isRun = run;
}
}
RankCollector.java: (爬蟲部分)
public class RankCollector {
public Rank collect(String url) throws IOException {
return getRank(url);
}
private Rank getRank(String rankUrl) throws IOException {
Rank rank = new Rank();
String body = HttpClientUtil.get(rankUrl);
Document doc = Jsoup.parse(body);
rank.setScope(doc.select("a[class=current]").attr("title"));
rank.setUpdateTime(doc.select("span[class=rank_update]").text());
List<Element> aElements = doc.select("a[data-active=playDwn]");
for(int i = 0; i < aElements.size(); i++){
String[] splitArray = aElements.get(i).text().split("-");
String name = splitArray[0].toString().trim();
String song = splitArray[1].toString().trim();
rank.getHotSingerList().add(new HotSinger(doc.select("a[class=current]").attr("title"), name, song));
}
return rank;
}
}
修改新增WxController的路由規(guī)則:
router.rule().event(WxConsts.EVT_CLICK).eventKey(MenuKey.HELP).handler(HelpDocHandler.getInstance()).next()
.rule().eventKey(MenuKey.HOT_SONG).handler(RankHandler.getInstance()).end();
當天的飆升榜就這樣返回回來了~很激動有木有!
更多建議: