feat: BT之家RSS | feat: 浙江大学城市学院计算分院全局搜索,新闻全文 (#3680)

This commit is contained in:
Anthony_wang
2020-01-08 17:22:47 +08:00
committed by DIYgod
parent fbe0085348
commit aaf3b6d163
6 changed files with 199 additions and 3 deletions

View File

@@ -37,6 +37,25 @@ pageClass: routes
见 [#bilibili](/social-media.html#bilibili)
## BT 之家
### 最新种子
<Route author="zhang-wangz" example="/btzj/base" path="/btzj/:type?" anticrawler="1" :paramsDesc="['type,见下表']">
| base | govern |
| ------------------------ | ---------------------- |
| https://www.88btbtt.com/ | http://www.1btjia.com/ |
</Route>
::: tip 提示
由于 BT 之家域名有多个. 此 feed 对应[`https://www.88btbtt.com`](https://www.88btbtt.com)域名和[`http://www.1btjia.com/`](http://www.1btjia.com/)域名.
可空,默认为 base
:::
## EZTV
::: tip 提示

View File

@@ -1096,7 +1096,18 @@ https://rsshub.app/**nuist**/`bulletin` 或 https://rsshub.app/**nuist**/`bullet
### 新闻通知
<Route author="zhang-wangz" example="/zucc/news/latest" path="/zucc/news/latest"></Route>
<Route author="zhang-wangz" example="/zucc/news/latest" path="/zucc/news/latest">
</Route>
### 计算分院全站搜索
<Route author="zhang-wangz" example="/zucc/cssearch/latest/0/白卡" path="/zucc/cssearch/latest/:webVpn?/:key?" :paramsDesc="['见下表(默认为0)','关键词(默认为白卡)']">
| 0 | 1 |
| ------------------ | -------------------- |
| 文章地址为正常地址 | 获取的是 webvpn 地址 |
</Route>
## 浙江工商大学

View File

@@ -793,6 +793,9 @@ router.get('/kirara/news', require('./routes/kirara/news'));
router.get('/dytt', require('./routes/dytt/index'));
router.get('/dytt/index', require('./routes/dytt/index')); // 兼容
// BT之家
router.get('/btzj/:type?', require('./routes/btzj/index'));
// 人生05电影网
router.get('/rs05/rs05', require('./routes/rs05/rs05'));
@@ -1322,6 +1325,7 @@ router.get('/zju/cst/:type', require('./routes/universities/zju/cst'));
// 浙江大学城市学院
router.get('/zucc/news/latest', require('./routes/universities/zucc/news'));
router.get('/zucc/cssearch/latest/:webVpn/:key/', require('./routes/universities/zucc/cssearch'));
// 华中师范大学
router.get('/ccnu/career', require('./routes/universities/ccnu/career'));

77
lib/routes/btzj/index.js Normal file
View File

@@ -0,0 +1,77 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
const maps = {
base: 'https://www.88btbtt.com/',
govern: 'http://www.1btjia.com/',
};
// const baseSuffix = 'forum-index-fid-951.htm';
async function load(link, type, ctx) {
const cache = await ctx.cache.get(link);
if (cache) {
return JSON.parse(cache);
}
const response = await got({
method: 'get',
url: link,
responseType: 'buffer',
});
const responseHtml = iconv.decode(response.data, 'utf-8');
const $ = cheerio.load(responseHtml);
const other = {};
const ela$ = $('#body > div > table:nth-child(2) > tbody > tr:nth-child(1) > td.post_td > div.attachlist > table > tbody > tr:nth-child(3) > td:nth-child(1) > a');
const ela$1 = $('#body > div > table:nth-child(2) > tbody > tr:nth-child(1) > td.post_td > div > div.attachlist > table > tbody > tr:nth-child(3) > td:nth-child(1) > a');
const content$ = $('.bg1.border.post');
const downloadPrefix = type === 'base' ? 'torrent下载链接:<br/><br/>' + maps[type] : 'torrent下载链接:<br/><br/>';
const downloada = type === 'base' ? ela$.attr('href') : ela$1.attr('href');
const downloadURL = downloada === undefined ? '无下载链接' : downloada.replace('dialog', 'download').toString();
const content = content$.html().toString();
other.des = downloadPrefix + downloadURL + '<br/><br/>' + '内容简介:<br/>' + content;
other.pubDate = type === 'base' ? new Date($('.bg2.border b:nth-child(2)').html()).toUTCString() : new Date().toUTCString();
ctx.cache.set(link, JSON.stringify(other));
return other;
}
module.exports = async (ctx) => {
const type = ctx.params.type || 'base';
const response = await got({
method: 'get',
url: maps[type],
});
const htmldata = response.data;
const $ = cheerio.load(htmldata);
const list = $('.subject_link.thread-new').slice(0, 10);
const base_item = list
.map((_, e) => ({
title: type === 'base' ? e.attribs.title : $(e).html(),
link: type === 'base' ? maps[type] + e.attribs.href : e.attribs.href,
}))
.get()
.reverse();
const items = await Promise.all(
base_item.map(async (item) => {
const other = await load(item.link, type, ctx);
return {
enclosure_url: String(item.link),
enclosure_type: 'application/x-bittorrent',
title: item.title,
description: other.des,
pubDate: other.pubDate,
link: item.link,
};
})
);
const data = {
title: 'BT之家',
link: maps[type],
description: 'BT之家RSS',
item: items,
};
ctx.state.data = data;
};

View File

@@ -0,0 +1,53 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const baseUrl = 'http://jsxy.zucc.edu.cn/';
const vpnUrl = 'http://jsxy.webvpn.zucc.edu.cn/';
const maps = {
search: '/module/sitesearch/index.jsp?keyword=vc_title&columnid=0&webid=2&modalunitid=13014',
};
function convert(raw) {
return unescape(raw.replace(/&#x/g, '%u').replace(/;/g, ''));
}
module.exports = async (ctx) => {
const keyVal = ctx.params.key || encodeURIComponent('白卡');
const pageNum = 1;
const vpnBool = Number.parseInt(ctx.params.webVpn) || 0;
const response = await got({
method: 'get',
url: baseUrl + maps.search.concat('&keyvalue=', encodeURIComponent(keyVal), '&currpage=', pageNum.toString()),
});
const data = response.data;
const $ = cheerio.load(data);
const resItem = [];
$('a').each((index, el) => {
if ($(el).attr('target') === '_blank') {
const item = {};
item.title = convert($(el).html());
item.link =
vpnBool === 0
? $(el).attr('href')
: vpnUrl +
$(el)
.attr('href')
.slice(24);
const dateList = $(el)
.attr('href')
.match(/\/\d+/g)
.map((ele) => ele.toString().replace('/', ''));
item.pubDate = new Date(dateList.join('-')).toUTCString();
item.description = '<br/>' + $(el).attr('title') + '<br/>部分全文内容需使用校园网或VPN获取';
item.guid = convert($(el).html());
resItem.push(item);
}
});
ctx.state.data = {
title: '浙江大学城市学院计算分院全站搜索:' + keyVal,
link: vpnBool === 0 ? baseUrl : vpnUrl,
item: resItem,
};
};

View File

@@ -1,5 +1,6 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
const baseUrl = 'http://www.zucc.edu.cn';
const maps = {
@@ -21,7 +22,6 @@ module.exports = async (ctx) => {
const reg = new RegExp(match, 'g');
const res = xmlGet.match(reg);
// eslint-disable-next-line no-unused-vars
const chapterItem = res.map((elem) => ({
link:
baseUrl +
@@ -38,10 +38,42 @@ module.exports = async (ctx) => {
.toString()
.slice(6, -7),
}));
const chapterItemLatest = chapterItem.slice(0, 10).reverse();
const items = await Promise.all(
chapterItemLatest.map(async (item) => {
const cache = await ctx.cache.get(item.link);
if (cache) {
return Promise.resolve(JSON.parse(cache));
}
const response = await got({
method: 'get',
url: item.link,
responseType: 'buffer',
});
const responseHtml = iconv.decode(response.data, 'utf-8');
const $ = cheerio.load(responseHtml);
let description = '';
$('div#zoom').each((index, ele) => {
description = $(ele).html();
description += '\n';
});
const single = {
title: item.title,
description,
link: item.link,
};
ctx.cache.set(item.link, JSON.stringify(single));
return Promise.resolve(single);
})
);
ctx.state.data = {
title: '浙江大学城市学院新闻报道',
link: baseUrl,
item: chapterItem,
item: items,
};
};