From 90d734455c8849e3c5042111c9682fbda12efd87 Mon Sep 17 00:00:00 2001 From: cssxsh <32539286+cssxsh@users.noreply.github.com> Date: Mon, 28 Oct 2019 14:48:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20dlsite=E4=BA=A7=E5=93=81=E6=89=93?= =?UTF-8?q?=E6=8A=98=E4=BF=A1=E6=81=AF=20(#3339)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/anime.md | 7 +- lib/router.js | 1 + lib/routes/dlsite/campaign.js | 176 ++++++++++++++++++++++++++++++++++ lib/routes/dlsite/new.js | 4 +- 4 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 lib/routes/dlsite/campaign.js diff --git a/docs/anime.md b/docs/anime.md index 92cbfdbf68..215e7f8f01 100644 --- a/docs/anime.md +++ b/docs/anime.md @@ -88,7 +88,7 @@ pageClass: routes ## DLsite -### 当前日期发售产品 +### 当前日期发售的新产品 @@ -98,6 +98,11 @@ pageClass: routes +### 产品打折信息 + + + + ## ebb.io ### ebb diff --git a/lib/router.js b/lib/router.js index bddaf78914..a2166e0709 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1871,6 +1871,7 @@ router.get('/nature/natmachintell/research', require('./routes/nature/natmachint // dlsite router.get('/dlsite/new/:type', require('./routes/dlsite/new')); +router.get('/dlsite/campaign/:type/:free?', require('./routes/dlsite/campaign')); // mcbbs router.get('/mcbbs/forum/:type', require('./routes/mcbbs/forum')); diff --git a/lib/routes/dlsite/campaign.js b/lib/routes/dlsite/campaign.js new file mode 100644 index 0000000000..4bcee55c4b --- /dev/null +++ b/lib/routes/dlsite/campaign.js @@ -0,0 +1,176 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +const host = 'https://www.dlsite.com'; +const infos = { + // 全年齢向け + home: { + type: 'home', + name: '「DLsite 同人」', + url: '/home/fsr', + params: { + campaign: 'campaign', + work_category: ['doujin'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + comic: { + type: 'comic', + name: '「DLsite コミック」', + url: '/comic/fsr', + params: { + campaign: 'campaign', + work_category: ['books'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + soft: { + type: 'soft', + name: '「DLsite PCソフト」', + url: '/soft/fsr', + params: { + campaign: 'campaign', + work_category: ['pc'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + // 成人向け( R18 ) + maniax: { + type: 'maniax', + name: '「DLsite 同人 - R18」', + url: '/maniax/fsr', + params: { + campaign: 'campaign', + work_category: ['doujin'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + books: { + type: 'books', + name: '「DLsite 成年コミック - R18」', + url: '/books/fsr', + params: { + campaign: 'campaign', + work_category: ['books'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + pro: { + type: 'pro', + name: '「DLsite 美少女ゲーム」', + url: '/pro/fsr', + params: { + campaign: 'campaign', + work_category: ['pc'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + // 女性向け + girls: { + type: 'girls', + name: '「DLsite 乙女」', + url: '/girls/fsr', + params: { + campaign: 'campaign', + work_category: ['doujin'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, + bl: { + type: 'bl', + name: '「DLsite BL」', + url: '/bl/fsr', + params: { + campaign: 'campaign', + work_category: ['doujin'], + order: ['cstart_d'], + per_page: 30, + show_type: 1, + }, + }, +}; +const setUrl = (info) => { + let paramsPath = `${info.url}/=`; + const params = info.params; + for (const name in params) { + if (Array.isArray(params[name])) { + for (const index in params[name]) { + paramsPath += `/${name}[${index}]/${params[name][index]}`; + } + } else { + paramsPath += `/${name}/${params[name]}`; + } + } + return paramsPath; +}; + +module.exports = async (ctx) => { + const info = infos[ctx.params.type]; + // 判断参数是否合理 + if (info === undefined) { + throw Error('不支持指定类型!'); + } + if (ctx.params.free !== undefined) { + info.params.is_free = 1; + } + const link = host + setUrl(info); + + const response = await got(link, { + method: 'GET', + baseUrl: host, + }); + const data = response.data; + const $ = cheerio.load(data); + + const title = `${info.name} | 割引中の作品`; + const description = $('meta[name="description"]').attr('content'); + const list = $('tr[class]', '.n_worklist'); + const item = list + .map((index, element) => { + const title = $('.work_name', element).text(); + const link = $('.work_name > a', element).attr('href'); + // 使链接 + $('a', element).each((index, element) => { + $(element).attr('target', '_blank'); + }); + const description = $(element).html(); + const arr = $('.search_tag', element); + const category = $('a', arr) + .map((index, a) => $(a).text()) + .get(); + const author = $('.maker_name', element).text(); + + const signle = { + title: title, + link: link, + description: description, + category: category, + author: author, + }; + return signle; + }) + .get(); + + ctx.state.data = { + title: title, + link: link, + description: description, + language: 'ja-jp', + allowEmpty: true, + item: item, + }; +}; diff --git a/lib/routes/dlsite/new.js b/lib/routes/dlsite/new.js index 757885a084..2115c81b5d 100644 --- a/lib/routes/dlsite/new.js +++ b/lib/routes/dlsite/new.js @@ -50,12 +50,13 @@ const infos = { module.exports = async (ctx) => { const info = infos[ctx.params.type]; + const link = host + info.url; // 判断参数是否合理 if (info === undefined) { throw Error('不支持指定类型!'); } - const response = await got(info.url, { + const response = await got(link, { method: 'GET', baseUrl: host, }); @@ -63,7 +64,6 @@ module.exports = async (ctx) => { const $ = cheerio.load(data); const title = $('title').text(); - const link = response.requestUrl; const description = $('meta[name="description"]').attr('content'); const list = $('.n_worklist_item'); const dateText = $('.work_update')