diff --git a/docs/README.md b/docs/README.md index 7f8046f6c4..a2df3795f7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -602,6 +602,31 @@ GitHub 官方也提供了一些 RSS: +### 看雪 + + + +| 版块 | category | +| ------------ | ---------- | +| 智能设备 | iot | +| 区块链安全 | blockchain | +| Android 安全 | android | +| iOS 安全 | ios | +| 软件逆向 | re | +| 编程技术 | coding | +| 加壳脱壳 | unpack | +| 密码算法 | crypto | +| 二进制漏洞 | vuln | +| CrackMe | crackme | +| Pwn | pwn | +| WEB 安全 | web | +| 全站 | all | + +| 类型 | type | +| -------- | ------ | +| 最新主题 | latest | +| 精华主题 | digest | + ## 直播 ### 哔哩哔哩直播 diff --git a/router.js b/router.js index ba0aa48acb..965e918971 100644 --- a/router.js +++ b/router.js @@ -614,4 +614,7 @@ router.get('/ft/chinese/:channel?', require('./routes/ft/chinese')); // The Verge router.get('/verge', require('./routes/verge/index')); +// 看雪 +router.get('/pediy/topic/:category?/:type?', require('./routes/pediy/topic')); + module.exports = router; diff --git a/routes/pediy/topic.js b/routes/pediy/topic.js new file mode 100644 index 0000000000..043c14c9a5 --- /dev/null +++ b/routes/pediy/topic.js @@ -0,0 +1,95 @@ +const axios = require('../../utils/axios'); +const dateHelper = require('../../utils/date'); +const cheerio = require('cheerio'); + +const baseUrl = 'https://bbs.pediy.com/'; +const categoryId = { + iot: [128, '智能设备'], + blockchain: [172, '区块链安全'], + android: [161, 'Android安全'], + ios: [166, 'iOS安全'], + re: [4, '软件逆向'], + coding: [41, '编程技术'], + unpack: [88, '加壳脱壳'], + crypto: [132, '密码算法'], + vuln: [150, '二进制漏洞'], + crackme: [37, 'CrackMe'], + pwn: [171, 'Pwn'], + web: [151, 'WEB安全'], +}; + +module.exports = async (ctx) => { + const category = ctx.params.category || 'all'; + const type = ctx.params.type || 'latest'; + let path; + let title; + let isSpecific; + + if (categoryId.hasOwnProperty(category)) { + isSpecific = true; + if (type === 'digest') { + // type为digest时只获取精华帖 + path = `forum-${categoryId[category][0]}-1.htm?digest=1`; + title = `看雪论坛精华主题 - ${categoryId[category][1]}`; + } else { + // type为空/非法/latest时则只获取最新帖 + path = `forum-${categoryId[category][0]}.html`; + title = `看雪论坛最新主题 - ${categoryId[category][1]}`; + } + } else { + // category未知时则获取全站最新帖 + isSpecific = false; + if (category === 'digest') { + path = 'new-digest.htm'; + title = '看雪论坛精华主题'; + } else { + path = 'new-tid.htm'; + title = '看雪论坛最新主题'; + } + } + + const response = await axios({ + method: 'get', + url: baseUrl + path, + headers: { + Referer: baseUrl, + }, + }); + + const data = response.data; + const $ = cheerio.load(data); + + ctx.state.data = { + title: `${title}`, + link: baseUrl + path, + item: $('.thread') + .map((_, elem) => { + const subject = $('.subject a', elem).eq(1); + const author = $('.username', elem).eq(0); + + let pubDate = $('.date', elem).eq(0); + if (pubDate.text().indexOf('前') !== -1) { + pubDate = dateHelper(pubDate.text(), 8); + } else { + pubDate = pubDate.text(); + } + + let topic; + if (isSpecific) { + topic = categoryId[category][1]; + } else { + topic = $('.subject a.small', elem) + .eq(0) + .text(); + } + + return { + title: subject.text(), + link: baseUrl + subject.attr('href'), + pubDate: pubDate, + description: `作者: ${author.text()} 版块: ${topic}`, + }; + }) + .get(), + }; +};