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
+ })),
+ };
+};