name: Fanvue
description: 通过 OAuth 2.0 API 管理 Fanvue 创作者平台上的内容、聊天、订阅者和收益。
与 Fanvue 创作者平台集成,以管理聊天、帖子、订阅者、收益洞察和媒体内容。
https://your-app.com/callback)设置以下环境变量:
FANVUE_CLIENT_ID=你的客户端ID
FANVUE_CLIENT_SECRET=你的客户端密钥
FANVUE_REDIRECT_URI=https://your-app.com/callback
Fanvue 使用 OAuth 2.0 with PKCE(Proof Key for Code Exchange)。所有 API 请求都需要:
Bearer <access_token>X-Fanvue-API-Version: 2025-06-26根据你的需求请求以下权限范围:
| 权限范围 | 访问权限 |
|---|---|
openid |
OpenID Connect 身份验证 |
offline_access |
刷新令牌支持 |
offline |
离线访问 |
read:self |
读取已认证用户资料 |
read:chat |
读取聊天对话 |
write:chat |
发送消息,更新聊天 |
read:post |
读取帖子 |
write:post |
创建帖子 |
read:creator |
读取订阅者/关注者数据 |
read:media |
读取媒体库 |
write:tracking_links |
管理活动链接 |
read:insights |
读取收益/分析数据(创作者账户) |
read:subscribers |
读取订阅者列表(创作者账户) |
注意:某些端点(如订阅者、洞察、收益)需要 创作者账户,并且可能需要公共文档中未列出的额外权限范围。
import { randomBytes, createHash } from 'crypto';
// 1. 生成 PKCE 参数
const codeVerifier = randomBytes(32).toString('base64url');
const codeChallenge = createHash('sha256')
.update(codeVerifier)
.digest('base64url');
// 2. 构建授权 URL
const authUrl = new URL('https://auth.fanvue.com/oauth2/auth');
authUrl.searchParams.set('client_id', process.env.FANVUE_CLIENT_ID);
authUrl.searchParams.set('redirect_uri', process.env.FANVUE_REDIRECT_URI);
authUrl.searchParams.set('response_type', 'code');
authUrl.searchParams.set('scope', 'openid offline_access read:self read:chat write:chat read:post');
authUrl.searchParams.set('state', randomBytes(32).toString('hex'));
authUrl.searchParams.set('code_challenge', codeChallenge);
authUrl.searchParams.set('code_challenge_method', 'S256');
// 将用户重定向到:authUrl.toString()
// 3. 使用授权码交换令牌
const tokenResponse = await fetch('https://auth.fanvue.com/oauth2/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: process.env.FANVUE_CLIENT_ID,
client_secret: process.env.FANVUE_CLIENT_SECRET,
code: authorizationCode,
redirect_uri: process.env.FANVUE_REDIRECT_URI,
code_verifier: codeVerifier,
}),
});
const tokens = await tokenResponse.json();
// tokens.access_token, tokens.refresh_token
所有 API 请求发送至:https://api.fanvue.com
const headers = {
'Authorization': `Bearer ${accessToken}`,
'X-Fanvue-API-Version': '2025-06-26',
'Content-Type': 'application/json',
};
以下工作流专为自动化 Fanvue 创作者账户的 AI 智能体设计。
基础的 /media 端点仅返回元数据。要获取实际可查看的 URL,请使用 variants 查询参数:
// 步骤 1:列出所有媒体
const list = await fetch('https://api.fanvue.com/media', { headers });
const { data } = await list.json();
// 步骤 2:获取特定媒体项的签名 URL
const media = await fetch(
`https://api.fanvue.com/media/${uuid}?variants=main,thumbnail,blurred`,
{ headers }
);
const { variants } = await media.json();
// variants = [
// { variantType: 'main', url: 'https://media.fanvue.com/private/...' },
// { variantType: 'thumbnail', url: '...' },
// { variantType: 'blurred', url: '...' }
// ]
变体类型:
- main - 原始全分辨率
- thumbnail - 优化预览(较小)
- blurred - 用于预览的模糊版本
// 步骤 1:从媒体库获取已有的媒体 UUID
const mediaIds = ['media-uuid-1', 'media-uuid-2'];
// 步骤 2:创建帖子
const response = await fetch('https://api.fanvue.com/posts', {
method: 'POST',
headers,
body: JSON.stringify({
text: '看看我的新内容! 🔥',
mediaIds,
audience: 'subscribers', // 或 'followers-and-subscribers'
// 可选:
price: null, // 设置为付费查看
publishAt: null, // 设置为定时发布
}),
});
受众选项:
| 值 | 谁可以看见 |
| :--- | :--- |
| subscribers | 仅付费订阅者 |
| followers-and-subscribers | 免费关注者和订阅者均可 |
// 获取订阅者列表用于决策
const subs = await fetch('https://api.fanvue.com/creators/list-subscribers', { headers });
const { data: subscribers } = await subs.json();
// 获取高消费用户用于 VIP 定向
const vips = await fetch('https://api.fanvue.com/insights/get-top-spenders', { headers });
const { data: topSpenders } = await vips.json();
// 发送个性化消息并附带媒体
await fetch('https://api.fanvue.com/chat-messages', {
method: 'POST',
headers,
body: JSON.stringify({
recipientUuid: subscribers[0].userUuid,
content: '感谢订阅!这是为你准备的特别内容 💕',
mediaIds: ['vault-media-uuid'], // 附加媒体库中的媒体
}),
});
// 或一次性发送给多个订阅者
await fetch('https://api.fanvue.com/chat-messages/mass', {
method: 'POST',
headers,
body: JSON.stringify({
recipientUuids: subscribers.map(s => s.userUuid),
content: '新的独家内容刚刚发布! 🎉',
mediaIds: ['vault-media-uuid'],
}),
});
为实现有效自动化,请收集以下上下文信息:
interface AutomationContext {
// 媒体库中的当前媒体
media: {
uuid: string;
name: string;
type: 'image' | 'video';
description: string; // AI 生成的描述
signedUrl: string; // 来自 variants 查询
}[];
// 受众数据
subscribers: {
uuid: string;
name: string;
subscribedAt: string;
tier: string;
}[];
// 互动信号
topSpenders: {
uuid: string;
totalSpent: number;
}[];
// 近期收益用于趋势分析
earnings: {
period: string;
total: number;
breakdown: { type: string; amount: number }[];
};
}
const response = await fetch('https://api.fanvue.com/users/me', { headers });
const user = await response.json();
const response = await fetch('https://api.fanvue.com/chats', { headers });
const { data, pagination } = await response.json();
const response = await fetch('https://api.fanvue.com/chat-messages', {
method: 'POST',
headers,
body: JSON.stringify({
recipientUuid: 'user-uuid-here',
content: '你好!感谢订阅!',
}),
});
const response = await fetch('https://api.fanvue.com/posts', {
method: 'POST',
headers,
body: JSON.stringify({
content: '新内容已上线!',
// 可添加媒体 ID、定价等
}),
});
const response = await fetch('https://api.fanvue.com/insights/get-earnings', { headers });
const earnings = await response.json();
const response = await fetch('https://api.fanvue.com/creators/list-subscribers', { headers });
const { data } = await response.json();
完整端点文档请参阅 api-reference.md。
访问令牌会过期。使用刷新令牌获取新的令牌:
const response = await fetch('https://auth.fanvue.com/oauth2/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'refresh_token',
client_id: process.env.FANVUE_CLIENT_ID,
client_secret: process.env.FANVUE_CLIENT_SECRET,
refresh_token: currentRefreshToken,
}),
});
const newTokens = await response.json();
常见的 HTTP 状态码:
| 状态码 | 含义 |
|---|---|
200 |
成功 |
400 |
请求错误 - 检查参数 |
401 |
未授权 - 令牌过期或无效 |
403 |
禁止访问 - 缺少所需权限范围 |
404 |
资源未找到 |
429 |
请求频率受限 - 请降低请求频率 |