diff --git a/docs/en/finance.md b/docs/en/finance.md
index c8e7a8938..935b14710 100644
--- a/docs/en/finance.md
+++ b/docs/en/finance.md
@@ -15,3 +15,19 @@ pageClass: routes
### US Stock News
+
+## World Economic Forum
+
+### Report
+
+
+
+Languages
+
+| English | Español | Français | 中文 | 日本語 |
+| ------- | ------- | -------- | ---- | ------ |
+| en | es | fr | cn | jp |
+
+See filters in [Report](https://www.weforum.org/reports) for Year and Platform these two parameters.
+
+
diff --git a/docs/finance.md b/docs/finance.md
index c6b8cebb3..49653029e 100644
--- a/docs/finance.md
+++ b/docs/finance.md
@@ -62,6 +62,22 @@ pageClass: routes
<Route author="nczitzk" example="/gelonghui/keyword/ 早报" path="/gelonghui/keyword/:keyword" :paramsDesc="[' 搜索关键字']/>
+## 世界经济论坛
+
+### 报告
+
+
+
+语言
+
+| English | Español | Français | 中文 | 日本語 |
+| ------- | ------- | -------- | ---- | ------ |
+| en | es | fr | cn | jp |
+
+年份 和 平台 这两个参数请参见 [报告页](https://www.weforum.org/reports) 过滤条件处。
+
+
+
## 淘股吧股票论坛
### 论坛总版
diff --git a/lib/router.js b/lib/router.js
index 3a5250e9f..8f0ec72ab 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -3241,6 +3241,9 @@ router.get('/appsales/:caty?/:time?', require('./routes/appsales/index'));
// CGTN
router.get('/cgtn/top', require('./routes/cgtn/top'));
+// World Economic Forum
+router.get('/weforum/report/:lang?/:year?/:platform?', require('./routes/weforum/report'));
+
// Nobel Prize
router.get('/nobelprize/:caty?', require('./routes/nobelprize/index'));
diff --git a/lib/routes/weforum/report.js b/lib/routes/weforum/report.js
new file mode 100644
index 000000000..69e46f690
--- /dev/null
+++ b/lib/routes/weforum/report.js
@@ -0,0 +1,53 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ ctx.params.lang = ctx.params.lang || 'www';
+ ctx.params.platform = ctx.params.platform || '';
+ ctx.params.year = ctx.params.year || '';
+
+ const rootUrl = `https://${ctx.params.lang === 'en' ? 'www' : ctx.params.lang}.weforum.org`;
+ const currentUrl = `${rootUrl}/reports?platform=${ctx.params.platform}&year=${ctx.params.year}`;
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ const list = $('.report-listing-tout__content')
+ .map((_, item) => {
+ item = $(item);
+ return {
+ title: item.find('.report-listing-tout__title').text(),
+ link: `${rootUrl}${item.find('.report-listing-tout__cta').attr('href')}`,
+ description: `Download PDF`,
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+ const content = cheerio.load(detailResponse.data);
+
+ content('.report__meta').remove();
+
+ item.description += content('.report__display-info').html();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: $('title').text(),
+ link: currentUrl,
+ item: items,
+ };
+};