feat: remove notOperational routes - picture
This commit is contained in:
parent
b081d984a1
commit
fe6117a421
|
|
@ -30,13 +30,6 @@ router.get('/ziroom/room/:city/:iswhole/:room/:keyword', lazyloadRouteHandler('.
|
|||
// router.get('/jianshu/collection/:id', lazyloadRouteHandler('./routes/jianshu/collection'));
|
||||
// router.get('/jianshu/user/:id', lazyloadRouteHandler('./routes/jianshu/user'));
|
||||
|
||||
// 妹子图
|
||||
router.get('/mzitu/home/:type?', lazyloadRouteHandler('./routes/mzitu/home'));
|
||||
router.get('/mzitu/tags', lazyloadRouteHandler('./routes/mzitu/tags'));
|
||||
router.get('/mzitu/category/:category', lazyloadRouteHandler('./routes/mzitu/category'));
|
||||
router.get('/mzitu/post/:id', lazyloadRouteHandler('./routes/mzitu/post'));
|
||||
router.get('/mzitu/tag/:tag', lazyloadRouteHandler('./routes/mzitu/tag'));
|
||||
|
||||
// pixiv-fanbox
|
||||
router.get('/fanbox/:user?', lazyloadRouteHandler('./routes/fanbox/main'));
|
||||
|
||||
|
|
@ -437,10 +430,6 @@ router.get('/autotrader/:query', lazyloadRouteHandler('./routes/autotrader'));
|
|||
// 极客公园
|
||||
router.get('/geekpark/breakingnews', lazyloadRouteHandler('./routes/geekpark/breakingnews'));
|
||||
|
||||
// 百度
|
||||
router.get('/baidu/doodles', lazyloadRouteHandler('./routes/baidu/doodles'));
|
||||
// router.get('/baidu/topwords/:boardId?', lazyloadRouteHandler('./routes/baidu/topwords'));
|
||||
|
||||
// 搜狗
|
||||
router.get('/sogou/doodles', lazyloadRouteHandler('./routes/sogou/doodles'));
|
||||
|
||||
|
|
@ -834,9 +823,6 @@ router.get('/gov/veterans/:type', lazyloadRouteHandler('./routes/gov/veterans/ch
|
|||
// 河北省退伍士兵信息
|
||||
router.get('/gov/veterans/hebei/:type', lazyloadRouteHandler('./routes/gov/veterans/hebei'));
|
||||
|
||||
// Dilbert Comic Strip
|
||||
router.get('/dilbert/strip', lazyloadRouteHandler('./routes/dilbert/strip'));
|
||||
|
||||
// 怪物猎人
|
||||
router.get('/monsterhunter/update', lazyloadRouteHandler('./routes/mhw/update'));
|
||||
router.get('/mhw/update', lazyloadRouteHandler('./routes/mhw/update'));
|
||||
|
|
@ -901,9 +887,6 @@ router.get('/cninfo/announcement/:column/:code/:orgId/:category?/:search?', lazy
|
|||
router.get('/nosetime/:id/:type/:sort?', lazyloadRouteHandler('./routes/nosetime/comment'));
|
||||
router.get('/nosetime/home', lazyloadRouteHandler('./routes/nosetime/home'));
|
||||
|
||||
// 涂鸦王国
|
||||
router.get('/gracg/:user/:love?', lazyloadRouteHandler('./routes/gracg/user'));
|
||||
|
||||
// 大侠阿木
|
||||
router.get('/daxiaamu/home', lazyloadRouteHandler('./routes/daxiaamu/home'));
|
||||
|
||||
|
|
@ -1301,9 +1284,6 @@ router.get('/ku/:name?', lazyloadRouteHandler('./routes/ku/index'));
|
|||
// 我有一片芝麻地
|
||||
router.get('/blogs/hedwig/:type', lazyloadRouteHandler('./routes/blogs/hedwig'));
|
||||
|
||||
// LoveHeaven
|
||||
router.get('/loveheaven/update/:slug', lazyloadRouteHandler('./routes/loveheaven/update'));
|
||||
|
||||
// 拉勾
|
||||
router.get('/lagou/jobs/:position/:city', lazyloadRouteHandler('./routes/lagou/jobs'));
|
||||
|
||||
|
|
@ -1347,9 +1327,6 @@ router.get('/checkra1n/releases', lazyloadRouteHandler('./routes/checkra1n/relea
|
|||
// 四川省科学技术厅
|
||||
router.get('/sckjt/news/:type?', lazyloadRouteHandler('./routes/sckjt/news'));
|
||||
|
||||
// 绝对领域
|
||||
router.get('/jdlingyu/:type', lazyloadRouteHandler('./routes/jdlingyu/index'));
|
||||
|
||||
// 湖北工业大学
|
||||
router.get('/hbut/news/:type', lazyloadRouteHandler('./routes/universities/hbut/news'));
|
||||
router.get('/hbut/cs/:type', lazyloadRouteHandler('./routes/universities/hbut/cs'));
|
||||
|
|
@ -1364,9 +1341,6 @@ router.get('/acwifi', lazyloadRouteHandler('./routes/acwifi'));
|
|||
router.get('/iyouport/article', lazyloadRouteHandler('./routes/iyouport'));
|
||||
router.get('/iyouport/:category?', lazyloadRouteHandler('./routes/iyouport'));
|
||||
|
||||
// girlimg
|
||||
router.get('/girlimg/album/:tag?/:mode?', lazyloadRouteHandler('./routes/girlimg/album'));
|
||||
|
||||
// etoland
|
||||
router.get('/etoland/:bo_table', lazyloadRouteHandler('./routes/etoland/board'));
|
||||
|
||||
|
|
@ -1484,9 +1458,6 @@ router.get('/monotype/article', lazyloadRouteHandler('./routes/monotype/article'
|
|||
// Stork
|
||||
router.get('/stork/keyword/:trackID/:displayKey', lazyloadRouteHandler('./routes/stork/keyword'));
|
||||
|
||||
// 致美化
|
||||
router.get('/zhutix/latest', lazyloadRouteHandler('./routes/zhutix/latest'));
|
||||
|
||||
// arXiv
|
||||
router.get('/arxiv/:query', lazyloadRouteHandler('./routes/arxiv/query'));
|
||||
|
||||
|
|
@ -1532,7 +1503,6 @@ router.get('/gov/caict/caictgd', lazyloadRouteHandler('./routes/gov/caict/caictg
|
|||
router.get('/cs/news/:caty', lazyloadRouteHandler('./routes/cs/news'));
|
||||
|
||||
// hentai-cosplays
|
||||
router.get('/hentai-cosplays/:type?/:name?', lazyloadRouteHandler('./routes/hentai-cosplays/hentai-cosplays'));
|
||||
router.get('/porn-images-xxx/:type?/:name?', lazyloadRouteHandler('./routes/hentai-cosplays/porn-images-xxx'));
|
||||
|
||||
// dcinside
|
||||
|
|
@ -2008,10 +1978,6 @@ router.get('/tianyancha/hot', lazyloadRouteHandler('./routes/tianyancha/hot'));
|
|||
// King Arthur
|
||||
router.get('/kingarthur/:type', lazyloadRouteHandler('./routes/kingarthur/index'));
|
||||
|
||||
// BabeHub
|
||||
router.get('/babehub/search/:keyword?', lazyloadRouteHandler('./routes/babehub/search'));
|
||||
router.get('/babehub/:category?', lazyloadRouteHandler('./routes/babehub/index'));
|
||||
|
||||
// 深圳新闻网
|
||||
router.get('/sznews/press', lazyloadRouteHandler('./routes/sznews/press'));
|
||||
router.get('/sznews/ranking', lazyloadRouteHandler('./routes/sznews/ranking'));
|
||||
|
|
@ -2060,11 +2026,6 @@ router.get('/furaffinity/journal_comments/:id', lazyloadRouteHandler('./routes/f
|
|||
// 博客来
|
||||
router.get('/bookscomtw/newbooks/:category', lazyloadRouteHandler('./routes/bookscomtw/newbooks'));
|
||||
|
||||
// Elite Babes
|
||||
router.get('/elitebabes/videos/:sort?', lazyloadRouteHandler('./routes/elitebabes/videos'));
|
||||
router.get('/elitebabes/search/:keyword?', lazyloadRouteHandler('./routes/elitebabes/search'));
|
||||
router.get('/elitebabes/:category?', lazyloadRouteHandler('./routes/elitebabes/index'));
|
||||
|
||||
// Trakt.tv
|
||||
router.get('/trakt/collection/:username/:type?', lazyloadRouteHandler('./routes/trakt/collection'));
|
||||
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
const utils = require('./utils');
|
||||
|
||||
const categories = {
|
||||
'most-viewed': {
|
||||
url: 'most-viewed',
|
||||
title: 'Most Viewed',
|
||||
},
|
||||
picture: {
|
||||
url: 'picture-archive',
|
||||
title: 'Pictures',
|
||||
},
|
||||
video: {
|
||||
url: 'video-archive',
|
||||
title: 'Videos',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const category = ctx.params.category || '';
|
||||
const title = `${category ? `${categories[category].title} - ` : ''}BabeHub`;
|
||||
|
||||
const currentUrl = `${utils.rootUrl}/${category ? categories[category].url : ''}`;
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: currentUrl,
|
||||
itunes_author: title,
|
||||
item: await utils.fetch(ctx.cache, currentUrl),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
const utils = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const keyword = ctx.params.keyword || '';
|
||||
const title = `${keyword ? `Search ${keyword} - ` : ''}BabeHub`;
|
||||
|
||||
const currentUrl = `${utils.rootUrl}/${keyword ? `?s=${keyword}` : ''}`;
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: currentUrl,
|
||||
itunes_author: title,
|
||||
item: await utils.fetch(ctx.cache, currentUrl),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const rootUrl = 'https://www.babehub.com';
|
||||
|
||||
const fetch = async (cache, currentUrl) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const list = $('.gallery-d li')
|
||||
.slice(0, 50)
|
||||
.map((_, item) => {
|
||||
item = $(item).children('a').eq(0);
|
||||
const image = item.find('img').eq(0);
|
||||
const date = item.find('.date').text();
|
||||
|
||||
return {
|
||||
link: item.attr('href'),
|
||||
title: item.attr('title') || image.attr('alt'),
|
||||
itunes_item_image: image.attr('src'),
|
||||
pubDate: (date ? new Date(date.replace(/st|nd|rd|th/g, '')) : new Date()).toUTCString(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
cache.tryGet(item.link, async () => {
|
||||
try {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
const video = content('video');
|
||||
|
||||
item.description = '';
|
||||
|
||||
if (video.length > 0) {
|
||||
const poster = detailResponse.data.match(/posterImage: "(.*)",/);
|
||||
item.itunes_item_image = (poster ? poster[1] : video.attr('poster')) || item.itunes_item_image;
|
||||
|
||||
item.enclosure_type = 'video/mp4';
|
||||
item.enclosure_url = video.children('source').attr('src');
|
||||
item.description = `<video controls loop preload="auto"><source src=${item.enclosure_url} type="video/mp4"/></video><img src="${item.itunes_item_image}">`;
|
||||
}
|
||||
|
||||
content('.gallery-e li a').each(function () {
|
||||
item.description += `<img src="${content(this).attr('href')}">`;
|
||||
});
|
||||
|
||||
return item;
|
||||
} catch (e) {
|
||||
return Promise.resolve('');
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
return items;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
rootUrl,
|
||||
fetch,
|
||||
};
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: 'http://logo.baidu.com/main/show_data/0/0/0/0',
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
ctx.state.data = {
|
||||
title: '百度趣画',
|
||||
link: 'http://logo.baidu.com/',
|
||||
item: $('.col')
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
|
||||
return {
|
||||
title: `${item.find('.title').text()}-${item.find('.date').text()}`,
|
||||
description: `<img src="${item.find('.thumb-image img').attr('src')}">`,
|
||||
link: item.find('.more a').attr('href'),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const Parser = require('rss-parser');
|
||||
const parser = new Parser();
|
||||
|
||||
async function load(link, id) {
|
||||
const response = await got.get(link);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const context = $('.comic-item-container > .meta-info-container');
|
||||
const img = context.find('img.img-comic');
|
||||
const transcript = context.find('.comic-transcript p').html();
|
||||
|
||||
const title = img.attr('alt').replace('Dilbert by Scott Adams', id);
|
||||
const src = img.attr('src');
|
||||
|
||||
let description = `<img src="${src}">`;
|
||||
if (transcript) {
|
||||
description += `<br/><p>${transcript}</p>`;
|
||||
}
|
||||
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const title = 'Dilbert Daily Strip';
|
||||
const feed_url = 'http://feed.dilbert.com/dilbert/daily_strip';
|
||||
|
||||
const feed = await parser.parseURL(feed_url);
|
||||
const items = await Promise.all(
|
||||
feed.items.slice(0, 7).map(async (item) => {
|
||||
const link = item.link;
|
||||
|
||||
const single = {
|
||||
pubDate: item.pubDate,
|
||||
link,
|
||||
};
|
||||
|
||||
const other = await ctx.cache.tryGet(link, () => load(link, item.id));
|
||||
|
||||
return Promise.resolve(Object.assign({}, single, other));
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: 'https://dilbert.com',
|
||||
description: title,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
const utils = require('./utils');
|
||||
|
||||
const categories = {
|
||||
hot: {
|
||||
url: 'trending',
|
||||
title: 'Hot',
|
||||
},
|
||||
popular: {
|
||||
url: 'most-viewed',
|
||||
title: 'Popular',
|
||||
},
|
||||
recent: {
|
||||
url: 'latest-updates',
|
||||
title: 'Recent',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const category = ctx.params.category || '';
|
||||
const title = `${category ? `${categories[category].title} - ` : ''}Elite Babes`;
|
||||
|
||||
const currentUrl = `${utils.rootUrl}/${category ? categories[category].url : ''}`;
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: currentUrl,
|
||||
itunes_author: title,
|
||||
item: await utils.fetch(ctx.cache, currentUrl),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
const utils = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const keyword = ctx.params.keyword || '';
|
||||
const title = `${keyword ? `Search ${keyword} - ` : ''}Elite Babes`;
|
||||
|
||||
const currentUrl = `${utils.rootUrl}/${keyword ? `?s=${keyword}` : ''}`;
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: currentUrl,
|
||||
itunes_author: title,
|
||||
item: await utils.fetch(ctx.cache, currentUrl),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const rootUrl = 'https://www.elitebabes.com';
|
||||
|
||||
const fetch = async (cache, currentUrl) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
$('.clip-a, .displayblock').remove();
|
||||
|
||||
const list = $('.gallery-a li')
|
||||
.slice(0, 50)
|
||||
.map((_, item) => {
|
||||
item = $(item).children('a').eq(0);
|
||||
const image = item.find('img').eq(0);
|
||||
|
||||
return {
|
||||
link: item.attr('href'),
|
||||
title: item.attr('title') || image.attr('alt'),
|
||||
itunes_item_image: image.attr('src').replace('_200', '_400'),
|
||||
pubDate: (item.next()[0] ? new Date(item.next().text()) : new Date()).toUTCString(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
cache.tryGet(item.link, async () => {
|
||||
try {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('input, .link-btn, .m-pagination').remove();
|
||||
content('.mobile-hide, .wide-hide').remove();
|
||||
|
||||
if (item.link.indexOf(`${rootUrl}/model/`) === 0) {
|
||||
item.author = content('.fn').text();
|
||||
item.description = content('#content').html();
|
||||
return item;
|
||||
}
|
||||
|
||||
const authors = [];
|
||||
const video = content('video');
|
||||
|
||||
item.description = '';
|
||||
|
||||
if (video.length > 0) {
|
||||
const poster = detailResponse.data.match(/posterImage: "(.*)",/);
|
||||
item.itunes_item_image = (poster ? poster[1] : video.attr('poster')) || item.itunes_item_image;
|
||||
|
||||
item.enclosure_type = 'video/mp4';
|
||||
item.enclosure_url = video.children('source').attr('src');
|
||||
item.description = `<video controls loop preload="auto"><source src=${item.enclosure_url} type="video/mp4"/></video><img src="${item.itunes_item_image}">`;
|
||||
}
|
||||
|
||||
content('.link-btn h2 a').each(function () {
|
||||
authors.push(content(this).text());
|
||||
});
|
||||
|
||||
item.author = authors.join(', ');
|
||||
|
||||
content('.list-justified2 li a').each(function () {
|
||||
item.description += `<img src="${content(this).attr('href')}">`;
|
||||
});
|
||||
|
||||
return item;
|
||||
} catch (e) {
|
||||
return Promise.resolve('');
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
return items;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
rootUrl,
|
||||
fetch,
|
||||
};
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
const utils = require('./utils');
|
||||
|
||||
const sorts = {
|
||||
popular: {
|
||||
url: '',
|
||||
title: 'Popular',
|
||||
},
|
||||
recent: {
|
||||
url: 'latest',
|
||||
title: 'Recent',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const sort = ctx.params.sort || '';
|
||||
const title = `${sort ? sorts[sort].title : 'Popular'} videos - Elite Babes`;
|
||||
|
||||
const currentUrl = `${utils.rootUrl}/videos${sort ? `?sort=${sorts[sort].url}` : ''}`;
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: currentUrl,
|
||||
itunes_author: title,
|
||||
item: await utils.fetch(ctx.cache, currentUrl),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const CryptoJS = require('crypto-js');
|
||||
const password = 'gefdzfdef';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const tag = ctx.params.tag ? ctx.params.tag : 'all';
|
||||
const mode = ctx.params.mode ? ctx.params.mode : 'simple';
|
||||
const limit = 'simple' === mode ? 20 : 10;
|
||||
|
||||
const url = `https://girlimg.epio.app/api/articles?lang=en-us&filter={"where":{"tag":"${tag}","lang":"en-us"},"limit":20,"skip":0}`;
|
||||
|
||||
const index_json = await fetchUrl(url);
|
||||
|
||||
const items = await Promise.all(
|
||||
index_json.slice(0, limit).map(async (item) => {
|
||||
const simple = {
|
||||
title: item.title,
|
||||
link: `https://girlimg.epio.app/article/detail/${item._id}`,
|
||||
pubDate: new Date(item.release_date).toUTCString(),
|
||||
};
|
||||
let details;
|
||||
if ('simple' === mode) {
|
||||
details = {
|
||||
description: item.cover,
|
||||
};
|
||||
} else {
|
||||
details = await ctx.cache.tryGet(item._id, async () => {
|
||||
const data = await fetchUrl(`https://girlimg.epio.app/api/articles/${item._id}?lang=en-us`);
|
||||
return {
|
||||
description: data.content,
|
||||
};
|
||||
});
|
||||
}
|
||||
return Promise.resolve(Object.assign({}, simple, details));
|
||||
})
|
||||
);
|
||||
ctx.state.data = {
|
||||
title: 'girlimg - album',
|
||||
link: `https://girlimg.epio.app`,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
||||
async function fetchUrl(url) {
|
||||
const encrypt_json = (
|
||||
await got({
|
||||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
Referer: 'https://girlimg.epio.app/',
|
||||
},
|
||||
})
|
||||
).data;
|
||||
|
||||
const bytes = CryptoJS.AES.decrypt(encrypt_json.string, password);
|
||||
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const url = ctx.params.love ? `https://www.gracg.com/${ctx.params.user}/love` : `https://www.gracg.com/${ctx.params.user}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
const html = response.body;
|
||||
const $ = cheerio.load(html);
|
||||
const data = $('.TheWorksList').find('li');
|
||||
|
||||
if (data.length === 0) {
|
||||
ctx.state.data = {
|
||||
title: `${ctx.params.user} 的涂鸦王国作品`,
|
||||
link: `https://gracg.com/${ctx.params.user}`,
|
||||
description: `${ctx.params.user} 的涂鸦王国作品`,
|
||||
};
|
||||
} else {
|
||||
const name = $('.userbox .username').text();
|
||||
const item = await Promise.all(
|
||||
data
|
||||
.slice(0, 10)
|
||||
.map(async (i, el) => {
|
||||
const link = $(el).find('.imgbox a').attr('href');
|
||||
const pics = await ctx.cache.tryGet(link, async () => {
|
||||
const res = await got.get(link);
|
||||
const $1 = cheerio.load(res.body);
|
||||
return $1('.workPage-images img')
|
||||
.map((i, el) => $1(el).attr('src'))
|
||||
.get();
|
||||
});
|
||||
const description = generateItemDesc(pics);
|
||||
return {
|
||||
title: $(el).find('.infobox .titles').text(),
|
||||
description,
|
||||
pubDate: new Date($(el).find('.infobox .time').text()).toUTCString(),
|
||||
link,
|
||||
};
|
||||
})
|
||||
.get()
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${name} 的涂鸦王国作品`,
|
||||
link: `https://gracg.com/${ctx.params.user}`,
|
||||
description: `${name} 的涂鸦王国作品`,
|
||||
item,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据图片链接生成 html
|
||||
* @param {Array} pics
|
||||
* @return {String} itemDesc
|
||||
*/
|
||||
function generateItemDesc(pics) {
|
||||
const itemDesc = pics.reduce((acc, pic) => {
|
||||
acc += `<img src='${pic}><br>`;
|
||||
return acc;
|
||||
}, '');
|
||||
return itemDesc;
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
const { processFeed } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const url = ctx.params.type ? `https://ja.hentai-cosplays.com/search/${ctx.params.type}/${encodeURIComponent(ctx.params.name)}/` : 'https://ja.hentai-cosplays.com/search/';
|
||||
const items = await processFeed(url);
|
||||
ctx.state.data = {
|
||||
title: `${ctx.params.name || '新着コスプレ一覧'} - エロコスプレ`,
|
||||
link: url,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const baseUrl = 'https://www.jdlingyu.mobi/';
|
||||
const viewProps = {
|
||||
tuji: '图集',
|
||||
as: '文章',
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const type = ctx.params.type || 'tuji';
|
||||
const url = baseUrl + type;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const items = await Promise.all(
|
||||
$('#post-list > ul.b2_gap > li')
|
||||
.get()
|
||||
.map(async (div) => {
|
||||
const a = $(div).find('.post-info > h2 > a');
|
||||
const link = a.attr('href');
|
||||
const description = await ctx.cache.tryGet(link, async () => {
|
||||
const response = await got.get(link);
|
||||
const $ = cheerio.load(response.data);
|
||||
return $('.entry-content > p').html();
|
||||
});
|
||||
return Promise.resolve({
|
||||
title: a.text(),
|
||||
description,
|
||||
author: $(div).find('.post-header .users').text(),
|
||||
link,
|
||||
pubDate: new Date($(div).find('.post-header time').attr('datetime')).toUTCString(),
|
||||
});
|
||||
})
|
||||
);
|
||||
ctx.state.data = {
|
||||
title: `${viewProps[type]} - 绝对领域`,
|
||||
link: url,
|
||||
description: `${viewProps[type]} - 绝对领域`,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const chrono = require('chrono-node');
|
||||
|
||||
const base = 'https://loveheaven.net/';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const slug = ctx.params.slug;
|
||||
|
||||
const url = `https://loveheaven.net/manga-${slug.replace(/^manga-/, '').replace(/\.html$/, '')}.html`;
|
||||
|
||||
const response = await got.get(url);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const manga_name = $('.manga-info > h1').text();
|
||||
const manga_other_names = $('.manga-info > li:nth-child(3)').text();
|
||||
const manga_author = $('a.btn-info')
|
||||
.map(function () {
|
||||
return $(this).text();
|
||||
})
|
||||
.get()
|
||||
.join(', ');
|
||||
const manga_cover = $('img.thumbnail').attr('src');
|
||||
|
||||
const list = $('.tab-text .table > tbody > tr').get();
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${manga_name} - LoveHeaven`,
|
||||
description: manga_other_names,
|
||||
link: url,
|
||||
image: manga_cover,
|
||||
item: list.slice(0, 20).map((item) => {
|
||||
item = $(item);
|
||||
const entry = item.find('a');
|
||||
const humanized_date = item.find('time').text();
|
||||
return {
|
||||
title: entry.text(),
|
||||
author: manga_author,
|
||||
description: `<img src="${manga_cover}" style="max-width: 100%;">`,
|
||||
link: base + entry.attr('href'),
|
||||
pubDate: humanized_date ? chrono.parseDate(humanized_date) : new Date(),
|
||||
};
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const { getItem } = require('./util');
|
||||
|
||||
const map = {
|
||||
xinggan: '性感妹子',
|
||||
japan: '日本妹子',
|
||||
taiwan: '台湾妹子',
|
||||
mm: '清纯妹子',
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { category } = ctx.params;
|
||||
|
||||
const url = `https://www.mzitu.com/${category}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
const items = await getItem(ctx, response.data);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `妹子图-${map[category]} `,
|
||||
link: url,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const { getItem } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { type = '' } = ctx.params;
|
||||
let url;
|
||||
let title = '妹子图';
|
||||
|
||||
if (type === 'hot') {
|
||||
title += '-最热';
|
||||
url = 'https://www.mzitu.com/hot/';
|
||||
} else if (type === 'best') {
|
||||
title += '-推荐';
|
||||
url = 'https://www.mzitu.com/best/';
|
||||
} else {
|
||||
title += '-最新';
|
||||
url = 'https://www.mzitu.com/';
|
||||
}
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
|
||||
const items = await getItem(ctx, response.data);
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link: url,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { id } = ctx.params;
|
||||
|
||||
const link = `http://www.mzitu.com/${id}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const page_lengh = $('div.pagenavi > a:nth-last-child(2) > span').text();
|
||||
const title = $('h2.main-title').text();
|
||||
|
||||
const pages = Array.from({ length: page_lengh }, (v, i) => i);
|
||||
|
||||
ctx.state.data = {
|
||||
title,
|
||||
link,
|
||||
item: await Promise.all(
|
||||
pages.map(async (page) => {
|
||||
const page_link = link + '/' + (page + 1).toString();
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: page_link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const item_link = $('div.main-image img').attr('src');
|
||||
const item_title = `${title} (${page + 1})`;
|
||||
const description = `<img src="${item_link}">`;
|
||||
return {
|
||||
title: item_title,
|
||||
link: page_link,
|
||||
description,
|
||||
};
|
||||
})
|
||||
),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const { getItem } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
let tag = ctx.params.tag;
|
||||
tag = tag === undefined || tag === 'undefined' ? '' : tag;
|
||||
|
||||
const link = `https://www.mzitu.com/tag/${tag}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const items = await getItem(ctx, response.data);
|
||||
|
||||
let name = $('div.currentpath').text();
|
||||
name = name.split('»')[1];
|
||||
|
||||
ctx.state.data = {
|
||||
title: name,
|
||||
link,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const link = 'https://www.mzitu.com/zhuanti';
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('div.postlist > dl > dd').get();
|
||||
|
||||
ctx.state.data = {
|
||||
title: '妹子图专题',
|
||||
link,
|
||||
description: '妹子图美女专题栏目,为您精心准备各种美女图片专题,包括名站美女写真,妹子特点分类,美女大全等专题。',
|
||||
item: list.map((item) => ({
|
||||
title: $(item).find('img').attr('alt'),
|
||||
link: $(item).find('a').attr('href'),
|
||||
})),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
exports.getItem = (ctx, data) => {
|
||||
const $ = cheerio.load(data);
|
||||
const list = $('#pins li').get().slice(0, 5);
|
||||
|
||||
return Promise.all(
|
||||
list.map(async (item) => {
|
||||
const title = $(item).find('span > a').text();
|
||||
const item_link = $(item).find('span > a').attr('href');
|
||||
|
||||
const cache = await ctx.cache.get(item_link);
|
||||
let description;
|
||||
if (cache) {
|
||||
description = cache;
|
||||
} else {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: item_link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const page_lengh = $('div.pagenavi > a:nth-last-child(2) > span').text();
|
||||
|
||||
const pages = Array.from({ length: page_lengh }, (v, i) => i);
|
||||
const description_list = await Promise.all(
|
||||
pages.map(async (page) => {
|
||||
const page_link = item_link + '/' + (page + 1).toString();
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: page_link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
return `<img src="${$('div.main-image img').attr('src')}"><br>`;
|
||||
})
|
||||
);
|
||||
|
||||
description = description_list.join('');
|
||||
ctx.cache.set(item_link, description);
|
||||
}
|
||||
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
link: item_link,
|
||||
};
|
||||
})
|
||||
);
|
||||
};
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const currentUrl = 'https://zhutix.com/';
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('#main div.grid-bor div.content-card')
|
||||
.slice(0, 10)
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
const a = item.find('a');
|
||||
return {
|
||||
title: a.text(),
|
||||
link: a.attr('href'),
|
||||
pubDate: new Date(item.find('i.feng-liulanjilu').parent().text()).toUTCString(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const res = await got({ method: 'get', url: item.link });
|
||||
const content = cheerio.load(res.data);
|
||||
|
||||
item.description = content('#entry-content').html();
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: '致美化 - 最新主题',
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const currentUrl = `${rootUrl}/new/actual`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl);
|
||||
};
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const currentUrl = `${rootUrl}/${id}`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl);
|
||||
};
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const currentUrl = `${rootUrl}/genre_${id}`;
|
||||
const apiUrl = `${rootUrl}/show_block.php?type=getNextPageData&page=genre&community_id=${id}`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl, apiUrl);
|
||||
};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const currentUrl = `${rootUrl}/new/interesting`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl);
|
||||
};
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
module.exports = {
|
||||
'/actual': ['nczitzk'],
|
||||
'/author/:id': ['nczitzk'],
|
||||
'/genre/:id': ['nczitzk'],
|
||||
'/interesting': ['nczitzk'],
|
||||
'/map': ['nczitzk'],
|
||||
'/new': ['nczitzk'],
|
||||
};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const currentUrl = `${rootUrl}/new/map`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl);
|
||||
};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
const { rootUrl, ProcessItems } = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const currentUrl = `${rootUrl}/new`;
|
||||
|
||||
ctx.state.data = await ProcessItems(currentUrl);
|
||||
};
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
module.exports = {
|
||||
'35photo.pro': {
|
||||
_name: '35PHOTO',
|
||||
'.': [
|
||||
{
|
||||
title: 'New photos',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-new-photos',
|
||||
source: ['/new', '/'],
|
||||
target: '/35photo/new',
|
||||
},
|
||||
{
|
||||
title: 'Featured photos',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-featured-photos',
|
||||
source: ['/new/actual', '/'],
|
||||
target: '/35photo/actual',
|
||||
},
|
||||
{
|
||||
title: 'New interesting',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-new-interesting',
|
||||
source: ['/new/interesting', '/'],
|
||||
target: '/35photo/interesting',
|
||||
},
|
||||
{
|
||||
title: 'Photos on the world map',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-photos-on-the-world-map',
|
||||
source: ['/new/map', '/'],
|
||||
target: '/35photo/map',
|
||||
},
|
||||
{
|
||||
title: 'Genre',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-genre',
|
||||
source: ['/'],
|
||||
target: (params, url) => `/35photo/genre/${url.match(/genre_(\d+)/)[1]}`,
|
||||
},
|
||||
{
|
||||
title: 'Author',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#35photo-author',
|
||||
source: ['/:id', '/'],
|
||||
target: '/35photo/author/:id',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
module.exports = function (router) {
|
||||
router.get('/actual', require('./actual'));
|
||||
router.get('/author/:id', require('./author'));
|
||||
router.get('/genre/:id', require('./genre'));
|
||||
router.get('/interesting', require('./interesting'));
|
||||
router.get('/map', require('./map'));
|
||||
router.get('/new', require('./new'));
|
||||
};
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const rootUrl = 'https://35photo.pro';
|
||||
|
||||
module.exports = {
|
||||
rootUrl,
|
||||
ProcessItems: async (currentUrl, apiUrl) => {
|
||||
let $, response;
|
||||
|
||||
response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const data = response.data;
|
||||
|
||||
$ = cheerio.load(data);
|
||||
|
||||
const title = $('h1').text();
|
||||
|
||||
if (apiUrl) {
|
||||
response = await got({
|
||||
method: 'get',
|
||||
url: `${apiUrl}&lastId=${$('div.countLike').last().attr('photo-id')}`,
|
||||
});
|
||||
|
||||
$ = cheerio.load(data + response.data.data);
|
||||
}
|
||||
|
||||
const items = $('.item')
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
|
||||
const image = item.find('.showPrevPhoto');
|
||||
|
||||
return {
|
||||
title: image.attr('title').replace(/Photographer\\'s photo - /, ''),
|
||||
link: image.parent().attr('href'),
|
||||
author: item.next().find('.userName').text().replace(/© /, ''),
|
||||
category: image
|
||||
.attr('alt')
|
||||
.replace(/photo preview/g, '')
|
||||
.split(/,|#/)
|
||||
.map((c) => c.trim()),
|
||||
description: `<img src="${rootUrl}/photos_main/${image.attr('src').match(/sizes\/(.*)_/)[1]}.jpg">`,
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
title: `${title} - 35PHOTO`,
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cherrio = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const timezone = require('@/utils/timezone');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { category = '' } = ctx.params;
|
||||
let url;
|
||||
|
||||
if (category !== '') {
|
||||
url = 'https://www.buxiuse.com/?cid=' + category;
|
||||
} else {
|
||||
url = 'https://www.buxiuse.com';
|
||||
}
|
||||
|
||||
const response = await got({
|
||||
url,
|
||||
headers: {
|
||||
Referer: 'https://www.buxiuse.com',
|
||||
},
|
||||
});
|
||||
|
||||
const data = response.data;
|
||||
const $ = cherrio.load(data);
|
||||
|
||||
let resultItem = $('li.span3 img')
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
const img_url = item.attr('src');
|
||||
return {
|
||||
title: item.attr('title'),
|
||||
link: item.parent().attr('href'),
|
||||
description: `<img src="${img_url}">`,
|
||||
guid: img_url,
|
||||
};
|
||||
});
|
||||
|
||||
resultItem = await Promise.all(
|
||||
resultItem.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
url: item.link,
|
||||
headers: {
|
||||
Referer: url,
|
||||
},
|
||||
});
|
||||
const detailData = detailResponse.data;
|
||||
const $ = cherrio.load(detailData);
|
||||
|
||||
item.author = $('li.name').text();
|
||||
item.pubDate = timezone(parseDate($('div.info abbr').attr('title')), +8);
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: url,
|
||||
item: resultItem,
|
||||
description: '不羞涩 | 真实的图片分享交友社区',
|
||||
};
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
'/:category?': ['kba977'],
|
||||
};
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
module.exports = {
|
||||
'buxiuse.com': {
|
||||
_name: '不羞涩',
|
||||
'.': [
|
||||
{
|
||||
title: '分类',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#bu-xiu-se',
|
||||
source: '/',
|
||||
target: (_params, url) => `/dbmv${new URL(url).searchParams.has('cid') ? `/${new URL(url).searchParams.get('cid')}` : ''}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = (router) => {
|
||||
router.get('/:category?', require('./index'));
|
||||
};
|
||||
|
|
@ -6,6 +6,4 @@ module.exports = function (router) {
|
|||
router.get('/fonts/:sort?', require('./fonts'));
|
||||
router.get('/news/:category/:locale', require('./news'));
|
||||
router.get('/scholar/:query', require('./scholar'));
|
||||
router.get('/sites/recentChanges/:id', require('./sitesRecentChanges'));
|
||||
router.get('/sites/:id', require('./sites'));
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,51 +0,0 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const rootUrl = 'https://sites.google.com';
|
||||
const currentUrl = `${rootUrl}/site/${id}/activity.xml`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
let items = $('entry')
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
|
||||
return {
|
||||
title: item.find('summary').text(),
|
||||
link: item.find('summary a').attr('href'),
|
||||
pubDate: parseDate(item.find('updated').text()),
|
||||
author: item.find('author name').text(),
|
||||
};
|
||||
});
|
||||
|
||||
items = await Promise.all(
|
||||
items.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
item.description = content('#sites-canvas').html();
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('feed title').first().text(),
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
const path = require('path');
|
||||
const cheerio = require('cheerio');
|
||||
const got = require('@/utils/got');
|
||||
const { art } = require('@/utils/render');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const timezone = require('@/utils/timezone');
|
||||
|
||||
const HOME_URL = 'https://www.meituclub.com/';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: HOME_URL,
|
||||
});
|
||||
|
||||
const data = response.data;
|
||||
|
||||
const $ = cheerio.load(data);
|
||||
const list = $('#index-tab-main .posts-item.card');
|
||||
|
||||
ctx.state.data = {
|
||||
title: '妹图社 - 最新',
|
||||
link: HOME_URL,
|
||||
item: list
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
const img = item.find('.item-thumbnail').find('img');
|
||||
const heading = item.find('.item-heading').find('a');
|
||||
return {
|
||||
title: heading.text(),
|
||||
description: art(path.join(__dirname, 'templates/description.art'), {
|
||||
src: img.attr('data-src'),
|
||||
alt: img.attr('alt'),
|
||||
}),
|
||||
link: heading.attr('href'),
|
||||
pubDate: timezone(parseDate(item.find('.item-meta').find('.icon-circle').attr('title'), 'YYYY-MM-DD HH:mm:ss'), +8),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
'/latest': ['ocleo1'],
|
||||
};
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
module.exports = {
|
||||
'meituclub.com': {
|
||||
_name: '妹图社',
|
||||
'.': [
|
||||
{
|
||||
title: '最新',
|
||||
docs: 'https://docs.rsshub.app/routes/picture#mei-tu-she-zui-xin',
|
||||
source: ['/'],
|
||||
target: '/meituclub/latest',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = function (router) {
|
||||
router.get('/latest', require('./latest'));
|
||||
};
|
||||
|
|
@ -1 +0,0 @@
|
|||
<img src="{{ src }}" alt="{{ alt }}" />
|
||||
|
|
@ -165,20 +165,6 @@
|
|||
|
||||
<Route author="nczitzk" example="/asiantolick/page/news" path="/asiantolick/page/:id" paramsDesc={['Page id']} radar="1" />
|
||||
|
||||
## BabeHub {#babehub}
|
||||
|
||||
### Category {#babehub-category}
|
||||
|
||||
<Route author="nczitzk" example="/babehub" path="/babehub/:category?" paramsDesc={['Category, see below, Home by default']} notOperational="1">
|
||||
| Home | Most Viewed | Picture Archive | Video Archive |
|
||||
| ---- | ----------- | --------------- | ------------- |
|
||||
| | most-viewed | picture | video |
|
||||
</Route>
|
||||
|
||||
### Search {#babehub-search}
|
||||
|
||||
<Route author="nczitzk" example="/babehub/search/babe" path="/babehub/search/:keyword?" paramsDesc={['关键字']} notOperational="1" />
|
||||
|
||||
## Bing Wallpaper {#bing-wallpaper}
|
||||
|
||||
### Daily Wallpaper {#bing-wallpaper-daily-wallpaper}
|
||||
|
|
@ -218,14 +204,6 @@
|
|||
|
||||
<Route author="zphw" example="/dailyart/en" path="/dailyart/:language?" paramsDesc={['Support en, es, fr, de, it, zh, jp, etc. English by default.']} anticrawler="1" />
|
||||
|
||||
## Dilbert Comic Strip {#dilbert-comic-strip}
|
||||
|
||||
### Dilbert Comic Strip {#dilbert-comic-strip-dilbert-comic-strip}
|
||||
|
||||
<Route name="Daily Strip" author="Maecenas" example="/dilbert/strip" path="/dilbert/strip" notOperational="1">
|
||||
通过提取漫画,提供比官方源更佳的阅读体验。
|
||||
</Route>
|
||||
|
||||
## E-Hentai {#e-hentai}
|
||||
|
||||
For RSS content, specify options in the `routeParams` parameter in query string format to control additional functionality
|
||||
|
|
@ -247,28 +225,6 @@ For RSS content, specify options in the `routeParams` parameter in query string
|
|||
|
||||
<Route author="yindaheng98" example="/ehentai/search/f_search=artist%3Amana%24/1" path="/ehentai/search/:params?/:page?/:routeParams?" paramsDesc={['Search parameters. You can copy the content after `https://e-hentai.org/?`', 'Page number', 'Additional parameters, see the table above']} anticrawler="1" supportBT="1" />
|
||||
|
||||
## Elite Babes {#elite-babes}
|
||||
|
||||
### Home {#elite-babes-home}
|
||||
|
||||
<Route author="nczitzk" example="/elitebabes" path="/elitebabes/:category?" paramsDesc={['Category, see below, Home by default']} notOperational="1">
|
||||
| Home | Hot | Popular | Recent |
|
||||
| ---- | --- | ------- | ------ |
|
||||
| | hot | popular | recent |
|
||||
</Route>
|
||||
|
||||
### Videos {#elite-babes-videos}
|
||||
|
||||
<Route author="nczitzk" example="/elitebabes/videos" path="/elitebabes/videos/:sort?" paramsDesc={['Sort, see below, Popular by default']} notOperational="1">
|
||||
| Popular | Recent |
|
||||
| ------- | ------ |
|
||||
| popular | recent |
|
||||
</Route>
|
||||
|
||||
### Search {#elite-babes-search}
|
||||
|
||||
<Route author="nczitzk" example="/elitebabes/search/pose" path="/elitebabes/search/:keyword?" paramsDesc={['Keyword']} notOperational="1" />
|
||||
|
||||
## Fantia {#fantia}
|
||||
|
||||
### Search {#fantia-search}
|
||||
|
|
@ -329,12 +285,6 @@ For RSS content, specify options in the `routeParams` parameter in query string
|
|||
|
||||
<Route author="nczitzk" example="/fantia/user/3498" path="/fantia/user/:id" paramsDesc={['User id, can be found in user profile URL']} />
|
||||
|
||||
## GirlImg {#girlimg}
|
||||
|
||||
### album {#girlimg-album}
|
||||
|
||||
<Route author="junfengP" example="/girlimg/album" path="/girlimg/album/:tag?/:mode?" paramsDesc={['过滤标签,在链接参数中&tab=部分,如:中国,BoLoLi','加载模式,留空为简单模式,获取20篇文章标题与封面;非空为详细模式,加载10篇文章内容']} notOperational="1" />
|
||||
|
||||
## GoComics {#gocomics}
|
||||
|
||||
### Comic Strips {#gocomics-comic-strips}
|
||||
|
|
@ -353,12 +303,6 @@ For RSS content, specify options in the `routeParams` parameter in query string
|
|||
|
||||
<Route author="hoilc" example="/google/album/msFFnAzKmQmWj76EA" path="/google/album/:id" paramsDesc={['album ID, can be found in URL, for example, `https://photos.app.goo.gl/msFFnAzKmQmWj76EA` to `msFFnAzKmQmWj76EA`']} radar="1" notOperational="1" />
|
||||
|
||||
## Hentai Cosplay {#hentai-cosplay}
|
||||
|
||||
### 最新图片 {#hentai-cosplay-zui-xin-tu-pian}
|
||||
|
||||
<Route author="hoilc" example="/hentai-cosplays/tag/swimsuit" path="/hentai-cosplays/:type?/:name?" paramsDesc={['搜索类型, `tag`为标签, `keyword`为关键字, 默认留空为全部','搜索内容, 可在 URL 中找到,默认留空为全部']} notOperational="1" />
|
||||
|
||||
## Konachan Anime Wallpapers {#konachan-anime-wallpapers}
|
||||
|
||||
:::tip
|
||||
|
|
@ -378,17 +322,11 @@ For RSS content, specify options in the `routeParams` parameter in query string
|
|||
- 1 year: [https://rsshub.app/konachan/post/popular\_recent/1y](https://rsshub.app/konachan/post/popular_recent/1y)
|
||||
</Route>
|
||||
|
||||
## LoveHeaven {#loveheaven}
|
||||
|
||||
### Manga Updates {#loveheaven-manga-updates}
|
||||
|
||||
<Route author="hoilc" example="/loveheaven/update/kimetsu-no-yaiba" path="/loveheaven/update/:slug" paramsDesc={['Manga slug, can be found in URL, including neither `manga-` nor `.html`']} notOperational="1" />
|
||||
|
||||
## Mic Mic Idol {#mic-mic-idol}
|
||||
|
||||
### Latest {#mic-mic-idol-latest}
|
||||
|
||||
<Route author="KotoriK" example="/micmicidol" path="/micmicidol" notOperational="1" />
|
||||
<Route author="KotoriK" example="/micmicidol" path="/micmicidol" />
|
||||
|
||||
### 标签 {#mic-mic-idol-biao-qian}
|
||||
|
||||
|
|
@ -532,28 +470,12 @@ For example [Latest Wallpapers](https://wallhaven.cc/latest), the route turning
|
|||
- 1 year: [https://rsshub.app/yande.re/post/popular\_recent/1y](https://rsshub.app/yande.re/post/popular_recent/1y)
|
||||
</Route>
|
||||
|
||||
## 百度趣画 {#bai-du-qu-hua}
|
||||
|
||||
### 更新 {#bai-du-qu-hua-geng-xin}
|
||||
|
||||
<Route author="xyqfer" example="/baidu/doodles" path="/baidu/doodles" notOperational="1" />
|
||||
|
||||
## 北京天文馆 {#bei-jing-tian-wen-guan}
|
||||
|
||||
### 每日一图 {#bei-jing-tian-wen-guan-mei-ri-yi-tu}
|
||||
|
||||
<Route author="HenryQW" example="/bjp/apod" path="/bjp/apod" radar="1" />
|
||||
|
||||
## 不羞涩 {#bu-xiu-se}
|
||||
|
||||
### 分类 {#bu-xiu-se-fen-lei}
|
||||
|
||||
<Route author="kba977" example="/dbmv" path="/dbmv/:category?" paramsDesc={['分类 id - 若不填该参数, 默认所有']} notOperational="1">
|
||||
| 大胸妹 | 小翘臀 | 黑丝袜 | 美腿控 | 有颜值 | 大杂烩 |
|
||||
| ------ | ------ | ------ | ------ | ------ | ------ |
|
||||
| 2 | 6 | 7 | 3 | 4 | 5 |
|
||||
</Route>
|
||||
|
||||
## 煎蛋 {#jian-dan}
|
||||
|
||||
### 板块 {#jian-dan-ban-kuai}
|
||||
|
|
@ -576,16 +498,6 @@ For example [Latest Wallpapers](https://wallhaven.cc/latest), the route turning
|
|||
|
||||
<Route author="lonelykid nczitzk" example="/jandan" path="/jandan" />
|
||||
|
||||
## 绝对领域 {#jue-dui-ling-yu}
|
||||
|
||||
### 图集文章 {#jue-dui-ling-yu-tu-ji-wen-zhang}
|
||||
|
||||
<Route author="Kherrisan" example="/jdlingyu/tuji" path="/jdlingyu/:type" paramsDesc={['分区名']} notOperational="1" />
|
||||
|
||||
| 图集 | 文章 |
|
||||
| ---- | ---- |
|
||||
| tuji | as |
|
||||
|
||||
## 酷 18 {#ku-18}
|
||||
|
||||
### 分站 {#ku-18-fen-zhan}
|
||||
|
|
@ -610,38 +522,6 @@ For example [Latest Wallpapers](https://wallhaven.cc/latest), the route turning
|
|||
|
||||
<Route author="nczitzk" example="/cool18/bbs/keywords/都市" path="/cool18/:id/keywords/:keyword?" paramsDesc={['分站,见上表,默认为禁忌书屋', '关键字']} />
|
||||
|
||||
## 妹图社 {#mei-tu-she}
|
||||
|
||||
### 最新 {#mei-tu-she-zui-xin}
|
||||
|
||||
<Route author="ocleo1" example="/meituclub/latest" path="/meituclub/latest" notOperational="1" />
|
||||
|
||||
## 妹子图 {#mei-zi-tu}
|
||||
|
||||
### 首页(最新) {#mei-zi-tu-shou-ye-zui-xin}
|
||||
|
||||
<Route author="gee1k xyqfer LogicJake" example="/mzitu/home" path="/mzitu/home/:type?" paramsDesc={['类型,默认最新,可选`hot`最热或`best`推荐']} anticrawler="1" />
|
||||
|
||||
### 分类 {#mei-zi-tu-fen-lei}
|
||||
|
||||
<Route author="gee1k xyqfer LogicJake" example="/mzitu/category/xinggan" path="/mzitu/category/:category" paramsDesc={['分类名']} anticrawler="1">
|
||||
| 性感妹子 | 日本妹子 | 台湾妹子 | 清纯妹子 |
|
||||
| -------- | -------- | -------- | -------- |
|
||||
| xinggan | japan | taiwan | mm |
|
||||
</Route>
|
||||
|
||||
### 所有专题 {#mei-zi-tu-suo-you-zhuan-ti}
|
||||
|
||||
<Route author="gee1k xyqfer LogicJake" example="/mzitu/tags" path="/mzitu/tags" anticrawler="1" />
|
||||
|
||||
### 专题详情 {#mei-zi-tu-zhuan-ti-xiang-qing}
|
||||
|
||||
<Route author="gee1k xyqfer LogicJake" example="/mzitu/tag/shishen" path="/mzitu/tag/:tag" paramsDesc={['专题名, 可在专题页 URL 中找到']} anticrawler="1" />
|
||||
|
||||
### 详情 {#mei-zi-tu-xiang-qing}
|
||||
|
||||
<Route author="gee1k xyqfer LogicJake" example="/mzitu/post/129452" path="/mzitu/post/:id" paramsDesc={['详情 id, 可在详情页 URL 中找到']} anticrawler="1" />
|
||||
|
||||
## 喷嚏 {#pen-ti}
|
||||
|
||||
### 图卦 {#pen-ti-tu-gua}
|
||||
|
|
@ -657,15 +537,3 @@ For example [Latest Wallpapers](https://wallhaven.cc/latest), the route turning
|
|||
### 频道 {#qi-pa-mai-jia-xiu-pin-dao}
|
||||
|
||||
<Route author="Fatpandac nczitzk" example="/qipamaijia/fuli" path="/qipamaijia/:cate?" paramsDesc={['频道名,可在对应网址中找到,默认为最新']} radar="1" />
|
||||
|
||||
## 涂鸦王国 {#tu-ya-wang-guo}
|
||||
|
||||
### 用户上传作品和用户喜欢作品 {#tu-ya-wang-guo-yong-hu-shang-chuan-zuo-pin-he-yong-hu-xi-huan-zuo-pin}
|
||||
|
||||
<Route author="LanceZhu" example="/gracg/user11968EIcqS3" path="/gracg/:user/:love?" paramsDesc={['用户访问ID,用户主页URL获取', '是否切换为用户喜欢作品, 不选或为 0 不切换,1则切换']} notOperational="1" />
|
||||
|
||||
## 致美化 {#zhi-mei-hua}
|
||||
|
||||
### 最新主题 {#zhi-mei-hua-zui-xin-zhu-ti}
|
||||
|
||||
<Route author="nczitzk" example="/zhutix/latest" path="/zhutix/latest" notOperational="1" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue