wx-tools 完善菜單欄的功能

2023-03-22 17:19 更新

2.6.1 按鈕[分類-飆升榜]

需求:當用戶點擊此按鈕,后臺爬蟲幫我爬當天酷狗飆升榜的列表下來,并返回。 酷狗飆升榜在這。

  • 爬蟲技術不是本文檔的主要內容,所以在此就不細講如何爬下數據。有興趣的同學可以閱讀下源代碼。(原理很簡單,僅僅使用HttpClient+Jsoup)

添加RankHandler.java

此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;
    }
}

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

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

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

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

重新運行,并測試

HotSong

當天的飆升榜就這樣返回回來了~很激動有木有!

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號