抖音、B站、快手、小红书 Web 端相关数据接口的 Node.js 封装与服务。支持“直接调用(SDK)”与“本地 HTTP 服务”两种使用方式,并内置严格的参数校验与统一响应格式。
文档站点(API 文档):https://amagi.apifox.cn 开发者文档(Typedoc):https://ikenxuan.github.io/amagi
本项目最初的代码从 kkkkkk-10086 解耦。主要负责相关数据接口的封装。
@ikenxuan/amagi 将作为一个独立的上游模块,提供给下游 karin-plugin-kkk 和 kkkkkk-10086 进行视频解析相关业务使用。这两个项目已完成了几乎所有由 ikenxuan 安排的功能和任务,所以它们如果没有什么新的业务需求,本项目大概再也不会封装新的任何接口。
当然,如果你的下游有新的业务需求,欢迎提 issue 或 pr。(作者本人很菜,尤其不会逆向工程,所以 issue 不一定能解决)
ApiResponse
返回结构,含 success
/code
/message
/data
strict
与 loose
可选,开发友好与容错可控使用 npm:
npm i @ikenxuan/amagi
或使用 pnpm / yarn:
pnpm add @ikenxuan/amagi
yarn add @ikenxuan/amagi
SDK 方式最灵活,适合在 Node.js 程序里按需拉取数据。
import amagi from '@ikenxuan/amagi'
// 绑定各平台 Cookie(可选)与请求配置(可选)
const client = amagi({
cookies: {
bilibili: 'SESSDATA=xxx; bili_jct=yyy; ...',
douyin: 'ttwid=...; ...',
kuaishou: 'did=...; ...',
xiaohongshu: 'a1=...; ...',
},
request: {
// 例如自定义 headers、代理等
headers: { 'User-Agent': 'Mozilla/5.0 ...' }
}
})
// B站:获取单个视频信息(bvid)
const video = await client.getBilibiliData('单个视频作品数据', {
bvid: 'BV1xx411c7mD',
typeMode: 'strict' // 严格类型(可选,默认 loose)
})
if (video.success) {
console.log(video.data)
}
// 抖音:获取评论数据(aweme_id)
const comments = await client.getDouyinData('评论数据', {
aweme_id: '1234567890123456789',
number: 20
})
console.log(comments)
// 也可使用绑定 Cookie 的 API 对象:不再传 cookie
const { bilibili, douyin, kuaishou, xiaohongshu } = client
const bInfo = await bilibili.api.getVideoInfo({ bvid: 'BV1xx411c7mD' })
const dCom = await douyin.api.getComments({ aweme_id: '1234567890123456789', number: 10 })
const kInfo = await kuaishou.api.getWorkInfo({ photoId: '3xqxxxxxx' })
const xNote = await xiaohongshu.api.getNote({ note_id: '64xxxxxxxx', xsec_token: 'xsec_xxx' })
也可以不用实例,直接调用静态方法(手动给 cookie):
import amagi from '@ikenxuan/amagi'
const res = await amagi.getBilibiliData('单个视频作品数据', { bvid: 'BV1xx411c7mD' }, 'SESSDATA=...')
console.log(res)
一行代码启动 Express 服务,路由自动注册。
import amagi from '@ikenxuan/amagi'
// 端口默认 4567,可自定义
amagi({
cookies: {
bilibili: 'SESSDATA=xxx; bili_jct=yyy; ...',
douyin: 'ttwid=...; ...',
kuaishou: 'did=...; ...',
xiaohongshu: 'a1=...; ...',
}
}).startServer(4567)
// 打开 http://localhost:4567/ 或 http://localhost:4567/docs
// 文档自动重定向至 https://amagi.apifox.cn
amagi({ cookies: {...} }).startServer(4567)
启动服务后,默认挂载在 /api/<platform>
下。以下列出主要路由与典型参数(查询串/JSON 皆可):
Douyin /api/douyin
GET /fetch_one_work
聚合解析(aweme_id
)GET /fetch_work_comments
评论数据(aweme_id
, number?
, cursor?
)GET /fetch_user_info
用户主页数据(sec_uid
)GET /fetch_user_post_videos
用户主页视频列表(sec_uid
)GET /fetch_search_info
搜索/热点词(query
, number?
, search_id?
)GET /fetch_suggest_words
热点词数据(query
, number?
)GET /fetch_music_work
音乐数据(music_id
)GET /fetch_emoji_list
Emoji 列表GET /fetch_emoji_pro_list
动态表情列表GET /fetch_user_live_videos
直播间信息(sec_uid
)GET /fetch_video_comment_replies
指定评论回复(aweme_id
, comment_id
, number?
, cursor?
)GET /fetch_work_danmaku
弹幕数据(aweme_id
, duration
, start_time?
, end_time?
)Bilibili /api/bilibili
GET /fetch_one_video
单个视频作品数据(bvid
)GET /fetch_video_playurl
单个视频下载信息(avid
, cid
)GET /fetch_work_comments
评论数据(oid
, type
, pn?
, number?
)GET /fetch_user_profile
用户主页数据(host_mid
)GET /fetch_user_dynamic
用户主页动态列表(host_mid
)GET /fetch_emoji_list
Emoji 列表GET /fetch_bangumi_video_info
番剧基本信息(二选一:ep_id
或 season_id
)GET /fetch_bangumi_video_playurl
番剧下载信息(cid
, ep_id
)GET /fetch_dynamic_info
动态详情(dynamic_id
)GET /fetch_dynamic_card
动态卡片(dynamic_id
)GET /fetch_live_room_detail
直播间信息(room_id
)GET /fetch_liveroom_def
直播间初始化信息(room_id
)GET /login_basic_info
登录基本信息GET /new_login_qrcode
申请二维码GET /check_qrcode
二维码状态(qrcode_key
)GET /fetch_user_full_view
UP 主总播放量(host_mid
)GET /av_to_bv
AV 转 BV(avid
)GET /bv_to_av
BV 转 AV(bvid
)Kuaishou /api/kuaishou
GET /fetch_one_work
单个视频作品数据(photoId
)GET /fetch_work_comments
评论数据(photoId
)GET /fetch_emoji_list
Emoji 列表Xiaohongshu /api/xiaohongshu
GET /fetch_home_feed
首页推荐(cursor_score?
, num?
, refresh_type?
, note_index?
, category?
, search_key?
)GET /fetch_one_note
单个笔记数据(note_id
, xsec_token
)GET /fetch_note_comments
评论数据(note_id
, xsec_token
, cursor?
)GET /fetch_user_profile
用户数据(user_id
)GET /fetch_user_notes
用户笔记(user_id
, cursor?
, num?
)GET /fetch_emoji_list
表情列表GET /fetch_search_notes
搜索笔记(keyword
, page?
, page_size?
, sort?
, note_type?
)说明:
methodType
,你只需传具体业务参数即可。/fetch_one_work
同路径注册了多个方法(视频 / 图集 / 合辑 / 聚合),推荐使用“聚合解析”。所有 API 返回统一结构:
{
"success": true,
"code": 200,
"message": "获取成功",
"data": { ... },
"requestPath": "/api/bilibili/fetch_one_video?bvid=BV1xx411c7mD"
}
错误时:
{
"success": false,
"code": 400,
"message": "参数错误",
"error": { "name": "ZodError", "details": [ ... ] },
"requestPath": "/api/douyin/fetch_work_comments?aweme_id=..."
}
类型模式 typeMode
strict
:返回严格类型(基于已知响应结构,可能缺少平台新增字段)loose
:返回 any
,容错更强(默认)typeMode
,HTTP 路由默认等价于 loose
参数校验(Zod)
所有平台工具集从包顶层导出,可直接使用:
import { douyinUtils, bilibiliUtils, kuaishouUtils } from '@ikenxuan/amagi'
import { xiaohongshuUtils } from '@ikenxuan/amagi'
抖音 douyinUtils
sign
: douyinSign.Mstoken(length)
, douyinSign.AB(url, ua)
, douyinSign.XB(url, ua)
, douyinSign.VerifyFpManager()
douyinApiUrls
: 仅负责拼接基础 URL,需要再次以该 URL 生成反爬参数api
: 原始 API 调用(需传 cookie);若使用 client.douyin.api
则已绑定 cookieB站 bilibiliUtils
sign
: wbi_sign(baseUrl, cookie)
, av2bv(aid: number)
, bv2av(bvid: string)
bilibiliApiUrls
: 仅拼接基础 URLapi
: 原始 API 调用(同上)快手 kuaishouUtils
kuaishouApiUrls
: 仅拼接基础 URLapi
: 原始 API 调用(同上)小红书 xiaohongshuUtils
sign
: xiaohongshuSign.generateXSGet(path, a1Cookie, clientType?, params?)
,generateXSPost(...)
,generateXS(url, body, ua?, method?, a1Cookie?)
,generateXSCommon(length?)
,generateXT()
,generateXB3Traceid()
,extractA1FromCookie(cookieString)
,getSearchId()
xiaohongshuApiUrls
: 拼接 URL + POST 参数api
: 原始 API 调用(同上)import { bilibiliUtils } from '@ikenxuan/amagi'
const bv = bilibiliUtils.sign.av2bv(170001)
const av = bilibiliUtils.sign.bv2av('BV1xx411c7mD')
User-Agent
;请遵循平台使用政策type
为 module
,同时提供 ESM/CJS 两类入口
import amagi from '@ikenxuan/amagi'
const amagi = require('@ikenxuan/amagi')
GPL-3.0-only
请求签名部分参考了以下项目的实现: