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