feat: remove notOperational routes - anime
This commit is contained in:
parent
8a4f3e8934
commit
7a8c1bc18f
|
|
@ -51,9 +51,7 @@
|
|||
{ title: '经济信息工程学院 - 学院新闻', docs: 'https://docs.rsshub.app/routes/university#xi-nan-cai-jing-da-xue', source: '/index/xyxw.htm', target: '/swufe/seie/xyxw' },
|
||||
],
|
||||
},
|
||||
'ishuhui.com': { _name: '鼠绘漫画', www: [{ title: '鼠绘漫画', docs: 'https://docs.rsshub.app/routes/anime#shu-hui-man-hua', source: '/comics/anime/:id', target: '/shuhui/comics/:id' }] },
|
||||
'www.chicagotribune.com': { _name: 'Chicago Tribune', www: [{ title: 'Chicago Tribune', docs: 'https://docs.rsshub.app/routes/traditional_media#chicago-tribune', source: '/' }] },
|
||||
'haimaoba.com': { _name: '海猫吧', www: [{ title: '漫画更新', docs: 'https://docs.rsshub.app/routes/anime#hai-mao-ba', source: '/catalog/:id', target: '/haimaoba/:id' }] },
|
||||
'pgyer.com': { _name: '蒲公英应用分发', www: [{ title: 'app更新', docs: 'https://docs.rsshub.app/routes/program-update#pu-gong-ying-ying-yong-fen-fa', source: '/:app', target: '/pgyer/:app' }] },
|
||||
'wineyun.com': { _name: '酒云网', www: [{ title: '最新商品', docs: 'https://docs.rsshub.app/routes/other#jiu-yun-wang', source: ['/:category'], target: '/wineyun/:category' }] },
|
||||
'playstation.com': {
|
||||
|
|
@ -74,14 +72,6 @@
|
|||
{ title: '最新消息', docs: 'https://docs.rsshub.app/routes/game#guai-wu-lie-ren-shi-jie', source: ['', '/*tpath'], target: '/mhw/news' },
|
||||
],
|
||||
},
|
||||
'vgtime.com': {
|
||||
_name: '游戏时光',
|
||||
www: [
|
||||
{ title: '新闻', docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang', source: '/topic/index.', target: '/vgtime/news' },
|
||||
{ title: '游戏发售表', docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang', source: '/game/release.', target: '/vgtime/release' },
|
||||
{ title: '关键词资讯', docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang', source: '/search/list.', target: (params, url) => `/vgtime/keyword/${new URL(url).searchParams.get('keyword')}` },
|
||||
],
|
||||
},
|
||||
'bing.com': { _name: 'Bing', www: [{ title: '每日壁纸', docs: 'https://docs.rsshub.app/routes/picture#bing-bi-zhi', source: '', target: '/bing' }] },
|
||||
'wegene.com': {
|
||||
_name: 'WeGene',
|
||||
|
|
@ -90,7 +80,6 @@
|
|||
{ title: '栏目', docs: 'https://docs.rsshub.app/routes/other#wegene', source: '/crowdsourcing', target: '/wegene/column/all/all' },
|
||||
],
|
||||
},
|
||||
'3ycy.com': { _name: '三界异次元', www: [{ title: '最近更新', docs: 'https://docs.rsshub.app/routes/anime#san-jie-yi-ci-yuan', source: '/', target: '/3ycy/home' }] },
|
||||
'emi-nitta.net': {
|
||||
_name: 'Emi Nitta',
|
||||
'.': [
|
||||
|
|
|
|||
|
|
@ -56,17 +56,6 @@ module.exports = {
|
|||
},
|
||||
],
|
||||
},
|
||||
'ishuhui.com': {
|
||||
_name: '鼠绘漫画',
|
||||
www: [
|
||||
{
|
||||
title: '鼠绘漫画',
|
||||
docs: 'https://docs.rsshub.app/routes/anime#shu-hui-man-hua',
|
||||
source: '/comics/anime/:id',
|
||||
target: '/shuhui/comics/:id',
|
||||
},
|
||||
],
|
||||
},
|
||||
'www.chicagotribune.com': {
|
||||
_name: 'Chicago Tribune',
|
||||
www: [
|
||||
|
|
@ -77,17 +66,6 @@ module.exports = {
|
|||
},
|
||||
],
|
||||
},
|
||||
'haimaoba.com': {
|
||||
_name: '海猫吧',
|
||||
www: [
|
||||
{
|
||||
title: '漫画更新',
|
||||
docs: 'https://docs.rsshub.app/routes/anime#hai-mao-ba',
|
||||
source: '/catalog/:id',
|
||||
target: '/haimaoba/:id',
|
||||
},
|
||||
],
|
||||
},
|
||||
'pgyer.com': {
|
||||
_name: '蒲公英应用分发',
|
||||
www: [
|
||||
|
|
@ -154,29 +132,6 @@ module.exports = {
|
|||
},
|
||||
],
|
||||
},
|
||||
'vgtime.com': {
|
||||
_name: '游戏时光',
|
||||
www: [
|
||||
{
|
||||
title: '新闻',
|
||||
docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang',
|
||||
source: '/topic/index.jhtml',
|
||||
target: '/vgtime/news',
|
||||
},
|
||||
{
|
||||
title: '游戏发售表',
|
||||
docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang',
|
||||
source: '/game/release.jhtml',
|
||||
target: '/vgtime/release',
|
||||
},
|
||||
{
|
||||
title: '关键词资讯',
|
||||
docs: 'https://docs.rsshub.app/routes/game#you-xi-shi-guang',
|
||||
source: '/search/list.jhtml',
|
||||
target: (params, url) => `/vgtime/keyword/${new URL(url).searchParams.get('keyword')}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
'bing.com': {
|
||||
_name: 'Bing',
|
||||
www: [
|
||||
|
|
@ -205,17 +160,6 @@ module.exports = {
|
|||
},
|
||||
],
|
||||
},
|
||||
'3ycy.com': {
|
||||
_name: '三界异次元',
|
||||
www: [
|
||||
{
|
||||
title: '最近更新',
|
||||
docs: 'https://docs.rsshub.app/routes/anime#san-jie-yi-ci-yuan',
|
||||
source: '/',
|
||||
target: '/3ycy/home',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
'emi-nitta.net': {
|
||||
_name: 'Emi Nitta',
|
||||
|
|
|
|||
|
|
@ -16,9 +16,6 @@ const lazyloadRouteHandler = (routeHandlerPath) => (ctx) => {
|
|||
|
||||
// Deprecated: DO NOT ADD ANY NEW ROUTES HERE
|
||||
|
||||
// 1draw
|
||||
router.get('/1draw', lazyloadRouteHandler('./routes/1draw/index'));
|
||||
|
||||
// Benedict Evans
|
||||
router.get('/benedictevans', lazyloadRouteHandler('./routes/benedictevans/recent.js'));
|
||||
|
||||
|
|
@ -197,17 +194,6 @@ router.get('/gitlab/explore/:type/:host?', lazyloadRouteHandler('./routes/gitlab
|
|||
router.get('/gitlab/release/:namespace/:project/:host?', lazyloadRouteHandler('./routes/gitlab/release'));
|
||||
router.get('/gitlab/tag/:namespace/:project/:host?', lazyloadRouteHandler('./routes/gitlab/tag'));
|
||||
|
||||
// 忧郁的loli
|
||||
router.get('/mygalgame', lazyloadRouteHandler('./routes/galgame/hhgal')); // 废弃
|
||||
router.get('/mmgal', lazyloadRouteHandler('./routes/galgame/hhgal')); // 废弃
|
||||
router.get('/hhgal', lazyloadRouteHandler('./routes/galgame/hhgal'));
|
||||
|
||||
// say花火
|
||||
router.get('/sayhuahuo', lazyloadRouteHandler('./routes/galgame/sayhuahuo'));
|
||||
|
||||
// 终点分享
|
||||
router.get('/zdfx', lazyloadRouteHandler('./routes/galgame/zdfx'));
|
||||
|
||||
// 北京交通大学
|
||||
router.get('/bjtu/gs/:type', lazyloadRouteHandler('./routes/universities/bjtu/gs'));
|
||||
|
||||
|
|
@ -593,9 +579,6 @@ router.get('/xiaoheihe/discount/:platform?', lazyloadRouteHandler('./routes/xiao
|
|||
// 惠誉评级
|
||||
router.get('/fitchratings/site/:type', lazyloadRouteHandler('./routes/fitchratings/site'));
|
||||
|
||||
// Animen
|
||||
router.get('/animen/news/:type', lazyloadRouteHandler('./routes/animen/news'));
|
||||
|
||||
// ebb
|
||||
router.get('/ebb', lazyloadRouteHandler('./routes/ebb'));
|
||||
|
||||
|
|
@ -651,14 +634,6 @@ router.get('/blogs/wordpress/:domain/:https?', lazyloadRouteHandler('./routes/bl
|
|||
// 今日热榜 migrated to v2
|
||||
// router.get('/tophub/:id', lazyloadRouteHandler('./routes/tophub'));
|
||||
|
||||
// 游戏时光
|
||||
router.get('/vgtime/news', lazyloadRouteHandler('./routes/vgtime/news.js'));
|
||||
router.get('/vgtime/release', lazyloadRouteHandler('./routes/vgtime/release'));
|
||||
router.get('/vgtime/keyword/:keyword', lazyloadRouteHandler('./routes/vgtime/keyword'));
|
||||
|
||||
// anitama
|
||||
router.get('/anitama/:channel?', lazyloadRouteHandler('./routes/anitama/channel'));
|
||||
|
||||
// 親子王國
|
||||
router.get('/babykingdom/:id/:order?', lazyloadRouteHandler('./routes/babykingdom'));
|
||||
|
||||
|
|
@ -749,18 +724,12 @@ router.get('/kpmg/insights', lazyloadRouteHandler('./routes/kpmg/insights'));
|
|||
router.get('/gradcafe/result/:type', lazyloadRouteHandler('./routes/gradcafe/result'));
|
||||
router.get('/gradcafe/result', lazyloadRouteHandler('./routes/gradcafe/result'));
|
||||
|
||||
// 鼠绘漫画
|
||||
router.get('/shuhui/comics/:id', lazyloadRouteHandler('./routes/shuhui/comics'));
|
||||
|
||||
// 朝日新闻
|
||||
router.get('/asahi/:genre?/:category?', lazyloadRouteHandler('./routes/asahi/index'));
|
||||
|
||||
// SoundCloud
|
||||
router.get('/soundcloud/tracks/:user', lazyloadRouteHandler('./routes/soundcloud/tracks'));
|
||||
|
||||
// dilidili
|
||||
router.get('/dilidili/fanju/:id', lazyloadRouteHandler('./routes/dilidili/fanju'));
|
||||
|
||||
// 且听风吟福利
|
||||
router.get('/qtfyfl/:category', lazyloadRouteHandler('./routes/qtfyfl/category'));
|
||||
|
||||
|
|
@ -1033,9 +1002,6 @@ router.get('/cug/xgxy', lazyloadRouteHandler('./routes/universities/cug/xgxy'));
|
|||
router.get('/cug/news', lazyloadRouteHandler('./routes/universities/cug/news'));
|
||||
router.get('/cug/gcxy/:type?', lazyloadRouteHandler('./routes/universities/cug/gcxy/index'));
|
||||
|
||||
// 海猫吧
|
||||
router.get('/haimaoba/:id?', lazyloadRouteHandler('./routes/haimaoba/comics'));
|
||||
|
||||
// 蒲公英
|
||||
router.get('/pgyer/:app?', lazyloadRouteHandler('./routes/pgyer/app'));
|
||||
|
||||
|
|
@ -1058,9 +1024,6 @@ router.get('/zhishifenzi/news/:type?', lazyloadRouteHandler('./routes/zhishifenz
|
|||
router.get('/zhishifenzi/depth', lazyloadRouteHandler('./routes/zhishifenzi/depth'));
|
||||
router.get('/zhishifenzi/innovation/:type?', lazyloadRouteHandler('./routes/zhishifenzi/innovation'));
|
||||
|
||||
// 電撃Online
|
||||
router.get('/dengekionline/:type?', lazyloadRouteHandler('./routes/dengekionline/new'));
|
||||
|
||||
// 4Gamers
|
||||
router.get('/4gamers/category/:category', lazyloadRouteHandler('./routes/4gamers/category'));
|
||||
router.get('/4gamers/tag/:tag', lazyloadRouteHandler('./routes/4gamers/tag'));
|
||||
|
|
@ -1112,9 +1075,6 @@ router.get('/gov/cnca/zxtz', lazyloadRouteHandler('./routes/gov/cnca/zxtz'));
|
|||
// 文汇报
|
||||
router.get('/whb/:category', lazyloadRouteHandler('./routes/whb/zhuzhan'));
|
||||
|
||||
// 三界异次元
|
||||
router.get('/3ycy/home', lazyloadRouteHandler('./routes/3ycy/home.js'));
|
||||
|
||||
// Emi Nitta official website
|
||||
router.get('/emi-nitta/:type', lazyloadRouteHandler('./routes/emi-nitta/home'));
|
||||
|
||||
|
|
@ -1441,9 +1401,6 @@ router.get('/jijitang/publication', lazyloadRouteHandler('./routes/jijitang/publ
|
|||
// Grub Street
|
||||
// router.get('/grubstreet', lazyloadRouteHandler('./routes/grubstreet/index'));
|
||||
|
||||
// 漫画堆
|
||||
router.get('/manhuadui/manhua/:name/:serial?', lazyloadRouteHandler('./routes/manhuadui/manhua'));
|
||||
|
||||
// CFD indices dividend adjustment
|
||||
router.get('/cfd/gbp_div', lazyloadRouteHandler('./routes/cfd/gbp_div'));
|
||||
|
||||
|
|
|
|||
|
|
@ -1,44 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
function toJSONstr(content) {
|
||||
// 使用了正则匹配 Javascript 数据,对字符串处理解析成 JSON,可能失效
|
||||
const dateRegex = /\[\];(?<data>.*?)var/s;
|
||||
return content
|
||||
.match(dateRegex)
|
||||
.groups.data.replace(/data\.push\(/gm, '')
|
||||
.replace(/\);/gm, ',')
|
||||
.replace(/(screen_name|id|allow|img):/gm, '"$1":');
|
||||
}
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const host = 'http://1draw.aqn.jp';
|
||||
|
||||
const response = await got(`${host}/1`);
|
||||
const yesterday = response.data;
|
||||
|
||||
let matches = toJSONstr(yesterday);
|
||||
|
||||
// 东九区时间晚 10 点后尝试抓取今日
|
||||
if (new Date().getUTCHours() >= 13) {
|
||||
const response = await got(`${host}/0`);
|
||||
const today = response.data;
|
||||
try {
|
||||
matches += toJSONstr(today);
|
||||
} catch (e) {
|
||||
matches += '';
|
||||
}
|
||||
}
|
||||
|
||||
const matchArr = `[ ${matches.slice(0, matches.lastIndexOf(','))} ]`;
|
||||
const items = JSON.parse(matchArr);
|
||||
|
||||
ctx.state.data = {
|
||||
title: '1draw',
|
||||
link: 'http://1draw.aqn.jp/',
|
||||
item: items.map((item) => ({
|
||||
title: `${item.screen_name}の投稿イラスト`,
|
||||
description: `<img src="${item.img}">`,
|
||||
link: `https://twitter.com/${item.screen_name}/status/${item.id}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
const url = require('url');
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const root_url = 'http://www.3ycy.com';
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: root_url,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('div.postList div.postItem');
|
||||
|
||||
const count = [];
|
||||
for (let i = 0; i < Math.min(list.length, 10); ++i) {
|
||||
count.push(i);
|
||||
}
|
||||
|
||||
const items = await Promise.all(
|
||||
count.map((i) => {
|
||||
const item = $(list[i]);
|
||||
const title = item.find('h3 a').first();
|
||||
const link = title.attr('href');
|
||||
|
||||
return ctx.cache.tryGet('3ycy' + link, async () => {
|
||||
const date = item.find('div.postSubtitle').text().trim();
|
||||
const match = /(\d+\/\d+\/\d{4}\s+\d+:\d+:\d+\s*(?:AM|PM))/i.exec(date);
|
||||
const pubDate = match && new Date(match[1] + ' GMT+8').toUTCString();
|
||||
|
||||
const res = await got({ method: 'get', url: url.resolve(root_url, link) });
|
||||
const content = cheerio.load(res.data);
|
||||
const post = content('div.postBody');
|
||||
post.find('img[data-src]').each((_, ele) => {
|
||||
ele = content(ele);
|
||||
ele.attr('src', ele.attr('data-src'));
|
||||
ele.attr('alt', title.text());
|
||||
ele.attr('title', title.text());
|
||||
ele.removeAttr('class');
|
||||
ele.removeAttr('data-src');
|
||||
});
|
||||
|
||||
return {
|
||||
title: title.text(),
|
||||
link,
|
||||
pubDate,
|
||||
description: post.html(),
|
||||
};
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: '三界异次元',
|
||||
link: root_url,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
const news_api_origin = 'https://www.animen.com.tw/animen_web/api/getNews?page=1&perPage=10';
|
||||
const link_origin = 'https://www.animen.com.tw/animen_web/web/news_index?';
|
||||
|
||||
const map = new Map([
|
||||
['zx', { title: '最新', id: -1 }],
|
||||
['jd', { title: '焦点', id: 0 }],
|
||||
['dh', { title: '动画', id: 16 }],
|
||||
['mh', { title: '漫画', id: 17 }],
|
||||
['yx', { title: '游戏', id: 19 }],
|
||||
['xs', { title: '小说', id: 18 }],
|
||||
['zrb', { title: '真人版', id: 24 }],
|
||||
['hd', { title: '活动', id: 20 }],
|
||||
['yy', { title: '音乐', id: 27 }],
|
||||
['ft', { title: '访谈', id: 25 }],
|
||||
['qt', { title: '其他', id: 22 }],
|
||||
['xwg', { title: '新闻稿', id: 26 }],
|
||||
['lrb', { title: '懒人包', id: 23 }],
|
||||
['gg', { title: '公告', id: 21 }],
|
||||
]);
|
||||
module.exports = async (ctx) => {
|
||||
const type = ctx.params.type;
|
||||
const sub_title = map.get(type).title;
|
||||
|
||||
let news_api;
|
||||
let link;
|
||||
if (type === 'zx') {
|
||||
news_api = news_api_origin + '&order_type=N';
|
||||
link = link_origin + '&order_type=N';
|
||||
} else if (type === 'jd') {
|
||||
news_api = news_api_origin + '&order_type=H';
|
||||
link = link_origin + '&order_type=H';
|
||||
} else {
|
||||
news_api = news_api_origin + '&news_category_id=' + map.get(type).id;
|
||||
link = link_origin + '&news_category_id=' + map.get(type).id;
|
||||
}
|
||||
|
||||
const response = await got.get(news_api);
|
||||
const newsList = response.data.news.NewsList;
|
||||
|
||||
const out = await Promise.all(
|
||||
newsList.map(async (news) => {
|
||||
const title = news.subject;
|
||||
const date = news.start_datetime;
|
||||
const news_id = news.news_id;
|
||||
const itemLink = `https://www.animen.com.tw/animen_web/web/news_inside?news_id=${news_id}`;
|
||||
|
||||
const news_detail_api = `https://www.animen.com.tw/animen_web/api/getNewsDetail?news_id=${news_id}`;
|
||||
const response = await got.get(news_detail_api);
|
||||
const details = response.data.news_content.slice(1);
|
||||
|
||||
const descriptions = details.map((detail) => {
|
||||
let description;
|
||||
if (detail.news_order_type === 'M') {
|
||||
const id = detail.content.split('=')[1];
|
||||
description = `<iframe width="560" height="315" src="https://www.youtube.com/embed/${id}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
|
||||
} else if (detail.news_order_type === 'A') {
|
||||
description = detail.content;
|
||||
} else {
|
||||
const image = detail.p_original_path;
|
||||
description = `<br><img src="${image}"><br>`;
|
||||
}
|
||||
return description;
|
||||
});
|
||||
const description = descriptions.join('');
|
||||
|
||||
const single = {
|
||||
title,
|
||||
link: itemLink,
|
||||
description,
|
||||
pubDate: new Date(date).toUTCString(),
|
||||
};
|
||||
|
||||
return single;
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${sub_title}-Animen动漫平台`,
|
||||
link,
|
||||
item: out,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const date = require('@/utils/date');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const baseUrl = 'http://www.anitama.cn';
|
||||
const url = 'http://www.anitama.cn/channel/' + (ctx.params.channel ? ctx.params.channel : '');
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
const channel_name = $('#area-article-channel .bar').text().slice(0, -5);
|
||||
const list = $('#area-article-channel div.inner a')
|
||||
.slice(0, 10)
|
||||
.map((i, e) => ({
|
||||
link: baseUrl + $(e).attr('href'),
|
||||
}))
|
||||
.get();
|
||||
|
||||
const out = await Promise.all(
|
||||
list.map(async (item) => {
|
||||
const { link } = item;
|
||||
|
||||
const cache = await ctx.cache.get(link);
|
||||
if (cache) {
|
||||
return Promise.resolve(JSON.parse(cache));
|
||||
}
|
||||
|
||||
const response = await got.get(link);
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
const content = $('#area-content-article');
|
||||
content.find('img').each((index, item) => {
|
||||
item = $(item);
|
||||
item.attr('src', item.attr('data-src'));
|
||||
});
|
||||
content.find('a').each((index, item) => {
|
||||
if (item.attribs.href.startsWith('#')) {
|
||||
item.tagName = 'span';
|
||||
}
|
||||
});
|
||||
const single = {
|
||||
pubDate: date($('.time').text()),
|
||||
author: $('.author').text(),
|
||||
link,
|
||||
title: $('h1').text() + '-' + $('h2').text(),
|
||||
description: content.html(),
|
||||
};
|
||||
|
||||
ctx.cache.set(link, JSON.stringify(single));
|
||||
return Promise.resolve(single);
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: 'Anitama-' + channel_name,
|
||||
link: url,
|
||||
description: 'Anitama-' + channel_name,
|
||||
item: out,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const host = 'https://dengekionline.com';
|
||||
const infos = {
|
||||
'': {
|
||||
category: '電撃総合',
|
||||
patch: '/',
|
||||
},
|
||||
dps: {
|
||||
category: '電撃PlayStation',
|
||||
patch: '/dps/',
|
||||
},
|
||||
nintendo: {
|
||||
category: '電撃Nintendo',
|
||||
patch: '/nintendo/',
|
||||
},
|
||||
microsoft: {
|
||||
category: '電撃Xbox',
|
||||
patch: '/microsoft/',
|
||||
},
|
||||
dpc: {
|
||||
category: '電撃PC',
|
||||
patch: '/dpc/',
|
||||
},
|
||||
gstyle: {
|
||||
category: '電撃Girl’sStyle',
|
||||
patch: '/g-style/',
|
||||
},
|
||||
arcade: {
|
||||
category: '電撃アーケードWeb',
|
||||
patch: '/arcade/',
|
||||
},
|
||||
app: {
|
||||
category: 'アプリまとめ',
|
||||
patch: '/app/',
|
||||
},
|
||||
anime: {
|
||||
category: 'アニメ',
|
||||
patch: '/tags/%E3%82%A2%E3%83%8B%E3%83%A1/',
|
||||
},
|
||||
review: {
|
||||
category: 'レビューまとめ',
|
||||
patch: '/tags/%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/',
|
||||
},
|
||||
rank: {
|
||||
category: '販売ランキング',
|
||||
patch: '/tags/%E3%82%BD%E3%83%95%E3%83%88%E8%B2%A9%E5%A3%B2%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0/',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
// 设置参数
|
||||
const info = infos[ctx.params.type || ''];
|
||||
if (info === undefined) {
|
||||
throw Error('不存在的类型');
|
||||
}
|
||||
const patch = info.patch.slice(1);
|
||||
const category = info.category;
|
||||
const title = `電撃オンライン - ${category}`;
|
||||
// 网页请求获取新闻列表
|
||||
const response = await got(patch, {
|
||||
method: 'get',
|
||||
prefixUrl: host,
|
||||
});
|
||||
const data = response.data;
|
||||
const link = response.url;
|
||||
// 过滤处理新闻列表数据
|
||||
const $ = cheerio.load(data);
|
||||
const list = $('a', 'ul.gNews_list');
|
||||
const description = $('meta[name="description"]').attr('content');
|
||||
// 整理信息
|
||||
const item = await Promise.all(
|
||||
list
|
||||
.map(async (index, element) => {
|
||||
const liArr = $('li', element);
|
||||
const date = $('time', element).attr('datetime');
|
||||
|
||||
const newLink = $(element).attr('href').slice(1);
|
||||
// 新闻封面
|
||||
const cover = $('img', element);
|
||||
const category = liArr.map((index, li) => $(li).text()).get();
|
||||
// 日本时区为东9区
|
||||
const pubDate = new Date(`${date} GMT+0900`).toUTCString();
|
||||
// 获取作者等
|
||||
const newInfo = await ctx.cache.tryGet(newLink, async () => {
|
||||
// console.log(newLink);
|
||||
const result = await got(newLink, {
|
||||
method: 'get',
|
||||
prefixUrl: host,
|
||||
});
|
||||
const $ = cheerio.load(result.data);
|
||||
const title = $('.gEntry_title').text();
|
||||
const description = $('p', '.gEntry_body').html();
|
||||
const author = $('dd', '.gEntry_athorList').text();
|
||||
const info = {
|
||||
title,
|
||||
description,
|
||||
author,
|
||||
url: result.url,
|
||||
};
|
||||
return info;
|
||||
});
|
||||
|
||||
const single = {
|
||||
title: newInfo.title,
|
||||
link: newInfo.url,
|
||||
category,
|
||||
description: newInfo.description,
|
||||
media: {
|
||||
content: {
|
||||
url: cover.attr('data-src'),
|
||||
expression: 'full',
|
||||
width: cover.attr('width'),
|
||||
},
|
||||
},
|
||||
author: newInfo.author,
|
||||
guid: newInfo.url,
|
||||
pubDate,
|
||||
};
|
||||
return Promise.resolve(single);
|
||||
})
|
||||
.get()
|
||||
);
|
||||
// 设置rss
|
||||
ctx.state.data = {
|
||||
title,
|
||||
description,
|
||||
link,
|
||||
language: 'ja-jp',
|
||||
item,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
// 调用got获取页面源码
|
||||
const got = require('@/utils/got');
|
||||
// 调用cheerio分析抓取到的html,利用类似jQuery的方法解析
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
async function load(link, ctx) {
|
||||
// 定义cache 存储通过link获取到的缓存内容
|
||||
const cache = await ctx.cache.get(link);
|
||||
// 如果缓存已经存在,则直接返回,否则对其进行解析
|
||||
if (cache) {
|
||||
return cache;
|
||||
}
|
||||
const response = await got.get(link);
|
||||
const $ = cheerio.load(response.data);
|
||||
// 获取相关内容
|
||||
let introduce = $('#intro2 > p:nth-child(3)').text();
|
||||
// 将'简介'字段与内容分离,为了更优美的阅读界面
|
||||
introduce = introduce.replace('简介', '简介<br>');
|
||||
const image = `<img src="${$('.player_img > img').attr('src')}" />`;
|
||||
const detailResult = `${introduce}<br>${image}`;
|
||||
|
||||
// 定义description,并指定内容
|
||||
const description = detailResult;
|
||||
ctx.cache.set(link, description);
|
||||
return {
|
||||
description,
|
||||
};
|
||||
}
|
||||
|
||||
// 通过module.exports暴露给router
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
// 使用get方法请求主页面,然后获取其返回的response
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `http://www.dilidili.name/anime/${id}`,
|
||||
});
|
||||
// 获取页面的html
|
||||
const data = response.data;
|
||||
// 将页面html交于cheerio处理成类似jQuery的节点
|
||||
const $ = cheerio.load(data);
|
||||
// 获取番剧名称
|
||||
const animeName = $('body > div.container.clear > div.clear > div:nth-child(2) > div.detail.con24.clear > dl > dd > h1').text();
|
||||
|
||||
// @param {*} list 用于存储通过 " h4 > a "获取到的节点
|
||||
const beforeFilterList = $('div.swiper-container.xfswiper1 > div > div > ul > li > a').get(); // 获取到剧集列表
|
||||
const list = [];
|
||||
beforeFilterList.forEach((element) => {
|
||||
if ($(element).attr('href').indexOf('http://') !== -1) {
|
||||
list.push(element);
|
||||
}
|
||||
});
|
||||
// 使用promise处理多个节点
|
||||
const process = await Promise.all(
|
||||
// 在list变量上使用map方法,对其拥有的每一个元素均进行"匿名函数"的操作
|
||||
list.map(async (item) => {
|
||||
// item为回调的参数
|
||||
// 定义itemUrl
|
||||
const itemUrl = $(item).attr('href');
|
||||
// 定义导出到rss的单体对象,包含title,link,guid三个参数
|
||||
const single = {
|
||||
title: $(item).text(),
|
||||
link: itemUrl,
|
||||
guid: itemUrl,
|
||||
};
|
||||
// 调用load方法,获取到的是string对象{description}
|
||||
const other = await load(itemUrl, ctx);
|
||||
return Promise.resolve(Object.assign({}, single, other));
|
||||
})
|
||||
);
|
||||
ctx.state.data = {
|
||||
title: `${animeName} - 嘀哩嘀哩`,
|
||||
link: `http://www.dilidili.name/anime/${id}`,
|
||||
description: `${animeName}更新提醒`,
|
||||
item: process,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
const cheerio = require('cheerio');
|
||||
const got = require('@/utils/got');
|
||||
const { CookieJar } = require('tough-cookie');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const baseUrl = 'https://www.hhgal.com/';
|
||||
const stringToHex = (str) => {
|
||||
let val = '';
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
if (val === '') {
|
||||
val = str.charCodeAt(i).toString(16);
|
||||
} else {
|
||||
val += str.charCodeAt(i).toString(16);
|
||||
}
|
||||
}
|
||||
return val;
|
||||
};
|
||||
|
||||
const cookieJar = new CookieJar();
|
||||
const response = (
|
||||
await got({
|
||||
url: baseUrl,
|
||||
cookieJar,
|
||||
})
|
||||
).body;
|
||||
let html = null;
|
||||
|
||||
if (response.indexOf('YunSuoAutoJump') > -1) {
|
||||
const screenData = stringToHex('1280,720');
|
||||
const urlData = stringToHex(baseUrl);
|
||||
cookieJar.setCookie('srcurl=' + urlData, baseUrl);
|
||||
await got({
|
||||
url: baseUrl + '?security_verify_data=' + screenData,
|
||||
cookieJar,
|
||||
});
|
||||
html = (
|
||||
await got({
|
||||
url: baseUrl,
|
||||
cookieJar,
|
||||
})
|
||||
).body;
|
||||
}
|
||||
|
||||
const $ = html === null ? cheerio.load(response) : cheerio.load(html);
|
||||
const list = $('#article-list').find('.article');
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: 'https://www.hhgal.com/',
|
||||
description: '忧郁的loli - Galgame资源发布站',
|
||||
item:
|
||||
list &&
|
||||
list
|
||||
.slice(1)
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
const time = item.find('.tag-article .label.label-zan').text();
|
||||
const math = /\d{4}-\d{2}-\d{2}/.exec(time);
|
||||
const pubDate = new Date(math[0]);
|
||||
|
||||
return {
|
||||
title: item.find('h1').text(),
|
||||
description: item.find('.info p').text(),
|
||||
pubDate,
|
||||
link: item.find('h1 a').attr('href'),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const res = await got({
|
||||
method: 'get',
|
||||
url: 'https://index.say-huahuo.com/vn.json',
|
||||
});
|
||||
|
||||
const data = JSON.parse(res.body).reverse();
|
||||
|
||||
ctx.state.data = {
|
||||
title: 'galgame汉化硬盘galgame资源下载-花火学园论坛',
|
||||
link: 'https://index.say-huahuo.com/',
|
||||
description: '花火学园',
|
||||
item: data.map((item) => ({
|
||||
title: item.title,
|
||||
description: `<img src="${item.img}">`,
|
||||
pubDate: new Date(parseInt(item.date.substr(0, 4)), parseInt(item.date.substr(4, 2)), parseInt(item.date.substr(6, 2))).toUTCString(),
|
||||
link: item.url,
|
||||
})),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const host = 'https://bbs.zdfx.net/';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: host,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('.slideother a');
|
||||
|
||||
const process = list.map((index, item) => {
|
||||
const a = $(item);
|
||||
const img_tag = '.slideshow a:nth-child(' + (index + 1).toString() + ')';
|
||||
|
||||
return {
|
||||
title: a.text(),
|
||||
description: $(img_tag).html(),
|
||||
link: host + a.attr('href'),
|
||||
};
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: '终点分享',
|
||||
link: host,
|
||||
description: '终点分享最新汉化通知',
|
||||
item: process.get(),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const iconv = require('iconv-lite');
|
||||
|
||||
const getChapters = (id, $, caches) => {
|
||||
const chapters = $('.text')
|
||||
.toArray()
|
||||
.reduce((acc, curr) => acc.concat(`http://www.haimaoba.com${$(curr).children('a').attr('href')}`), []);
|
||||
|
||||
return Promise.all(
|
||||
chapters.splice(0, 10).map((link) =>
|
||||
caches.tryGet(link, async () => {
|
||||
const { data } = await got.get(link, {
|
||||
responseType: 'buffer',
|
||||
host: 'www.haimaoba.com',
|
||||
Referer: `http://www.haima.com/catalog/${id}/`,
|
||||
});
|
||||
const content = iconv.decode(new Buffer.from(data), 'gb2312');
|
||||
const $ = cheerio.load(content);
|
||||
return {
|
||||
title: $('head > title').text(),
|
||||
link,
|
||||
description: $('.contentimg').html(),
|
||||
};
|
||||
})
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const { data } = await got.get(`http://www.haimaoba.com/catalog/${id}/`, {
|
||||
responseType: 'buffer',
|
||||
Host: 'www.haimaoba.com',
|
||||
Referer: 'http://www.haimaoba.com/',
|
||||
});
|
||||
const content = iconv.decode(new Buffer.from(data), 'gb2312');
|
||||
const $ = cheerio.load(content);
|
||||
|
||||
const bookTitle = $('.t > h1').text();
|
||||
const bookIntro = $('#zuop1C').text();
|
||||
const chapters = await getChapters(id, $, ctx.cache);
|
||||
|
||||
const rssData = (chapter) => ({
|
||||
link: chapter.link,
|
||||
title: chapter.title,
|
||||
description: chapter.description,
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: `海猫吧 - ${bookTitle}`,
|
||||
link: `http://www.haimaoba.com/catalog/${id}/`,
|
||||
description: bookIntro,
|
||||
item: chapters.map(rssData),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const host = 'https://www.manhuadui.com';
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const name = ctx.params.name;
|
||||
const serial = parseInt(ctx.params.serial);
|
||||
const comicPage = host + `/manhua/${name}/`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: comicPage,
|
||||
});
|
||||
const data = response.data;
|
||||
const $ = cheerio.load(data);
|
||||
const contentLength = $('div.zj_list_con').length;
|
||||
const comicTitle = $('div.comic_deCon > h1').text().trim();
|
||||
const comicDescription = $('p.comic_deCon_d').text().trim();
|
||||
let list = $('div.zj_list_con')
|
||||
.eq(serial - 1)
|
||||
.find('ul > li > a');
|
||||
if (isNaN(serial) || serial <= 0 || contentLength < serial) {
|
||||
list = $('div.zj_list_con > ul > li > a');
|
||||
}
|
||||
ctx.state.data = {
|
||||
title: '漫画堆 - ' + comicTitle,
|
||||
link: comicPage,
|
||||
description: comicDescription,
|
||||
item: list
|
||||
.map((i, item) => ({
|
||||
title: $(item).attr('title').trim(),
|
||||
description: $(item).attr('title').trim(),
|
||||
link: host + $(item).attr('href'),
|
||||
}))
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const api_data = await got.get('https://prod-u.ishuhui.com/ver');
|
||||
const comics_code = api_data.data.data.comics;
|
||||
|
||||
let lastEpisodeId;
|
||||
const rssData = await got({
|
||||
method: 'get',
|
||||
url: `https://prod-api.ishuhui.com/ver/${comics_code}/anime/detail?id=${id}&type=comics&.json`,
|
||||
headers: {
|
||||
Origin: 'https://www.ishuhui.com',
|
||||
Referer: `https://www.ishuhui.com/comics/anime/${id}`,
|
||||
},
|
||||
}).then((response) => {
|
||||
// 漫画名
|
||||
const name = response.data.data.name;
|
||||
// 漫画描述
|
||||
const desc = response.data.data.desc;
|
||||
|
||||
const episodeGroup = response.data.data.comicsIndexes['1'].nums;
|
||||
let lastGroup = '0';
|
||||
for (const key in episodeGroup) {
|
||||
if (parseInt(lastGroup.split('-')[0]) < parseInt(key.split('-')[0])) {
|
||||
lastGroup = key;
|
||||
}
|
||||
}
|
||||
|
||||
// 找到最新章节组
|
||||
let lastEpisode = '-1';
|
||||
for (const group in episodeGroup[lastGroup]) {
|
||||
if (parseInt(lastEpisode) < parseInt(group)) {
|
||||
lastEpisode = group;
|
||||
}
|
||||
}
|
||||
|
||||
// 最新章节id
|
||||
lastEpisodeId = episodeGroup[lastGroup][lastEpisode][0].id;
|
||||
|
||||
return {
|
||||
name,
|
||||
desc,
|
||||
};
|
||||
});
|
||||
|
||||
let description = '';
|
||||
const data = await got({
|
||||
method: 'get',
|
||||
url: `https://prod-api.ishuhui.com/comics/detail?id=${lastEpisodeId}`,
|
||||
headers: {
|
||||
Origin: 'https://www.ishuhui.com',
|
||||
Referer: `https://www.ishuhui.com/comics/detail/${lastEpisodeId}`,
|
||||
},
|
||||
}).then((response) => {
|
||||
const picUrlArray = response.data.data.contentImg;
|
||||
const rssTitle = response.data.data.animeName;
|
||||
const title = response.data.data.title;
|
||||
const index = response.data.data.numberEnd;
|
||||
const updateTime = response.data.data.updateTime;
|
||||
for (let i = 0; i < picUrlArray.length; i++) {
|
||||
description += `<img src="${picUrlArray[i].url}"><br>`;
|
||||
}
|
||||
|
||||
const item = {
|
||||
rssTitle,
|
||||
title,
|
||||
description,
|
||||
index,
|
||||
updateTime,
|
||||
};
|
||||
return [item];
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
// 源标题
|
||||
title: rssData.name,
|
||||
// 源链接
|
||||
link: `https://www.ishuhui.com/comics/anime/${id}`,
|
||||
// 源说明
|
||||
description: rssData.desc,
|
||||
// 遍历此前获取的数据
|
||||
item: data.map((item) => ({
|
||||
// 文章标题
|
||||
title: `第${item.index}话-${item.title}`,
|
||||
// 文章正文
|
||||
description: item.description,
|
||||
// 文章发布时间
|
||||
pubDate: new Date(item.updateTime).toUTCString(),
|
||||
// 文章链接
|
||||
link: `http://www.hanhuazu.cc/comics/detail/${lastEpisodeId}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { keyword = '' } = ctx.params;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `http://www.vgtime.com/search/load.jhtml?keyword=${encodeURIComponent(keyword)}&type=topic&typeTag=2&page=1&pageSize=12`,
|
||||
headers: {
|
||||
Referer: `http://www.vgtime.com/search/list.jhtml?keyword=${encodeURIComponent(keyword)}`,
|
||||
},
|
||||
});
|
||||
const data = response.data.data;
|
||||
|
||||
const result = await Promise.all(
|
||||
data.map(async (item) => {
|
||||
const url = `https://www.vgtime.com/topic/${item.objectId}.jhtml`;
|
||||
|
||||
const description = await ctx.cache.tryGet(url, async () => {
|
||||
const result = await got.get(url);
|
||||
|
||||
const $ = cheerio.load(result.data);
|
||||
$('h1.art_tit').remove();
|
||||
$('.editor_name').remove();
|
||||
|
||||
return $('.vg_main article').html();
|
||||
});
|
||||
|
||||
const result = {
|
||||
title: item.title,
|
||||
author: JSON.parse(item.content).userName,
|
||||
pubDate: new Date(item.createTime * 1000).toUTCString(),
|
||||
link: url,
|
||||
description,
|
||||
};
|
||||
|
||||
return Promise.resolve(result);
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `游戏时光${keyword}资讯`,
|
||||
link: `http://www.vgtime.com/search/list.jhtml?keyword=${encodeURIComponent(keyword)}`,
|
||||
item: result,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `http://www.vgtime.com/vgtime-app/api/v2/homepage/listByTag.json?page=1&pageSize=20&tags=1`,
|
||||
});
|
||||
const data = response.data.data.topicList;
|
||||
|
||||
const result = await Promise.all(
|
||||
data.map(async (item) => {
|
||||
const postId = item.postId;
|
||||
const cacheKey = `vgtime_${postId}`;
|
||||
|
||||
// 最终需要返回的对象
|
||||
const news = {
|
||||
title: item.title || item.text,
|
||||
author: item.author || item.user.name,
|
||||
pubDate: new Date(item.publishDate * 1000).toUTCString(),
|
||||
link: item.shareUrl,
|
||||
};
|
||||
|
||||
// 判断缓存中是否存在
|
||||
const cacheValue = await ctx.cache.get(cacheKey);
|
||||
if (cacheValue) {
|
||||
news.description = cacheValue;
|
||||
} else {
|
||||
const article = await got({
|
||||
method: 'get',
|
||||
url: `https://www.vgtime.com/topic/${postId}.jhtml`,
|
||||
});
|
||||
// 解析html内容
|
||||
const $ = cheerio.load(article.data);
|
||||
$('h1.art_tit').remove();
|
||||
$('.editor_name').remove();
|
||||
const content = $('.vg_main article').html();
|
||||
// 存放到缓存区
|
||||
ctx.cache.set(cacheKey, content);
|
||||
news.description = content;
|
||||
}
|
||||
|
||||
return Promise.resolve(news);
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `游戏时光新闻列表`,
|
||||
link: `http://www.vgtime.com/topic/index.jhtml`,
|
||||
item: result,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `http://app02.vgtime.com:8080/vgtime-app/api/v2/game/last/sales`,
|
||||
});
|
||||
const data = response.data.data.gameList;
|
||||
|
||||
ctx.state.data = {
|
||||
title: `游戏时光游戏发售表`,
|
||||
link: `https://www.vgtime.com/game/release.jhtml`,
|
||||
item: data.map((item) => ({
|
||||
title: item.title,
|
||||
description: `平台:${item.platformsText};${item.introduction}`,
|
||||
pubDate: item.publishDate,
|
||||
link: item.shareUrl,
|
||||
})),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const newflashApi = 'https://api.theblockbeats.info/v3/newsflash/select';
|
||||
const articleApi = 'https://api.theblockbeats.info/v3/Information/newsall';
|
||||
|
||||
const rootUrl = 'https://www.theblockbeats.info';
|
||||
|
||||
const channelMap = {
|
||||
newsflash: '快讯',
|
||||
article: '文章',
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const channel = ctx.params.channel ?? 'newsflash';
|
||||
const { data: response } = await got(channel === 'newsflash' ? newflashApi : articleApi);
|
||||
const { data } = channel === 'newsflash' ? response.data : response;
|
||||
const list = data.map((item) => ({
|
||||
title: item.title,
|
||||
link: `${rootUrl}/${channel === 'newsflash' ? 'flash' : 'news'}/${item.id}`,
|
||||
description: item.content ?? item.im_abstract,
|
||||
pubDate: parseDate(item.add_time, 'X'),
|
||||
}));
|
||||
|
||||
if (channel !== 'newsflash') {
|
||||
await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got(item.link);
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
item.description = content('div.news-content').html();
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
ctx.state.data = {
|
||||
title: `TheBlockBeats - ${channelMap[channel]}`,
|
||||
link: rootUrl,
|
||||
item: list,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
'/:channel?': ['Fatpandac', 'jameshih'],
|
||||
};
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
module.exports = {
|
||||
'theblockbeats.info': {
|
||||
_name: '律动',
|
||||
rszhaopin: [
|
||||
{
|
||||
title: '快讯',
|
||||
docs: 'https://docs.rsshub.app/routes/new-media#lu-dong-xin-wen-kuai-xun',
|
||||
source: ['/'],
|
||||
target: '/blockbeats/newsflash',
|
||||
},
|
||||
{
|
||||
title: '文章',
|
||||
docs: 'https://docs.rsshub.app/routes/new-media#lu-dong-xin-wen-kuai-xun',
|
||||
source: ['/'],
|
||||
target: '/blockbeats/article',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = function (router) {
|
||||
router.get('/:channel?', require('./index'));
|
||||
};
|
||||
|
|
@ -6,12 +6,6 @@
|
|||
|
||||
<Route author="junfengP" example="/005tv/zx/latest" path="/005tv/zx/latest" />
|
||||
|
||||
## 1draw #深夜の真剣お絵描き 60 分一本勝負 {#1draw-shen-ye-%E3%81%AE-zhen-jian-%E3%81%8A-hui-miao-%E3%81%8D-60-fen-yi-ben-sheng-fu}
|
||||
|
||||
### 投稿一览 {#1draw-shen-ye-%E3%81%AE-zhen-jian-%E3%81%8A-hui-miao-%E3%81%8D-60-fen-yi-ben-sheng-fu-tou-gao-yi-lan}
|
||||
|
||||
<Route author="jackyu1996" path="/1draw/" example="/1draw/" notOperational="1" />
|
||||
|
||||
## 78 动漫 {#78-dong-man}
|
||||
|
||||
### 新品速递 {#78-dong-man-xin-pin-su-di}
|
||||
|
|
@ -103,16 +97,6 @@
|
|||
|
||||
<Route author="maple3142" example="/anime1/search/兔女郎學姊" path="/anime1/search/:keyword" paramsDesc={['关键字']} radar="1" />
|
||||
|
||||
## Animen 动漫平台 {#animen-dong-man-ping-tai}
|
||||
|
||||
### news {#animen-dong-man-ping-tai-news}
|
||||
|
||||
<Route author="LogicJake" example="/animen/news/zx" path="/animen/news/:type" paramsDesc={['板块类型']} notOperational="1">
|
||||
| 最新 | 焦点 | 动画 | 漫画 | 游戏 | 小说 | 真人版 | 活动 | 音乐 | 访谈 | 其他 | 新闻稿 | 懒人包 | 公告 |
|
||||
| ---- | ---- | ---- | ---- | ---- | ---- | ------ | ---- | ---- | ---- | ---- | ------ | ------ | ---- |
|
||||
| zx | jd | dh | mh | yx | xs | zrb | hd | yy | ft | qt | xwg | lrb | gg |
|
||||
</Route>
|
||||
|
||||
## Anitama {#anitama}
|
||||
|
||||
### Anitama Channel {#anitama-anitama-channel}
|
||||
|
|
@ -470,12 +454,6 @@
|
|||
|
||||
<Route author="nczitzk" example="/rawkuma/manga/tensei-shitara-dai-nana-ouji-dattanode-kimamani-majutsu-o-kiwamemasu" path="/rawkuma/manga/:id" paramsDesc={['Manga ID, can be found in URL']} radar="1" />
|
||||
|
||||
## say 花火 {#say-hua-huo}
|
||||
|
||||
### 文章 {#say-hua-huo-wen-zhang}
|
||||
|
||||
<Route author="junfengP" example="/sayhuahuo" path="/sayhuahuo" notOperational="1" />
|
||||
|
||||
## THBWiki {#thbwiki}
|
||||
|
||||
### Calendar {#thbwiki-calendar}
|
||||
|
|
@ -584,26 +562,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="Fatpandac" example="/baozimh/comic/guowangpaiming-shiricaofu" path="/baozimh/comic/:name" paramsDesc={['漫画名称,在漫画链接可以得到(`comic/` 后的那段)']} />
|
||||
|
||||
## 嘀哩嘀哩 - dilidili {#di-li-di-li-dilidili}
|
||||
|
||||
### 嘀哩嘀哩番剧更新 {#di-li-di-li-dilidili-di-li-di-li-fan-ju-geng-xin}
|
||||
|
||||
<Route author="SunShinenny" path="/dilidili/fanju/:id" example="/dilidili/fanju/onepunchman2" paramsDesc={['番剧id']} notOperational="1">
|
||||
请打开对应番剧的纵览页 (非具体某集), 从 url 中最后一位查看番剧 id.(一般为英文)
|
||||
除去 ' 海贼 ' 此类具有特殊页面的超长番剧,绝大多数页面都可以解析.
|
||||
最适合用来追新番
|
||||
</Route>
|
||||
|
||||
## 電撃オンライン {#dian-ji-%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3}
|
||||
|
||||
### 最新記事 {#dian-ji-%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3-zui-xin-ji-shi}
|
||||
|
||||
<Route author="cssxsh" path="/dengekionline/:type?" example="/dengekionline/dps" paramsDesc={['新闻类别,如下表']} notOperational="1">
|
||||
| All | PlayStation | Nintendo | Xbox | PC | Girl’sStyle | Arcade Web | App | Anime | Review | Rank |
|
||||
| --- | ----------- | -------- | --------- | --- | ----------- | ---------- | --- | ----- | ------ | ---- |
|
||||
| | dps | nintendo | microsoft | dpc | gstyle | arcade | app | anime | review | rank |
|
||||
</Route>
|
||||
|
||||
## 咚漫 {#dong-man}
|
||||
|
||||
### 漫画更新 {#dong-man-man-hua-geng-xin}
|
||||
|
|
@ -648,12 +606,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="geeeeoff zytomorrow" path="/fffdm/manhua/:id/:cdn?" example="/fffdm/manhua/93" paramsDesc={['漫画ID。默认获取全部,建议使用通用参数limit获取指定数量', 'cdn加速器。默认5,当前可选1-5']} radar="1" />
|
||||
|
||||
## 海猫吧 {#hai-mao-ba}
|
||||
|
||||
### 漫画更新 {#hai-mao-ba-man-hua-geng-xin}
|
||||
|
||||
<Route author="zytomorrow" path="/haimaoba/:id" example="/haimaoba/4026" paramsDesc={['漫画id,漫画主页的地址栏中最后一位数字']} radar="1" notOperational="1" />
|
||||
|
||||
## 禁漫天堂 {#jin-man-tian-tang}
|
||||
|
||||
:::tip
|
||||
|
|
@ -748,12 +700,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="junfengP" path="/manhuadb/:id" example="/manhuadb/comics/1711" paramsDesc={['漫画ID']} />
|
||||
|
||||
## 漫画堆 {#man-hua-dui}
|
||||
|
||||
### 漫画 {#man-hua-dui-man-hua}
|
||||
|
||||
<Route author="geeeeoff" path="/manhuadui/manhua/:name/:serial?" example="/manhuadui/manhua/yiquanchaoren/1" paramsDesc={['漫画名称', '内容序号,部分漫画存在最新章节、原作、番外,根据页面顺序从1开始排序']} notOperational="1" />
|
||||
|
||||
## 漫小肆 {#man-xiao-si}
|
||||
|
||||
### 漫画更新 {#man-xiao-si-man-hua-geng-xin}
|
||||
|
|
@ -766,12 +712,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="nightmare-mio" path="/lightnovel/:keywords/:security_key" example="/lightnovel/歡迎來到實力至上主義的教室/3cfc2dc63f3575ee42e12823188ad1b5:1709125:0" paramsDesc={['关键字,可以模糊匹配,但最好精确匹配。默认为文章类型','cookie,由于文章有防爬,所以必须携带cookie请求。route中的cookie优先级高于环境变量cookie,取token中的security_key值']} radar="1" />
|
||||
|
||||
## 三界异次元 {#san-jie-yi-ci-yuan}
|
||||
|
||||
### 三界异次元 {#san-jie-yi-ci-yuan-san-jie-yi-ci-yuan}
|
||||
|
||||
<Route author="luyuhuang" example="/3ycy/home" path="/3ycy/home" radar="1" notOperational="1" />
|
||||
|
||||
## 紳士漫畫 {#shen-shi-man-hua}
|
||||
|
||||
### 最新 {#shen-shi-man-hua-zui-xin}
|
||||
|
|
@ -786,12 +726,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="Gandum2077" example="/wnacg/tag/漢化" path="/wnacg/tag/:tag" paramsDesc={['標籤,即 URL 中的 `tag-`後的文字']} radar="1" />
|
||||
|
||||
## 鼠绘漫画 {#shu-hui-man-hua}
|
||||
|
||||
### 鼠绘漫画 {#shu-hui-man-hua-shu-hui-man-hua}
|
||||
|
||||
<Route author="zytomorrow" path="/shuhui/comics/:id" example="/shuhui/comics/1" paramsDesc={['漫画id,漫画主页的地址栏中最后一位数字']} radar="1" notOperational="1" />
|
||||
|
||||
## 腾讯动漫 {#teng-xun-dong-man}
|
||||
|
||||
### 排行榜 {#teng-xun-dong-man-pai-hang-bang}
|
||||
|
|
@ -810,12 +744,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="nczitzk" example="/qq/ac/comic/531490" path="/qq/ac/comic/:id" paramsDesc={['编号,可在对应页 URL 中找到']} radar="1" />
|
||||
|
||||
## 忧郁的 loli {#you-yu-de-loli}
|
||||
|
||||
### 文章 {#you-yu-de-loli-wen-zhang}
|
||||
|
||||
<Route author="DIYgod kotoyuuko" example="/hhgal" path="/hhgal" notOperational="1" />
|
||||
|
||||
## 月幕 Galgame {#yue-mu-galgame}
|
||||
|
||||
### 文章 {#yue-mu-galgame-wen-zhang}
|
||||
|
|
@ -830,12 +758,6 @@ You can use some RSS parsing libraries (like `feedpraser` in `Python`) to receiv
|
|||
|
||||
<Route author="SunBK201" example="/ymgal/game/release" path="/ymgal/game/release" radar="1" />
|
||||
|
||||
## 终点分享 {#zhong-dian-fen-xiang}
|
||||
|
||||
### 最新汉化 {#zhong-dian-fen-xiang-zui-xin-han-hua}
|
||||
|
||||
<Route author="junfengP" example="/zdfx" path="/zdfx" notOperational="1" />
|
||||
|
||||
## アニメ新番組 {#%E3%82%A2%E3%83%8B%E3%83%A1-xin-fan-zu}
|
||||
|
||||
### 當季新番 {#%E3%82%A2%E3%83%8B%E3%83%A1-xin-fan-zu-dang-ji-xin-fan}
|
||||
|
|
|
|||
|
|
@ -3432,16 +3432,6 @@
|
|||
[**甲醇热点聚焦**](https://list.oilchem.net/140/18263) `https://list.oilchem.net/140/18263` 中,类别 id 为 `list`,分类 id 为 `140`,子分类 id 为 `18263`,对应路由即为 [`/oilchem/list/140/18263`](https://rsshub.app/oilchem/list/140/18263)
|
||||
</Route>
|
||||
|
||||
## 律动 {#lv-dong}
|
||||
|
||||
### 新闻快讯 {#lv-dong-xin-wen-kuai-xun}
|
||||
|
||||
<Route author="Fatpandac jameshih" example="/blockbeats/newsflash" path="/blockbeats/:channel?" paramsDesc={['类型,见下表,默认为快讯']} notOperational="1">
|
||||
| 快讯 | 文章 |
|
||||
| :-------: | :-----: |
|
||||
| newsflash | article |
|
||||
</Route>
|
||||
|
||||
## 論盡媒體 AllAboutMacau Media {#lun-jin-mei-ti-allaboutmacau-media}
|
||||
|
||||
### 话题 {#lun-jin-mei-ti-allaboutmacau-media-hua-ti}
|
||||
|
|
|
|||
Loading…
Reference in New Issue