feat: remove notOperational routes - picture

This commit is contained in:
DIYgod 2023-12-21 02:46:58 +08:00
parent b081d984a1
commit fe6117a421
No known key found for this signature in database
44 changed files with 1 additions and 1350 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +0,0 @@
const { rootUrl, ProcessItems } = require('./utils');
module.exports = async (ctx) => {
const currentUrl = `${rootUrl}/new/actual`;
ctx.state.data = await ProcessItems(currentUrl);
};

View File

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

View File

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

View File

@ -1,7 +0,0 @@
const { rootUrl, ProcessItems } = require('./utils');
module.exports = async (ctx) => {
const currentUrl = `${rootUrl}/new/interesting`;
ctx.state.data = await ProcessItems(currentUrl);
};

View File

@ -1,8 +0,0 @@
module.exports = {
'/actual': ['nczitzk'],
'/author/:id': ['nczitzk'],
'/genre/:id': ['nczitzk'],
'/interesting': ['nczitzk'],
'/map': ['nczitzk'],
'/new': ['nczitzk'],
};

View File

@ -1,7 +0,0 @@
const { rootUrl, ProcessItems } = require('./utils');
module.exports = async (ctx) => {
const currentUrl = `${rootUrl}/new/map`;
ctx.state.data = await ProcessItems(currentUrl);
};

View File

@ -1,7 +0,0 @@
const { rootUrl, ProcessItems } = require('./utils');
module.exports = async (ctx) => {
const currentUrl = `${rootUrl}/new`;
ctx.state.data = await ProcessItems(currentUrl);
};

View File

@ -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',
},
],
},
};

View File

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

View File

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

View File

@ -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: '不羞涩 | 真实的图片分享交友社区',
};
};

View File

@ -1,3 +0,0 @@
module.exports = {
'/:category?': ['kba977'],
};

View File

@ -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')}` : ''}`,
},
],
},
};

View File

@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/:category?', require('./index'));
};

View File

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

View File

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

View File

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

View File

@ -1,3 +0,0 @@
module.exports = {
'/latest': ['ocleo1'],
};

View File

@ -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',
},
],
},
};

View File

@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/latest', require('./latest'));
};

View File

@ -1 +0,0 @@
<img src="{{ src }}" alt="{{ alt }}" />

View File

@ -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" />