From 9d9d8698a368a0f3f5a13054cb7af5852c98695f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=99=8E=E6=95=85=E6=B4=9E?= <55782476+TigerCubDen@users.noreply.github.com> Date: Mon, 15 Feb 2021 11:16:19 +0800 Subject: [PATCH] feat(route): add FurAffinity routes (#6912) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Add files via upload * Create .env * Update followings_dynamic.js * Update followings_dynamic.js * Update followings_dynamic.js * Update social-media.md * Delete .env * Update social-media.md * Update followings_dynamic.js * Update followings_dynamic.js * Add files via upload 添加作者信息 * [CodeFactor] Apply fixes to commit 57935d0 [ci skip] [skip ci] * Update followings_dynamic.js * Update router.js * Update followings_dynamic.js * Update social-media.md * Update social-media.md * Update followings_dynamic.js * Update followings_dynamic.js * Create .env * Update .env * Update followings_dynamic.js * Update router.js * Update followings_dynamic.js * Delete .env * [CodeFactor] Apply fixes [ci skip] [skip ci] * Update followings_dynamic.js 优化代码 * Update followings_dynamic.js * [CodeFactor] Apply fixes to commit 7a43db0 [ci skip] [skip ci] * Create .env * Update followings_dynamic.js * [CodeFactor] Apply fixes to commit 14dfa49 [ci skip] [skip ci] * Update followings_dynamic.js * Update followings_dynamic.js * [CodeFactor] Apply fixes to commit d60fc51 [ci skip] [skip ci] * Delete .env * Update followings_dynamic.js 优化代码 * [CodeFactor] Apply fixes to commit 8086726 [ci skip] [skip ci] * [CodeFactor] Apply fixes to commit e1c8843 [ci skip] [skip ci] * Update social-media.md * Update router.js * Update router.js * Create browse.js * Create commissions.js * Create favorites.js * Create gallery.js * Create home.js * Create scraps.js * Create search.js * Create shouts.js * Create status * Create watchers * Create watching * Update social-media.md * Update social-media.md * Update social-media.md * Update social-media.md * [CodeFactor] Apply fixes [ci skip] [skip ci] * Update browse.js fix * Update favorites.js * Update gallery.js * Update home.js * Update scraps.js * Update search.js * Update and rename status to status.js * [CodeFactor] Apply fixes to commit 29a0f7b [ci skip] [skip ci] * Update home.js * Update status.js * Update status.js * Update browse.js * Update favorites.js * Update gallery.js * Update home.js * Update scraps.js * Update search.js * Rename watchers to watchers.js * [CodeFactor] Apply fixes to commit 099bd34 [ci skip] [skip ci] * Rename watching to watching.js * [CodeFactor] Apply fixes to commit 3c18a88 [ci skip] [skip ci] * Update social-media.md * Update browse.js * Update favorites.js * Update gallery.js * Update home.js * Update scraps.js * Update search.js * Update social-media.md * Update social-media.md * Update social-media.md * Update router.js * Update social-media.md * Update social-media.md * Update search.js * [CodeFactor] Apply fixes to commit 2b13a90 [ci skip] [skip ci] * Update scraps.js * Create user.js * Update watchers.js * [CodeFactor] Apply fixes to commit 6636a44 [ci skip] [skip ci] * Update watching.js * Update watchers.js * Update watching.js * [CodeFactor] Apply fixes to commit 9b713a6 [ci skip] [skip ci] * Update watchers.js * Update router.js * Create journals.js * Update social-media.md * Update social-media.md * Create submission_comments.js * Create journal_comments.js * Update router.js * Update social-media.md * Update social-media.md * Update social-media.md * Update user.js * [CodeFactor] Apply fixes to commit a31f50f [ci skip] [skip ci] * Update user.js Co-authored-by: TigerDen96 <55782476+TigerDen96@users.noreply.github.com> Co-authored-by: 小虎故洞 <55782476+XiaoHuGuDong@users.noreply.github.com> Co-authored-by: codefactor-io Co-authored-by: 小虎故洞 <55782476+TigerWolfDen@users.noreply.github.com> --- docs/en/social-media.md | 70 ++++++++++++ docs/social-media.md | 72 ++++++++++++- lib/router.js | 17 +++ lib/routes/furaffinity/browse.js | 45 ++++++++ lib/routes/furaffinity/commissions.js | 39 +++++++ lib/routes/furaffinity/favorites.js | 55 ++++++++++ lib/routes/furaffinity/gallery.js | 56 ++++++++++ lib/routes/furaffinity/home.js | 60 +++++++++++ lib/routes/furaffinity/journal_comments.js | 50 +++++++++ lib/routes/furaffinity/journals.js | 49 +++++++++ lib/routes/furaffinity/scraps.js | 55 ++++++++++ lib/routes/furaffinity/search.js | 55 ++++++++++ lib/routes/furaffinity/shouts.js | 40 +++++++ lib/routes/furaffinity/status.js | 41 +++++++ lib/routes/furaffinity/submission_comments.js | 50 +++++++++ lib/routes/furaffinity/user.js | 102 ++++++++++++++++++ lib/routes/furaffinity/watchers.js | 48 +++++++++ lib/routes/furaffinity/watching.js | 48 +++++++++ 18 files changed, 951 insertions(+), 1 deletion(-) create mode 100644 lib/routes/furaffinity/browse.js create mode 100644 lib/routes/furaffinity/commissions.js create mode 100644 lib/routes/furaffinity/favorites.js create mode 100644 lib/routes/furaffinity/gallery.js create mode 100644 lib/routes/furaffinity/home.js create mode 100644 lib/routes/furaffinity/journal_comments.js create mode 100644 lib/routes/furaffinity/journals.js create mode 100644 lib/routes/furaffinity/scraps.js create mode 100644 lib/routes/furaffinity/search.js create mode 100644 lib/routes/furaffinity/shouts.js create mode 100644 lib/routes/furaffinity/status.js create mode 100644 lib/routes/furaffinity/submission_comments.js create mode 100644 lib/routes/furaffinity/user.js create mode 100644 lib/routes/furaffinity/watchers.js create mode 100644 lib/routes/furaffinity/watching.js diff --git a/docs/en/social-media.md b/docs/en/social-media.md index a34cf4aca5..1e262026ee 100644 --- a/docs/en/social-media.md +++ b/docs/en/social-media.md @@ -275,3 +275,73 @@ YouTube provides official RSS feeds for channels, for instance + +## Fur Affinity + +### Home + + + +Type + +| artwork | crafts | music | writing | +| ---- | ---- | ---- | ---- | +| artwork | crafts | music | writing | + + + +### Browse + + + +### Website Status + + + +### Userpage Profile + + + +### Search + + + +### User's Watching List + + + +### User's Watcher List + + + +### User's Commission Information + + + +### User's Shouts + + + +### User's Journals + + + +### User's Gallery + + + +### User's Scraps + + + +### User's Favorites + + + +### Submission Comments + + + +### Journal Comments + + diff --git a/docs/social-media.md b/docs/social-media.md index 51ce665a82..e4818132f3 100644 --- a/docs/social-media.md +++ b/docs/social-media.md @@ -208,7 +208,7 @@ Tiny Tiny RSS 会给所有 iframe 元素添加 `sandbox="allow-scripts"` 属性 ### 用户关注动态 - + ::: warning 注意 用户动态需要 b 站登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。 @@ -1180,3 +1180,73 @@ rule 用户关注动态需要登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。 ::: + +## Fur Affinity + +### 主页 + + + +类型 type + +| 艺术品 | 手工制品 | 音乐 | 文学 | +| ---- | ---- | ---- | ---- | +| artwork | crafts | music | writing | + + + +### 浏览 + + + +### 站点状态 + + + +### 搜索 + + + +### 用户主页简介 + + + +### 用户关注列表 + + + +### 用户被关注列表 + + + +### 用户接受委托信息 + + + +### 用户的Shouts留言 + + + +### 用户的日记 + + + +### 用户的创作画廊 + + + +### 用户的零碎(非正式)作品 + + + +### 用户的喜爱列表 + + + +### 作品评论区 + + + +### 日记评论区 + + diff --git a/lib/router.js b/lib/router.js index 9a5108b66f..43a231d3f1 100644 --- a/lib/router.js +++ b/lib/router.js @@ -3944,4 +3944,21 @@ router.get('/macked/app/:name', require('./routes/macked/app')); // 美国劳工联合会-产业工会联合会 router.get('/aflcio/blog', require('./routes/aflcio/blog')); +// Fur Affinity +router.get('/furaffinity/home/:type?/:nsfw?', require('./routes/furaffinity/home')); +router.get('/furaffinity/browse/:nsfw?', require('./routes/furaffinity/browse')); +router.get('/furaffinity/status', require('./routes/furaffinity/status')); +router.get('/furaffinity/search/:keyword/:nsfw?', require('./routes/furaffinity/search')); +router.get('/furaffinity/user/:username', require('./routes/furaffinity/user')); +router.get('/furaffinity/watching/:username', require('./routes/furaffinity/watching')); +router.get('/furaffinity/watchers/:username', require('./routes/furaffinity/watchers')); +router.get('/furaffinity/commissions/:username', require('./routes/furaffinity/commissions')); +router.get('/furaffinity/shouts/:username', require('./routes/furaffinity/shouts')); +router.get('/furaffinity/journals/:username', require('./routes/furaffinity/journals')); +router.get('/furaffinity/gallery/:username/:nsfw?', require('./routes/furaffinity/gallery')); +router.get('/furaffinity/scraps/:username/:nsfw?', require('./routes/furaffinity/scraps')); +router.get('/furaffinity/favorites/:username/:nsfw?', require('./routes/furaffinity/favorites')); +router.get('/furaffinity/submission_comments/:id', require('./routes/furaffinity/submission_comments')); +router.get('/furaffinity/journal_comments/:id', require('./routes/furaffinity/journal_comments')); + module.exports = router; diff --git a/lib/routes/furaffinity/browse.js b/lib/routes/furaffinity/browse.js new file mode 100644 index 0000000000..421979185c --- /dev/null +++ b/lib/routes/furaffinity/browse.js @@ -0,0 +1,45 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const nsfw = String(ctx.params.nsfw); + + // 判断传入的参数nsfw + let url = 'https://faexport.spangle.org.uk/browse.json?sfw=1'; + if (nsfw === '1') { + url = 'https://faexport.spangle.org.uk/browse.json'; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + + ctx.state.data = { + // 源标题 + title: `Fur Affinity Browse`, + // 源链接 + link: `https://www.furaffinity.net/browse/`, + // 源说明 + description: `Fur Affinity Browse`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.title, + // 正文 + description: ``, + // 链接 + link: item.link, + // 作者 + author: item.name, + // 由于源API未提供日期,故无pubDate + })), + }; +}; diff --git a/lib/routes/furaffinity/commissions.js b/lib/routes/furaffinity/commissions.js new file mode 100644 index 0000000000..f763c336b2 --- /dev/null +++ b/lib/routes/furaffinity/commissions.js @@ -0,0 +1,39 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const username = String(ctx.params.username); + + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}/commissions.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + + ctx.state.data = { + // 源标题 + title: `${username}'s Commissions`, + // 源链接 + link: `https://www.furaffinity.net/commissions/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Commissions`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.title, + // 正文 + description: `${item.description}
`, + // 链接 + link: item.submission.link, + // 作者 + author: username, + // 由于源API未提供日期,故无pubDate + })), + }; +}; diff --git a/lib/routes/furaffinity/favorites.js b/lib/routes/furaffinity/favorites.js new file mode 100644 index 0000000000..d94b8f76e3 --- /dev/null +++ b/lib/routes/furaffinity/favorites.js @@ -0,0 +1,55 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const nsfw = String(ctx.params.nsfw); + const username = String(ctx.params.username); + + // 添加参数username以及判断传入的参数nsfw + let url = `https://faexport.spangle.org.uk/user/${username}/favorites.rss?sfw=1`; + if (nsfw === '1') { + url = `https://faexport.spangle.org.uk/user/${username}/favorites.rss`; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 使用 cheerio 加载返回的 HTML + + const data = response.data; + const $ = cheerio.load(data, { + xmlMode: true + }); + + const list = $('item'); + + ctx.state.data = { + // 源标题 + title: `${username}'s Favorites`, + // 源链接 + link: `https://www.furaffinity.net/favorites/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Favorites`, + + // 遍历此前获取的数据 + item: + list && + list.map((index, item) => { + item = $(item); + return { + title: item.find("title").text(), + description: item.find("description").text(), + link: item.find("link").text(), + pubDate: new Date(item.find("pubDate").text()).toUTCString(), + }; + }) + .get(), + }; +}; diff --git a/lib/routes/furaffinity/gallery.js b/lib/routes/furaffinity/gallery.js new file mode 100644 index 0000000000..73869cdc7c --- /dev/null +++ b/lib/routes/furaffinity/gallery.js @@ -0,0 +1,56 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const nsfw = String(ctx.params.nsfw); + const username = String(ctx.params.username); + + // 添加参数username以及判断传入的参数nsfw + let url = `https://faexport.spangle.org.uk/user/${username}/gallery.rss?sfw=1`; + if (nsfw === '1') { + url = `https://faexport.spangle.org.uk/user/${username}/gallery.rss`; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 使用 cheerio 加载返回的 HTML + + const data = response.data; + const $ = cheerio.load(data, { + xmlMode: true + }); + + const list = $('item'); + + ctx.state.data = { + // 源标题 + title: `${username}'s Gallery`, + // 源链接 + link: `https://www.furaffinity.net/gallery/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Gallery`, + + // 遍历此前获取的数据 + item: + list && + list.map((index, item) => { + item = $(item); + return { + title: item.find("title").text(), + description: item.find("description").text(), + link: item.find("link").text(), + pubDate: new Date(item.find("pubDate").text()).toUTCString(), + author: username, + }; + }) + .get(), + }; +}; diff --git a/lib/routes/furaffinity/home.js b/lib/routes/furaffinity/home.js new file mode 100644 index 0000000000..e1815b2a29 --- /dev/null +++ b/lib/routes/furaffinity/home.js @@ -0,0 +1,60 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const type = String(ctx.params.type); + const nsfw = String(ctx.params.nsfw); + + // 判断传入的参数nsfw + let url = 'https://faexport.spangle.org.uk/home.json?sfw=1'; + if (nsfw === '1' || type === '1') { + url = 'https://faexport.spangle.org.uk/home.json'; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + let data = response.data; + + // 判断传入的参数type,分别为:artwork、crafts、music、writing + if (type === 'artwork') { + data = data.artwork; + } + else if (type === 'crafts') { + data = data.crafts; + } else if (type === 'music') { + data = data.music; + } else if (type === 'writing') { + data = data.writing; + } else { + data = data.artwork; + } + + ctx.state.data = { + // 源标题 + title: `Fur Affinity Home`, + // 源链接 + link: `https://www.furaffinity.net/`, + // 源说明 + description: `Fur Affinity Home`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.title, + // 正文 + description: ``, + // 链接 + link: item.link, + // 作者 + author: item.name, + // 由于源API未提供日期,故无pubDate + })), + }; +}; diff --git a/lib/routes/furaffinity/journal_comments.js b/lib/routes/furaffinity/journal_comments.js new file mode 100644 index 0000000000..f2bba0d289 --- /dev/null +++ b/lib/routes/furaffinity/journal_comments.js @@ -0,0 +1,50 @@ +const got = require('@/utils/got'); + +module.exports = async (ctx) => { + //传入参数 + const id = String(ctx.params.id); + + // 发起 HTTP GET 请求 + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/journal/${id}/comments.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + //发起第二个 HTTP GET 请求,用于获取该日记的标题 + const response2 = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/journal/${id}.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + const data2 = response2.data; + + ctx.state.data = { + // 源标题 + title: `${data2.title} - Journal Comments`, + // 源链接 + link: `https://www.furaffinity.net/journal/${id}/`, + // 源说明 + description: `Fur Affinity ${data2.title} - Journal Comments`, + + //遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.text, + // 正文 + description: `
${item.name}: ${item.text}`, + // 链接 + link: `https://www.furaffinity.net/journal/${id}/`, + //作者 + author: item.name, + //日期 + pubDate: new Date(item.posted_at).toUTCString(), + })), + } +}; diff --git a/lib/routes/furaffinity/journals.js b/lib/routes/furaffinity/journals.js new file mode 100644 index 0000000000..ca2af0cef2 --- /dev/null +++ b/lib/routes/furaffinity/journals.js @@ -0,0 +1,49 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + //传入参数 + const username = String(ctx.params.username); + + //添加参数username + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}/journals.rss`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 使用 cheerio 加载返回的 HTML + const data = response.data; + const $ = cheerio.load(data, { + xmlMode: true + }); + + const list = $('item'); + + ctx.state.data = { + // 源标题 + title: `${username}'s Journals`, + // 源链接 + link: `https://www.furaffinity.net/journals/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Journals`, + + //遍历此前获取的数据 + item: + list && + list.map((index, item) => { + item = $(item); + return { + title: item.find("title").text(), + description: item.find("description").text(), + link: item.find("link").text(), + pubDate: new Date(item.find("pubDate").text()).toUTCString(), + author: username, + }; + }) + .get(), + } +}; diff --git a/lib/routes/furaffinity/scraps.js b/lib/routes/furaffinity/scraps.js new file mode 100644 index 0000000000..b76509dd3b --- /dev/null +++ b/lib/routes/furaffinity/scraps.js @@ -0,0 +1,55 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const nsfw = String(ctx.params.nsfw); + const username = String(ctx.params.username); + + // 添加参数username以及判断传入的参数nsfw + let url = `https://faexport.spangle.org.uk/user/${username}/scraps.rss?sfw=1`; + if (nsfw === '1') { + url = `https://faexport.spangle.org.uk/user/${username}/scraps.rss`; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 使用 cheerio 加载返回的 HTML + const data = response.data; + const $ = cheerio.load(data, { + xmlMode: true + }); + + const list = $('item'); + + ctx.state.data = { + // 源标题 + title: `${username}'s Scraps`, + // 源链接 + link: `https://www.furaffinity.net/scraps/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Scraps`, + + // 遍历此前获取的数据 + item: + list && + list.map((index, item) => { + item = $(item); + return { + title: item.find("title").text(), + description: item.find("description").text(), + link: item.find("link").text(), + pubDate: new Date(item.find("pubDate").text()).toUTCString(), + author: username, + }; + }) + .get(), + }; +}; diff --git a/lib/routes/furaffinity/search.js b/lib/routes/furaffinity/search.js new file mode 100644 index 0000000000..a1bd237dc5 --- /dev/null +++ b/lib/routes/furaffinity/search.js @@ -0,0 +1,55 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const nsfw = String(ctx.params.nsfw); + const keyword = String(ctx.params.keyword); + + // 添加参数keyword以及判断传入的参数nsfw + let url = `https://faexport.spangle.org.uk/search.rss?q=${keyword}?sfw=1`; + if (nsfw === '1' || keyword === '1') { + url = `https://faexport.spangle.org.uk/search.rss?q=${keyword}`; + } + + const response = await got({ + method: 'get', + url: url, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 使用 cheerio 加载返回的 HTML + const data = response.data; + const $ = cheerio.load(data, { + xmlMode: true + }); + + const list = $('item'); + + ctx.state.data = { + // 源标题 + title: `FA ${keyword}'s Search List`, + // 源链接 + link: `https://www.furaffinity.net/search/?q=${keyword}`, + // 源说明 + description: `Fur Affinity ${keyword}'s Search List`, + + // 遍历此前获取的数据 + item: + list && + list.map((index, item) => { + item = $(item); + return { + title: item.find("title").text(), + description: item.find("description").text(), + link: item.find("link").text(), + pubDate: new Date(item.find("pubDate").text()).toUTCString(), + // 由于源API未提供作者信息,故无author + }; + }) + .get(), + }; +}; diff --git a/lib/routes/furaffinity/shouts.js b/lib/routes/furaffinity/shouts.js new file mode 100644 index 0000000000..96df0d4ff9 --- /dev/null +++ b/lib/routes/furaffinity/shouts.js @@ -0,0 +1,40 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const username = String(ctx.params.username); + + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}/shouts.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + + ctx.state.data = { + // 源标题 + title: `${username}'s Shouts`, + // 源链接 + link: `https://www.furaffinity.net/user/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Shouts`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.text, + // 正文 + description: `
${item.text} `, + // 链接 + link: `https://www.furaffinity.net/user/${username}/`, + // 作者 + author: item.name, + // 日期 + pubDate: new Date(item.posted_at).toUTCString(), + })), + }; +}; diff --git a/lib/routes/furaffinity/status.js b/lib/routes/furaffinity/status.js new file mode 100644 index 0000000000..f996edf388 --- /dev/null +++ b/lib/routes/furaffinity/status.js @@ -0,0 +1,41 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/status.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + const status = data.online; + + let description = ''; + if (Object.keys(data)[0] === "online") { + description = `Status: ${Object.keys(data)[0]}
Guests: ${status.guests}
Registered: ${status.registered}
Other: ${status.other}
Total: ${status.total}
Fa Server Time: ${data.fa_server_time}
Fa Server Time at: ${data.fa_server_time_at} `; + } else { + description = "offline"; + } + const item = []; + item.push({ + title: `Status:${Object.keys(data)[0]}`, + description, + link: `https://www.furaffinity.net/`, + }); + + + ctx.state.data = { + // 源标题 + title: `Fur Affinity Status`, + // 源链接 + link: `https://www.furaffinity.net/`, + // 源说明 + description: `Fur Affinity Status`, + + item: item, + }; + +}; diff --git a/lib/routes/furaffinity/submission_comments.js b/lib/routes/furaffinity/submission_comments.js new file mode 100644 index 0000000000..2bcd454d54 --- /dev/null +++ b/lib/routes/furaffinity/submission_comments.js @@ -0,0 +1,50 @@ +const got = require('@/utils/got'); + +module.exports = async (ctx) => { + //传入参数 + const id = String(ctx.params.id); + + // 发起 HTTP GET 请求 + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/submission/${id}/comments.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + //发起第二个 HTTP GET 请求,用于获取该作品的标题 + const response2 = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/submission/${id}.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + const data2 = response2.data; + + ctx.state.data = { + // 源标题 + title: `${data2.title} - Submission Comments`, + // 源链接 + link: `https://www.furaffinity.net/view/${id}/`, + // 源说明 + description: `Fur Affinity ${data2.title} - Submission Comments`, + + //遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item.text, + // 正文 + description: `
${item.name}: ${item.text}`, + // 链接 + link: `https://www.furaffinity.net/view/${id}/`, + //作者 + author: item.name, + //日期 + pubDate: new Date(item.posted_at).toUTCString(), + })), + } +}; diff --git a/lib/routes/furaffinity/user.js b/lib/routes/furaffinity/user.js new file mode 100644 index 0000000000..4afe8c33d9 --- /dev/null +++ b/lib/routes/furaffinity/user.js @@ -0,0 +1,102 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const username = String(ctx.params.username); + // 添加参数username + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + + // 收集传入的数据 + const id = data.id; + const name = data.name; + const profile = data.profile; + const account_type = data.profile; + const avatar = ``; + const full_name = data.full_name; + const artist_type = data.artist_type; + const user_title = data.user_title; + const registered_since = data.registered_since; + const registered_at = data.registered_at; + const current_mood = data.current_mood; + const artist_profile = data.artist_profile; + const pageviews = data.pageviews; + const submissions = data.submissions; + const comments_received = data.comments_received; + const comments_given = data.comments_given; + const journals = data.journals; + const favorite = data.favorites; + const watchers_count = data.watchers.count; + const watching_count = data.watching.count; + + const artist_information = data.artist_information; + const species = artist_information.Species; + const personal_quote = artist_information['Personal Quote']; + const music_type_genre = artist_information['Music Type/Genre']; + const favorites_movie = artist_information['Favorite Movie']; + const favorites_game = artist_information['Favorite Game']; + const favorites_game_platform = artist_information['Favorite Game Platform']; + const favorites_artist = artist_information['Favorite Artist']; + const favorites_animal = artist_information['Favorite Animal']; + const favorites_website = artist_information['Favorite Website']; + const favorites_food = artist_information['Favorite Food']; + + const contact_information = data.contact_information; + let contact_result = "null"; + + // 对一个或多个用户联系方式进行遍历 + if (contact_information !== "null") { + contact_result = ""; + for (let i = 0; i < contact_information.length; i++) { + for (const j in contact_information[i]) { + if (j === "title") { + contact_result += `Title: ${contact_information[i][j]}
`; + } + else if (j === "name") { + contact_result += `Name: ${contact_information[i][j]}
`; + } + else if (j === "link") { + contact_result += `Link: ${contact_information[i][j]}
`; + } + } + contact_result += `
`; + } + } + + const description = `Id: ${id}
Name: ${name}
Profile: ${profile}
Account Type: ${account_type}
+ Avatar: ${avatar}
Full Name: ${full_name}
Artist Type: ${artist_type}
User Title: ${user_title}
+ Registered Since: ${registered_since}
Registered at: ${registered_at}
Current Mood: ${current_mood}

Artist Profile:
${artist_profile}

+ Pageviews: ${pageviews}
Submissions: ${submissions}
Comments_Received: ${comments_received}
Comments Given: ${comments_given}
+ Journals: ${journals}
Favorite: ${favorite}

Artist Information:
Species: ${species}
Personal Quote: ${personal_quote}
Music Type/Genre: ${music_type_genre}
+ Favorite Movie: ${favorites_movie}
Favorite Game: ${favorites_game}
Favorite Game Platform: ${favorites_game_platform}
Favorite Artist: ${favorites_artist}
+ Favorite Animal: ${favorites_animal}
Favorite Website: ${favorites_website}
Favorite Food: ${favorites_food}

Contact Information:
${contact_result} + Watchers Count: ${watchers_count}
Watching Count: ${watching_count} `; + + const item = []; + item.push({ + title: `${data.name}'s Current Profile`, + description, + link: `https://www.furaffinity.net/user/${username}/`, + }); + + + ctx.state.data = { + // 源标题 + title: `Userpage of ${data.name}`, + // 源链接 + link: `https://www.furaffinity.net/`, + // 源说明 + description: `Fur Affinity Userpage Profile of ${data.name}`, + + item: item, + }; + +}; diff --git a/lib/routes/furaffinity/watchers.js b/lib/routes/furaffinity/watchers.js new file mode 100644 index 0000000000..076f2fbfb8 --- /dev/null +++ b/lib/routes/furaffinity/watchers.js @@ -0,0 +1,48 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const username = String(ctx.params.username); + + // 添加参数username + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}/watchers.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 发起第二个HTTP GET请求,用于获取该用户被关注总数 + const response2 = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + const data2 = response2.data; + + ctx.state.data = { + // 源标题 + title: `${username}'s Watcher List`, + // 源链接 + link: `https://www.furaffinity.net/watchlist/to/${username}/`, + // 源说明 + description: `Fur Affinity ${username}'s Watcher List`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item, + // 正文 + description: `${username} was watched by ${item}
Totall: ${data2.watchers.count} `, + // 链接 + link: `https://www.furaffinity.net/user/${item}/`, + // 由于源API未提供日期,故无pubDate + })), + }; +}; diff --git a/lib/routes/furaffinity/watching.js b/lib/routes/furaffinity/watching.js new file mode 100644 index 0000000000..9cb898fb97 --- /dev/null +++ b/lib/routes/furaffinity/watching.js @@ -0,0 +1,48 @@ +const got = require('@/utils/got'); + +// 发起 HTTP GET 请求 +module.exports = async (ctx) => { + // 传入参数 + const username = String(ctx.params.username); + + // 添加参数username + const response = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}/watching.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + // 发起第二个HTTP GET请求,用于获取该用户关注总数 + const response2 = await got({ + method: 'get', + url: `https://faexport.spangle.org.uk/user/${username}.json`, + headers: { + Referer: `https://faexport.spangle.org.uk/`, + }, + }); + + const data = response.data; + const data2 = response2.data; + + ctx.state.data = { + // 源标题 + title: `${username}'s Watching List`, + // 源链接 + link: `https://www.furaffinity.net/watchlist/by/${username}/`, + // 源说明 + description: `Fur Affinity ${username}}'s Search List`, + + // 遍历此前获取的数据 + item: data.map((item) => ({ + // 标题 + title: item, + // 正文 + description: `${username} watched ${item}
Totall: ${data2.watching.count}`, + // 链接 + link: `https://www.furaffinity.net/user/${item}/`, + // 由于源API未提供日期,故无pubDate + })), + }; +};