增加:看雪论坛主题帖 (#854)

This commit is contained in:
Jiaxi ®
2018-10-11 11:04:10 +08:00
committed by DIYgod
parent 8899aff593
commit 0a1cb245e2
3 changed files with 123 additions and 0 deletions

View File

@@ -602,6 +602,31 @@ GitHub 官方也提供了一些 RSS:
<route name="博文" author="imlonghao" example="/linkedkeeper/sub/1" path="/linkedkeeper/:type/:id?" :paramsDesc="['博文分类, 为 URL 中 `.action` 的文件名', '分区或标签的 ID, 对应 URL 中的 `sid``tid`']"/>
### 看雪
<route name="论坛" author="renzhexigua" example="/pediy/topic/android/digest" path="/pediy/topic/:category?/:type?" :paramsDesc="['版块, 缺省为`all`', '类型, 缺省为`latest`']"/>
| 版块 | category |
| ------------ | ---------- |
| 智能设备 | iot |
| 区块链安全 | blockchain |
| Android 安全 | android |
| iOS 安全 | ios |
| 软件逆向 | re |
| 编程技术 | coding |
| 加壳脱壳 | unpack |
| 密码算法 | crypto |
| 二进制漏洞 | vuln |
| CrackMe | crackme |
| Pwn | pwn |
| WEB 安全 | web |
| 全站 | all |
| 类型 | type |
| -------- | ------ |
| 最新主题 | latest |
| 精华主题 | digest |
## 直播
### 哔哩哔哩直播

View File

@@ -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;

95
routes/pediy/topic.js Normal file
View File

@@ -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(),
};
};