diff --git a/docs/README.md b/docs/README.md
index d51eb08b19..885ba9f491 100755
--- a/docs/README.md
+++ b/docs/README.md
@@ -654,6 +654,12 @@ RSSHub 提供下列 API 接口:
+### 好奇心日报
+
+
+
+
+
## 编程
### 掘金
@@ -2102,6 +2108,10 @@ Category 列表:
+### 界面新闻
+
+
+
### 澎湃新闻
diff --git a/lib/router.js b/lib/router.js
index fa0bd2fba4..7f1c457448 100755
--- a/lib/router.js
+++ b/lib/router.js
@@ -276,6 +276,13 @@ router.get('/jike/daily', require('./routes/jike/daily'));
// 极客时间
router.get('/geektime/column/:cid', require('./routes/geektime/column'));
+// 界面新闻
+router.get('/jiemian/list/:cid', require('./routes/jiemian/list.js'));
+
+// 好奇心日报
+router.get('/qdaily/column/:id', require('./routes/qdaily/column'));
+router.get('/qdaily/category/:id', require('./routes/qdaily/category'));
+
// 爱奇艺
router.get('/iqiyi/dongman/:id', require('./routes/iqiyi/dongman'));
diff --git a/lib/routes/jiemian/list.js b/lib/routes/jiemian/list.js
new file mode 100644
index 0000000000..2db94be894
--- /dev/null
+++ b/lib/routes/jiemian/list.js
@@ -0,0 +1,60 @@
+const cheerio = require('cheerio');
+const axios = require('../../utils/axios');
+
+module.exports = async (ctx) => {
+ const url = `https://www.jiemian.com/lists/${ctx.params.cid}.html`;
+
+ const res = await axios.get(url);
+ const $ = cheerio.load(res.data);
+ const list = $('.news-view').get();
+
+ const proList = [];
+ const indexList = [];
+
+ const out = await Promise.all(
+ list.map(async (item, i) => {
+ const $ = cheerio.load(item);
+ const time = $('.date').text();
+ let title = $('.news-img a').attr('title');
+ if (!title) {
+ title = $('a').text();
+ }
+ const itemUrl = $('.news-img a').attr('href');
+ const cache = await ctx.cache.get(itemUrl);
+ if (cache) {
+ return Promise.resolve(JSON.parse(cache));
+ }
+ const single = {
+ title,
+ pubDate: new Date(time).toUTCString(),
+ link: itemUrl,
+ guid: itemUrl,
+ };
+ proList.push(axios.get(itemUrl));
+ indexList.push(i);
+ return Promise.resolve(single);
+ })
+ );
+ const responses = await axios.all(proList);
+ for (let i = 0; i < responses.length; i++) {
+ const res = responses[i];
+ const $ = cheerio.load(res.data);
+
+ let time = $('.article-info span')
+ .eq(1)
+ .text();
+ if (!time) {
+ time = $('.article-header .info .date').text();
+ }
+ out[indexList[i]].pubDate = new Date(time).toUTCString();
+
+ const content = $('.article-view .article-main').html();
+ out[indexList[i]].description = content;
+ ctx.cache.set(out[indexList[i]].link, JSON.stringify(out[i]), 24 * 60 * 60);
+ }
+ ctx.state.data = {
+ title: $('title').text(),
+ link: url,
+ item: out,
+ };
+};
diff --git a/lib/routes/qdaily/category.js b/lib/routes/qdaily/category.js
new file mode 100644
index 0000000000..82f5eb9384
--- /dev/null
+++ b/lib/routes/qdaily/category.js
@@ -0,0 +1,51 @@
+const cheerio = require('cheerio');
+const axios = require('../../utils/axios');
+
+module.exports = async (ctx) => {
+ const url = `http://www.qdaily.com/categories/${ctx.params.id}.html`;
+
+ const res = await axios.get(url);
+ const $ = cheerio.load(res.data);
+ const list = $('.article').get();
+
+ const proList = [];
+ const indexList = [];
+
+ const out = await Promise.all(
+ list.map(async (item, i) => {
+ const $ = cheerio.load(item);
+ const time = $('.smart-date').attr('data-origindate');
+ let title = $('.title').text();
+ if (!title) {
+ title = $('.smart-dotdotdot').text();
+ }
+ const itemUrl = $('a').attr('href');
+ const allUrl = `http://www.qdaily.com${itemUrl}`;
+ const cache = await ctx.cache.get(allUrl);
+ if (cache) {
+ return Promise.resolve(JSON.parse(cache));
+ }
+ const single = {
+ title,
+ pubDate: new Date(time).toUTCString(),
+ link: allUrl,
+ guid: allUrl,
+ };
+ proList.push(axios.get(allUrl));
+ indexList.push(i);
+ return Promise.resolve(single);
+ })
+ );
+ const responses = await axios.all(proList);
+ for (let i = 0; i < responses.length; i++) {
+ const res = responses[i];
+ const $ = cheerio.load(res.data);
+ out[indexList[i]].description = $('.main .com-article-detail').html();
+ ctx.cache.set(out[indexList[i]].link, JSON.stringify(out[i]), 24 * 60 * 60);
+ }
+ ctx.state.data = {
+ title: $('title').text(),
+ link: url,
+ item: out,
+ };
+};
diff --git a/lib/routes/qdaily/column.js b/lib/routes/qdaily/column.js
new file mode 100644
index 0000000000..be2beb4229
--- /dev/null
+++ b/lib/routes/qdaily/column.js
@@ -0,0 +1,51 @@
+const cheerio = require('cheerio');
+const axios = require('../../utils/axios');
+
+module.exports = async (ctx) => {
+ const url = `http://www.qdaily.com/special_columns/${ctx.params.id}.html`;
+
+ const res = await axios.get(url);
+ const $ = cheerio.load(res.data);
+ const list = $('.article').get();
+
+ const proList = [];
+ const indexList = [];
+
+ const out = await Promise.all(
+ list.map(async (item, i) => {
+ const $ = cheerio.load(item);
+ const time = $('.smart-date').attr('data-origindate');
+ let title = $('.title').text();
+ if (!title) {
+ title = $('.smart-dotdotdot').text();
+ }
+ const itemUrl = $('a').attr('href');
+ const allUrl = `http://www.qdaily.com${itemUrl}`;
+ const cache = await ctx.cache.get(allUrl);
+ if (cache) {
+ return Promise.resolve(JSON.parse(cache));
+ }
+ const single = {
+ title,
+ pubDate: new Date(time).toUTCString(),
+ link: allUrl,
+ guid: allUrl,
+ };
+ proList.push(axios.get(allUrl));
+ indexList.push(i);
+ return Promise.resolve(single);
+ })
+ );
+ const responses = await axios.all(proList);
+ for (let i = 0; i < responses.length; i++) {
+ const res = responses[i];
+ const $ = cheerio.load(res.data);
+ out[indexList[i]].description = $('.main .com-article-detail').html();
+ ctx.cache.set(out[indexList[i]].link, JSON.stringify(out[i]), 24 * 60 * 60);
+ }
+ ctx.state.data = {
+ title: $('title').text(),
+ link: url,
+ item: out,
+ };
+};