diff --git a/docs/README.md b/docs/README.md index b756eb971c..6f3fb692dc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -553,6 +553,10 @@ RSSHub 提供下列 API 接口: +### 美拍 + + + ### 雪球 diff --git a/lib/router.js b/lib/router.js index 90a918a4cc..c57051a540 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1040,4 +1040,7 @@ router.get('/ebb', require('./routes/ebb')); // Indienova router.get('/indienova/article', require('./routes/indienova/article')); +// 美拍 +router.get('/meipai/user/:uid', require('./routes/meipai/user')); + module.exports = router; diff --git a/lib/routes/meipai/user.js b/lib/routes/meipai/user.js new file mode 100644 index 0000000000..bf1258e483 --- /dev/null +++ b/lib/routes/meipai/user.js @@ -0,0 +1,40 @@ +const axios = require('../../utils/axios'); +const cheerio = require('cheerio'); +const util = require('./utils'); + +// const date = require('../../utils/date'); + +module.exports = async (ctx) => { + const uid = ctx.params.uid; + + const response = await axios({ + method: 'get', + url: `https://www.meipai.com/user/${uid}`, + headers: { + Referer: 'https://www.meipai.com/', + }, + }); + const data = response.data; + + const $ = cheerio.load(data); // 使用 cheerio 加载返回的 HTML + const list = $('#mediasList') + .find('li') + .get(); + const name = $('.feed-left .content-l-h2').text(); + + const result = await util.ProcessFeed(list, ctx.cache); + + // 使用 cheerio 选择器,选择 class="note-list" 下的所有 "li"元素,返回 cheerio node 对象数组 + // cheerio get() 方法将 cheerio node 对象数组转换为 node 对象数组 + + // 注:每一个 cheerio node 对应一个 HTML DOM + // 注:cheerio 选择器与 jquery 选择器几乎相同 + // 参考 cheerio 文档:https://cheerio.js.org/ + + ctx.state.data = { + title: `${name}又有更新了`, + link: `https://www.meipai.com/user/${uid}/`, + description: `${name}`, + item: result, + }; +}; diff --git a/lib/routes/meipai/utils.js b/lib/routes/meipai/utils.js new file mode 100644 index 0000000000..a30acf7254 --- /dev/null +++ b/lib/routes/meipai/utils.js @@ -0,0 +1,35 @@ +const cheerio = require('cheerio'); +const url = require('url'); + +const ProcessFeed = async (list) => { + const host = 'https://www.meipai.com'; + + return await Promise.all( + list.map(async (item) => { + const $ = cheerio.load(item); + + const $title = $('.detail-cover-title'); + const $desciption = $('.feed-description'); + + // 详情页面的地址(视频页面地址) + const itemUrl = url.resolve(host, $desciption.attr('href')); + + // RSS内容(美拍提供了友好的网页版视频展示) + const imgSrc = $('.feed-v-wrap img').attr('src'); + const text = $desciption.text() + ``; + + // 列表上提取到的信息 + return { + title: $title.text(), + description: text, + link: itemUrl, + author: $('.feed-name').text(), + guid: itemUrl, + }; + }) + ); +}; + +module.exports = { + ProcessFeed, +};