feat(route): add FurAffinity routes (#6912)

* 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 <support@codefactor.io>
Co-authored-by: 小虎故洞 <55782476+TigerWolfDen@users.noreply.github.com>
This commit is contained in:
小虎故洞
2021-02-14 22:16:19 -05:00
committed by GitHub
co-authored by TigerDen96 小虎故洞 codefactor-io 小虎故洞
parent 8d03d86866
commit 9d9d8698a3
18 changed files with 951 additions and 1 deletions
+70
View File
@@ -275,3 +275,73 @@ YouTube provides official RSS feeds for channels, for instance <https://www.yout
### Playlist
<RouteEn path="/youtube/playlist/:id/:embed?" example="/youtube/playlist/PLqQ1RwlxOgeLTJ1f3fNMSwhjVgaWKo_9Z" :paramsDesc="['YouTube playlist id', 'Default to embed the video, set to any value to disable embedding']" radar="1" rssbud="1"/>
## Fur Affinity
### Home
<Route author="TigerCubDen" example="/furaffinity/home" path="/furaffinity/:type?/:nsfw?" :paramsDesc="['Type,Default to be artwork', 'NSFW Mode, do not filter NSFW Contents when value set to 1']">
Type
| artwork | crafts | music | writing |
| ---- | ---- | ---- | ---- |
| artwork | crafts | music | writing |
</Route>
### Browse
<Route author="TigerCubDen" example="/furaffinity/browse" path="/furaffinity/:nsfw?" :paramsDesc="['NSFW Mode, do not filter NSFW Contents when value set to 1']"/>
### Website Status
<Route author="TigerCubDen" example="/furaffinity/status" path="/furaffinity/status"/>
### Userpage Profile
<Route author="TigerCubDen" example="/furaffinity/user/tiger-jungle" path="/furaffinity/user/:username" :paramsDesc="['Username, Can find in userpage']"/>
### Search
<Route author="TigerCubDen" example="/furaffinity/search/tiger" path="/furaffinity/:keyword/:nsfw?" :paramsDesc="['keyword, Enter any words you want to search, require English', 'NSFW Mode,do not filter NSFW Contents when value set to 1']"/>
### User's Watching List
<Route author="TigerCubDen" example="/furaffinity/watching/okami9312" path="/furaffinity/watching/:username" :paramsDesc="['Username, Can find in userpage']"/>
### User's Watcher List
<Route author="TigerCubDen" example="/furaffinity/watchers/malikshadowclaw" path="/furaffinity/watchers/:username" :paramsDesc="['Username, Can find in userpage']"/>
### User's Commission Information
<Route author="TigerCubDen" example="/furaffinity/commissions/flashlioness" path="/furaffinity/commissions/:username" :paramsDesc="['Username, Can find in userpage']"/>
### User's Shouts
<Route author="TigerCubDen" example="/furaffinity/shouts/redodgft" path="/furaffinity/shouts/:username" :paramsDesc="['Username, Can find in userpage']"/>
### User's Journals
<Route author="TigerCubDen" example="/furaffinity/journals/rukis" path="/furaffinity/journals/:username" :paramsDesc="['Username, Can find in userpage']"/>
### User's Gallery
<Route author="TigerCubDen" example="/furaffinity/gallery/flashlioness" path="/furaffinity/gallery/:username/:nsfw?" :paramsDesc="['Username, Can find in userpage', 'NSFW Mode, do not filter NSFW Contents when value set to 1']"/>
### User's Scraps
<Route author="TigerCubDen" example="/furaffinity/scraps/flashlioness" path="/furaffinity/scraps/:username/:nsfw?" :paramsDesc="['Username, Can find in userpage', 'NSFW Mode, do not filter NSFW Contents when value set to 1']"/>
### User's Favorites
<Route author="TigerCubDen" example="/furaffinity/favorites/tiger-jungle" path="/furaffinity/favorites/:username/:nsfw?" :paramsDesc="['Username, Can find in userpage', 'NSFW Mode, do not filter NSFW Contents when value set to 1']"/>
### Submission Comments
<Route author="TigerCubDen" example="/furaffinity/submission_comments/tiger-jungle" path="/furaffinity/submission_comments/:id" :paramsDesc="['id, Can find in URL of submission page']"/>
### Journal Comments
<Route author="TigerCubDen" example="/furaffinity/journal_comments/tiger-jungle" path="/furaffinity/journal_comments/:id" :paramsDesc="['id, Can find in URL of journal page']"/>
+71 -1
View File
@@ -208,7 +208,7 @@ Tiny Tiny RSS 会给所有 iframe 元素添加 `sandbox="allow-scripts"` 属性
### 用户关注动态
<Route author="TigerWolfDen" example="/bilibili/followings/dynamic/109937383" path="/bilibili/followings/dynamic/:uid/:disableEmbed?" :paramsDesc="['用户 id', '默认为开启内嵌视频, 任意值为关闭']" selfhost="1">
<Route author="TigerCubDen" example="/bilibili/followings/dynamic/109937383" path="/bilibili/followings/dynamic/:uid/:disableEmbed?" :paramsDesc="['用户 id', '默认为开启内嵌视频, 任意值为关闭']" selfhost="1">
::: warning 注意
用户动态需要 b 站登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。
@@ -1180,3 +1180,73 @@ rule
用户关注动态需要登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。
:::
## Fur Affinity
### 主页
<Route author="TigerCubDen" example="/furaffinity/home" path="/furaffinity/:type?/:nsfw?" :paramsDesc="['类型,默认为artwork', 'NSFW开关, 当值为 1 时不过滤NSFW内容']">
类型 type
| 艺术品 | 手工制品 | 音乐 | 文学 |
| ---- | ---- | ---- | ---- |
| artwork | crafts | music | writing |
</Route>
### 浏览
<Route author="TigerCubDen" example="/furaffinity/browse" path="/furaffinity/:nsfw?" :paramsDesc="['NSFW开关, 当值为 1 时不过滤NSFW内容']"/>
### 站点状态
<Route author="TigerCubDen" example="/furaffinity/status" path="/furaffinity/status"/>
### 搜索
<Route author="TigerCubDen" example="/furaffinity/search/tiger" path="/furaffinity/:keyword/:nsfw?" :paramsDesc="['搜索关键词,仅限英文搜索', 'NSFW开关, 当值为 1 时不过滤NSFW内容']"/>
### 用户主页简介
<Route author="TigerCubDen" example="/furaffinity/user/tiger-jungle" path="/furaffinity/user/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户关注列表
<Route author="TigerCubDen" example="/furaffinity/watching/okami9312" path="/furaffinity/watching/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户被关注列表
<Route author="TigerCubDen" example="/furaffinity/watchers/malikshadowclaw" path="/furaffinity/watchers/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户接受委托信息
<Route author="TigerCubDen" example="/furaffinity/commissions/flashlioness" path="/furaffinity/commissions/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户的Shouts留言
<Route author="TigerCubDen" example="/furaffinity/shouts/redodgft" path="/furaffinity/shouts/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户的日记
<Route author="TigerCubDen" example="/furaffinity/journals/rukis" path="/furaffinity/shouts/:username" :paramsDesc="['用户名, 可在用户主页的链接处找到']"/>
### 用户的创作画廊
<Route author="TigerCubDen" example="/furaffinity/gallery/flashlioness" path="/furaffinity/gallery/:username/:nsfw?" :paramsDesc="['用户名, 可在用户主页的链接处找到', 'NSFW开关,当值为 1 时不过滤NSFW内容']"/>
### 用户的零碎(非正式)作品
<Route author="TigerCubDen" example="/furaffinity/scraps/flashlioness" path="/furaffinity/scraps/:username/:nsfw?" :paramsDesc="['用户名, 可在用户主页的链接处找到', 'NSFW开关,当值为 1 时不过滤NSFW内容']"/>
### 用户的喜爱列表
<Route author="TigerCubDen" example="/furaffinity/favorites/tiger-jungle" path="/furaffinity/favorites/:username/:nsfw?" :paramsDesc="['用户名, 可在用户主页的链接处找到', 'NSFW开关,当值为 1 时不过滤NSFW内容']"/>
### 作品评论区
<Route author="TigerCubDen" example="/furaffinity/submission_comments/34909983" path="/furaffinity/submission_comments/:id" :paramsDesc="['作品id, 可在作品所在页面对应的链接处找到']"/>
### 日记评论区
<Route author="TigerCubDen" example="/furaffinity/journal_comments/9750669" path="/furaffinity/journal_comments/:id" :paramsDesc="['日记id, 可在作品所在页面对应的链接处找到']"/>
+17
View File
@@ -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;
+45
View File
@@ -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: `<img src="${item.thumbnail}">`,
// 链接
link: item.link,
// 作者
author: item.name,
// 由于源API未提供日期,故无pubDate
})),
};
};
+39
View File
@@ -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} <br> <img src="${item.submission.thumbnail}"> `,
// 链接
link: item.submission.link,
// 作者
author: username,
// 由于源API未提供日期,故无pubDate
})),
};
};
+55
View File
@@ -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(),
};
};
+56
View File
@@ -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(),
};
};
+60
View File
@@ -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: `<img src="${item.thumbnail}">`,
// 链接
link: item.link,
// 作者
author: item.name,
// 由于源API未提供日期,故无pubDate
})),
};
};
@@ -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: `<img src="${item.avatar}"> <br> ${item.name}: ${item.text}`,
// 链接
link: `https://www.furaffinity.net/journal/${id}/`,
//作者
author: item.name,
//日期
pubDate: new Date(item.posted_at).toUTCString(),
})),
}
};
+49
View File
@@ -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(),
}
};
+55
View File
@@ -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(),
};
};
+55
View File
@@ -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(),
};
};
+40
View File
@@ -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: `<img src="${item.avatar}"> <br> ${item.text} `,
// 链接
link: `https://www.furaffinity.net/user/${username}/`,
// 作者
author: item.name,
// 日期
pubDate: new Date(item.posted_at).toUTCString(),
})),
};
};
+41
View File
@@ -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]} <br> Guests: ${status.guests} <br>Registered: ${status.registered} <br> Other: ${status.other} <br>Total: ${status.total} <br> Fa Server Time: ${data.fa_server_time} <br> 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,
};
};
@@ -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: `<img src="${item.avatar}"> <br> ${item.name}: ${item.text}`,
// 链接
link: `https://www.furaffinity.net/view/${id}/`,
//作者
author: item.name,
//日期
pubDate: new Date(item.posted_at).toUTCString(),
})),
}
};
+102
View File
@@ -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 = `<img src="${data.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]} <br> `;
}
else if (j === "name") {
contact_result += `Name: ${contact_information[i][j]} <br> `;
}
else if (j === "link") {
contact_result += `Link: ${contact_information[i][j]} <br> `;
}
}
contact_result += `<br> `;
}
}
const description = `Id: ${id} <br> Name: ${name} <br> Profile: ${profile} <br> Account Type: ${account_type} <br>
Avatar: ${avatar} <br> Full Name: ${full_name} <br> Artist Type: ${artist_type} <br> User Title: ${user_title} <br>
Registered Since: ${registered_since} <br> Registered at: ${registered_at} <br> Current Mood: ${current_mood} <br> <br> Artist Profile: <br> ${artist_profile} <br> <br>
Pageviews: ${pageviews} <br> Submissions: ${submissions} <br> Comments_Received: ${comments_received} <br> Comments Given: ${comments_given} <br>
Journals: ${journals} <br> Favorite: ${favorite} <br> <br> Artist Information: <br> Species: ${species} <br> Personal Quote: ${personal_quote} <br> Music Type/Genre: ${music_type_genre} <br>
Favorite Movie: ${favorites_movie} <br> Favorite Game: ${favorites_game} <br> Favorite Game Platform: ${favorites_game_platform} <br> Favorite Artist: ${favorites_artist} <br>
Favorite Animal: ${favorites_animal} <br> Favorite Website: ${favorites_website} <br> Favorite Food: ${favorites_food} <br> <br> Contact Information: <br> ${contact_result}
Watchers Count: ${watchers_count} <br> 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,
};
};
+48
View File
@@ -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} <br> Totall: ${data2.watchers.count} `,
// 链接
link: `https://www.furaffinity.net/user/${item}/`,
// 由于源API未提供日期,故无pubDate
})),
};
};
+48
View File
@@ -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} <br> Totall: ${data2.watching.count}`,
// 链接
link: `https://www.furaffinity.net/user/${item}/`,
// 由于源API未提供日期,故无pubDate
})),
};
};