wx-tools 完善菜單欄的功能

2023-03-22 17:19 更新

2.6.1 按鈕[分類(lèi)-飆升榜]

需求:當(dāng)用戶(hù)點(diǎn)擊此按鈕,后臺(tái)爬蟲(chóng)幫我爬當(dāng)天酷狗飆升榜的列表下來(lái),并返回。 酷狗飆升榜在這。

  • 爬蟲(chóng)技術(shù)不是本文檔的主要內(nèi)容,所以在此就不細(xì)講如何爬下數(shù)據(jù)。有興趣的同學(xué)可以閱讀下源代碼。(原理很簡(jiǎn)單,僅僅使用HttpClient+Jsoup)

添加RankHandler.java

此handler專(zhuān)門(mén)處理爬蟲(chóng)分類(lèi)Event事件。

RankHandler.java:(負(fù)責(zé)處理消息部分)

  1. public class RankHandler implements WxMessageHandler {
  2. private static RankHandler instance = null;
  3. private boolean isRun = false;
  4. private RankHandler() {}
  5. public static synchronized RankHandler getInstance() {
  6. if (instance == null) {
  7. instance = new RankHandler();
  8. }
  9. return instance;
  10. }
  11. @Override
  12. public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService iService)
  13. throws WxErrorException {
  14. StringBuilder result = new StringBuilder();
  15. if (!getIsRun()) {
  16. setRun(true);
  17. try {
  18. result = execute(wxMessage);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. } finally {
  22. setRun(false);
  23. }
  24. } else {
  25. result.append(ResponseConst.DUPLICATE_REQUEST);
  26. }
  27. return WxXmlOutMessage.TEXT().content(result.toString()).toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build();
  28. }
  29. private StringBuilder execute(WxXmlMessage wxMessage) throws Exception{
  30. StringBuilder stringBuilder = new StringBuilder();
  31. try {
  32. switch (wxMessage.getEventKey()) {
  33. case MenuKey.HOT_SONG:
  34. collectSongRank(stringBuilder, UrlConst.HOT_RANK_URL);
  35. break;
  36. default:
  37. stringBuilder.append("暫時(shí)無(wú)此分類(lèi)噢!");
  38. break;
  39. }
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. return stringBuilder;
  44. }
  45. private void collectSongRank(StringBuilder stringBuilder, String url) throws IOException {
  46. RankCollector collector = new RankCollector();
  47. Rank rank = collector.collect(url);
  48. stringBuilder.append("\uD83D\uDD25" + rank.getScope() + "[" + rank.getUpdateTime() + "]\n\n");
  49. for (HotSinger hotSinger : rank.getHotSingerList()) {
  50. stringBuilder.append(hotSinger.getName() + "-" + hotSinger.getHotSong() + "\n");
  51. }
  52. }
  53. private synchronized boolean getIsRun() {
  54. return isRun;
  55. }
  56. private synchronized void setRun(boolean run) {
  57. isRun = run;
  58. }
  59. }

RankCollector.java: (爬蟲(chóng)部分)

  1. public class RankCollector {
  2. public Rank collect(String url) throws IOException {
  3. return getRank(url);
  4. }
  5. private Rank getRank(String rankUrl) throws IOException {
  6. Rank rank = new Rank();
  7. String body = HttpClientUtil.get(rankUrl);
  8. Document doc = Jsoup.parse(body);
  9. rank.setScope(doc.select("a[class=current]").attr("title"));
  10. rank.setUpdateTime(doc.select("span[class=rank_update]").text());
  11. List<Element> aElements = doc.select("a[data-active=playDwn]");
  12. for(int i = 0; i < aElements.size(); i++){
  13. String[] splitArray = aElements.get(i).text().split("-");
  14. String name = splitArray[0].toString().trim();
  15. String song = splitArray[1].toString().trim();
  16. rank.getHotSingerList().add(new HotSinger(doc.select("a[class=current]").attr("title"), name, song));
  17. }
  18. return rank;
  19. }
  20. }

添加新的規(guī)則(Rule)

修改新增WxController的路由規(guī)則:

  1. router.rule().event(WxConsts.EVT_CLICK).eventKey(MenuKey.HELP).handler(HelpDocHandler.getInstance()).next()
  2. .rule().eventKey(MenuKey.HOT_SONG).handler(RankHandler.getInstance()).end();

  • 這里解釋一下:next()和end()的意思。
  • next() 表示消息經(jīng)過(guò)第一個(gè)規(guī)則(Rule)之后,允許繼續(xù)匹配下面的規(guī)則,代表著同一個(gè)消息有可能被多個(gè)Handler處理。
  • end() 表示規(guī)則的結(jié)束。當(dāng)消息滿(mǎn)足某條規(guī)則時(shí)遇到end(),不會(huì)再往下匹配規(guī)則,就此結(jié)束。

重新運(yùn)行,并測(cè)試

HotSong

當(dāng)天的飆升榜就這樣返回回來(lái)了~很激動(dòng)有木有!

  • 好了同一原理實(shí)現(xiàn)其他4個(gè)排行榜按鈕的功能,這里就不展示了。詳情可以查看demo源碼。
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)