Contents

JSOUP 获取 Nikke cdkey

Contents

这个网站的 cdkey 更新很及时,写了几行代码自动抓取信息,再配合邮件功能和定时器,看还会不会抢不到 XD

@Service
public class NikkeCDKeyService extends ServiceImpl<NikkeCdkeyMapper, NikkeCdkey> {

    @Resource
    private NikkeCdkeyMapper nikkeCdkeyMapper;

    // 爬取 cdkey 信息
    @SneakyThrows
    @Transactional(rollbackFor = Exception.class)
    public Result<Object> getCdKeyInfoByCSS() {
        String url = "https://gamewith.jp/nikke/article/show/371014";
        String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36";
        Document doc = Jsoup.connect(url)
                .userAgent(userAgent)
                .get();
        // 按日期分类出来的 cdkey 表格, 一个日期内可能有多个 cdkey
        // 主要是用来获取日期天数
        Elements codeTableElements = doc.select("#article-body > div.code"); // size:12
        // 总 h3 标签数对应的元素集合
        Elements h3Elements = doc.select("#article-body > h3");
        List<NikkeCdkey> nikkeCdkeyList = new ArrayList<>();
        for (int j = 0, codeTableElementsSize = codeTableElements.size(); j < codeTableElementsSize; j++) {
            Element element = codeTableElements.get(j);
            // 实际发布 cdkey 日期的 h3 标签
            String title = h3Elements.get(j).text();
            Elements cdkeyElements = element.select("table > tbody > tr > td:nth-child(1)");
            Elements rewardElements = element.select("table > tbody > tr > td:nth-child(2)");
            // cdkeyElements 与 rewardElements 是一一对应的, 用哪个 size 都一样
            for (int i = 0; i < cdkeyElements.size(); i++) {
                NikkeCdkey nikkeCdkey = new NikkeCdkey();
                String cdkey = cdkeyElements.get(i).text();
                String reward = rewardElements.get(i).text();
                nikkeCdkey.setTitle(title);
                nikkeCdkey.setCdkey(cdkey);
                nikkeCdkey.setReward(reward);
                nikkeCdkeyList.add(nikkeCdkey);
            }
        }
        int i = nikkeCdkeyMapper.saveOrUpdateByCdkey(nikkeCdkeyList);
        return Result.ok("集合大小: " + i);
    }

    // 展示 cdkey 信息
    public Result<Object> showCDKey() {
        List<NikkeCdkey> nikkeCdkeyList = nikkeCdkeyMapper.selectList(null);
        return Result.ok(nikkeCdkeyList);
    }

}