@ikenxuan/amagi 5.13.0 → 6.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -256
- package/dist/default/index.cjs +6444 -3930
- package/dist/default/index.d.ts +12619 -12073
- package/dist/default/{index.js → index.mjs} +6402 -3931
- package/dist/exports/axios.d.ts +1 -0
- package/dist/exports/express.d.ts +1 -0
- package/package.json +13 -35
- package/dist/default/index.d.cts +0 -23996
- package/dist/default/index.d.cts.map +0 -1
- package/dist/default/index.d.ts.map +0 -1
- package/dist/default/index.js.map +0 -1
- package/dist/exports/log4js.cjs +0 -11
- package/dist/exports/log4js.d.ts +0 -2
- package/dist/exports/log4js.js +0 -5
- /package/dist/exports/{axios.js → axios.mjs} +0 -0
- /package/dist/exports/{chalk.js → chalk.mjs} +0 -0
- /package/dist/exports/{express.js → express.mjs} +0 -0
package/README.md
CHANGED
|
@@ -1,286 +1,44 @@
|
|
|
1
1
|
# @ikenxuan/amagi
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@ikenxuan/amagi)
|
|
4
|
+
[](https://www.npmjs.com/package/@ikenxuan/amagi)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
开发者文档(Typedoc):https://ikenxuan.github.io/amagi
|
|
7
|
-
|
|
8
|
-
本项目最初的代码从 [kkkkkk-10086](https://github.com/ikenxuan/kkkkkk-10086) 解耦。主要负责相关数据接口的封装。
|
|
9
|
-
|
|
10
|
-
[@ikenxuan/amagi](https://www.npmjs.com/package/@ikenxuan/amagi) 将作为一个独立的上游模块,提供给下游 [karin-plugin-kkk](https://github.com/ikenxuan/karin-plugin-kkk) 和 [kkkkkk-10086](https://github.com/ikenxuan/kkkkkk-10086) 进行视频解析相关业务使用。这两个项目已完成了几乎所有由 ikenxuan 安排的功能和任务,所以它们如果没有什么新的业务需求,本项目大概再也不会封装新的任何接口。
|
|
11
|
-
|
|
12
|
-
当然,如果你的下游有新的业务需求,欢迎提 issue 或 pr。(作者本人很菜,尤其不会逆向工程,所以 issue 不一定能解决)
|
|
13
|
-
|
|
14
|
-
## 重要变更
|
|
15
|
-
|
|
16
|
-
**自 v5.8.1 起,`直播间信息数据` 接口仅支持通过 `room_id` + `web_rid` 获取,不再接受 `sec_uid` 作为参数。**
|
|
17
|
-
> [旧版本(≤ v5.8.0)](https://github.com/ikenxuan/amagi/blob/e086ef0a8be9e9a731618098c8680370970d4300/src/platform/douyin/getdata.ts#L308)会在内部额外调用一次「用户主页信息」接口,以换取 `room_id` 与 `web_rid`,再请求「直播间信息数据」。
|
|
18
|
-
> 后续版本将彻底移除这种 **接口套娃** 行为,每个接口都保持纯粹,不再为调用 A 而隐式调用 B。
|
|
19
|
-
|
|
20
|
-
## 特性
|
|
21
|
-
|
|
22
|
-
- 多平台支持:抖音、B站、快手、小红书的主流数据接口
|
|
23
|
-
- 两种使用姿势:
|
|
24
|
-
- 直接调用:通过 SDK 获取数据,支持绑定 Cookie
|
|
25
|
-
- 本地服务:一键启动 Express 服务,REST 风格路由
|
|
26
|
-
- 参数校验:基于 Zod,按方法类型校验必填与可选参数
|
|
27
|
-
- 统一响应:约定化 `ApiResponse` 返回结构,含 `success`/`code`/`message`/`data`
|
|
28
|
-
- 类型模式:`strict` 与 `loose` 可选,开发友好与容错可控
|
|
29
|
-
- 工具集齐全:签名算法、URL 拼接器、AV/BV 转换等常用工具
|
|
30
|
-
- 双模块输出:同时支持 ESM 与 CJS 引入
|
|
6
|
+
抖音、B站、快手、小红书 Web 端数据接口的 Node.js 封装。
|
|
31
7
|
|
|
32
8
|
## 安装
|
|
33
9
|
|
|
34
|
-
使用 npm:
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
npm i @ikenxuan/amagi
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
或使用 pnpm / yarn:
|
|
41
|
-
|
|
42
10
|
```bash
|
|
43
11
|
pnpm add @ikenxuan/amagi
|
|
44
12
|
```
|
|
45
13
|
|
|
46
|
-
|
|
47
|
-
yarn add @ikenxuan/amagi
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## 快速上手
|
|
51
|
-
|
|
52
|
-
### 1) 直接调用(推荐)
|
|
53
|
-
|
|
54
|
-
SDK 方式最灵活,适合在 Node.js 程序里按需拉取数据。
|
|
14
|
+
## 使用
|
|
55
15
|
|
|
56
16
|
```ts
|
|
57
17
|
import amagi from '@ikenxuan/amagi'
|
|
58
18
|
|
|
59
|
-
// 绑定各平台 Cookie(可选)与请求配置(可选)
|
|
60
19
|
const client = amagi({
|
|
61
20
|
cookies: {
|
|
62
|
-
bilibili: 'SESSDATA=xxx;
|
|
21
|
+
bilibili: 'SESSDATA=xxx; ...',
|
|
63
22
|
douyin: 'ttwid=...; ...',
|
|
64
23
|
kuaishou: 'did=...; ...',
|
|
65
24
|
xiaohongshu: 'a1=...; ...',
|
|
66
|
-
},
|
|
67
|
-
request: {
|
|
68
|
-
// 例如自定义 headers、代理等
|
|
69
|
-
headers: { 'User-Agent': 'Mozilla/5.0 ...' }
|
|
70
25
|
}
|
|
71
26
|
})
|
|
72
27
|
|
|
73
|
-
// B
|
|
74
|
-
const video = await client.
|
|
75
|
-
bvid: 'BV1xx411c7mD'
|
|
76
|
-
typeMode: 'strict' // 严格类型(可选,默认 loose)
|
|
77
|
-
})
|
|
78
|
-
if (video.success) {
|
|
79
|
-
console.log(video.data)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// 抖音:获取评论数据(aweme_id)
|
|
83
|
-
const comments = await client.getDouyinData('评论数据', {
|
|
84
|
-
aweme_id: '1234567890123456789',
|
|
85
|
-
number: 20
|
|
28
|
+
// 获取 B站视频信息
|
|
29
|
+
const video = await client.bilibili.fetcher.fetchVideoInfo({
|
|
30
|
+
bvid: 'BV1xx411c7mD'
|
|
86
31
|
})
|
|
87
|
-
console.log(comments)
|
|
88
32
|
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const bInfo = await bilibili.api.getVideoInfo({ bvid: 'BV1xx411c7mD' })
|
|
93
|
-
const dCom = await douyin.api.getComments({ aweme_id: '1234567890123456789', number: 10 })
|
|
94
|
-
const kInfo = await kuaishou.api.getWorkInfo({ photoId: '3xqxxxxxx' })
|
|
95
|
-
const xNote = await xiaohongshu.api.getNote({ note_id: '64xxxxxxxx', xsec_token: 'xsec_xxx' })
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
也可以不用实例,直接调用静态方法(手动给 cookie):
|
|
99
|
-
|
|
100
|
-
```ts
|
|
101
|
-
import amagi from '@ikenxuan/amagi'
|
|
102
|
-
|
|
103
|
-
const res = await amagi.getBilibiliData('单个视频作品数据', { bvid: 'BV1xx411c7mD' }, 'SESSDATA=...')
|
|
104
|
-
console.log(res)
|
|
33
|
+
// 启动 HTTP 服务
|
|
34
|
+
client.startServer(4567)
|
|
105
35
|
```
|
|
106
36
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
一行代码启动 Express 服务,路由自动注册。
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
import amagi from '@ikenxuan/amagi'
|
|
113
|
-
|
|
114
|
-
// 端口默认 4567,可自定义
|
|
115
|
-
amagi({
|
|
116
|
-
cookies: {
|
|
117
|
-
bilibili: 'SESSDATA=xxx; bili_jct=yyy; ...',
|
|
118
|
-
douyin: 'ttwid=...; ...',
|
|
119
|
-
kuaishou: 'did=...; ...',
|
|
120
|
-
xiaohongshu: 'a1=...; ...',
|
|
121
|
-
}
|
|
122
|
-
}).startServer(4567)
|
|
123
|
-
|
|
124
|
-
// 打开 http://localhost:4567/ 或 http://localhost:4567/docs
|
|
125
|
-
// 文档自动重定向至 https://amagi.apifox.cn
|
|
126
|
-
```
|
|
37
|
+
## 文档
|
|
127
38
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
- 路由与参数请直接参考 API 文档:https://amagi.apifox.cn
|
|
131
|
-
- 本地启动示例:`amagi({ cookies: {...} }).startServer(4567)`
|
|
132
|
-
|
|
133
|
-
启动服务后,默认挂载在 `/api/<platform>` 下。以下列出主要路由与典型参数(查询串/JSON 皆可):
|
|
134
|
-
|
|
135
|
-
- Douyin `/api/douyin`
|
|
136
|
-
- `GET /fetch_one_work` 聚合解析(`aweme_id`)
|
|
137
|
-
- `GET /fetch_work_comments` 评论数据(`aweme_id`, `number?`, `cursor?`)
|
|
138
|
-
- `GET /fetch_user_info` 用户主页数据(`sec_uid`)
|
|
139
|
-
- `GET /fetch_user_post_videos` 用户主页视频列表(`sec_uid`)
|
|
140
|
-
- `GET /fetch_search_info` 搜索/热点词(`query`, `number?`, `search_id?`)
|
|
141
|
-
- `GET /fetch_suggest_words` 热点词数据(`query`, `number?`)
|
|
142
|
-
- `GET /fetch_music_work` 音乐数据(`music_id`)
|
|
143
|
-
- `GET /fetch_emoji_list` Emoji 列表
|
|
144
|
-
- `GET /fetch_emoji_pro_list` 动态表情列表
|
|
145
|
-
- `GET /fetch_user_live_videos` 直播间信息(`sec_uid`)
|
|
146
|
-
- `GET /fetch_video_comment_replies` 指定评论回复(`aweme_id`, `comment_id`, `number?`, `cursor?`)
|
|
147
|
-
- `GET /fetch_work_danmaku` 弹幕数据(`aweme_id`, `duration`, `start_time?`, `end_time?`)
|
|
148
|
-
|
|
149
|
-
- Bilibili `/api/bilibili`
|
|
150
|
-
- `GET /fetch_one_video` 单个视频作品数据(`bvid`)
|
|
151
|
-
- `GET /fetch_video_playurl` 单个视频下载信息(`avid`, `cid`)
|
|
152
|
-
- `GET /fetch_work_comments` 评论数据(`oid`, `type`, `pn?`, `number?`)
|
|
153
|
-
- `GET /fetch_user_profile` 用户主页数据(`host_mid`)
|
|
154
|
-
- `GET /fetch_user_dynamic` 用户主页动态列表(`host_mid`)
|
|
155
|
-
- `GET /fetch_emoji_list` Emoji 列表
|
|
156
|
-
- `GET /fetch_bangumi_video_info` 番剧基本信息(二选一:`ep_id` 或 `season_id`)
|
|
157
|
-
- `GET /fetch_bangumi_video_playurl` 番剧下载信息(`cid`, `ep_id`)
|
|
158
|
-
- `GET /fetch_dynamic_info` 动态详情(`dynamic_id`)
|
|
159
|
-
- `GET /fetch_dynamic_card` 动态卡片(`dynamic_id`)
|
|
160
|
-
- `GET /fetch_live_room_detail` 直播间信息(`room_id`)
|
|
161
|
-
- `GET /fetch_liveroom_def` 直播间初始化信息(`room_id`)
|
|
162
|
-
- `GET /login_basic_info` 登录基本信息
|
|
163
|
-
- `GET /new_login_qrcode` 申请二维码
|
|
164
|
-
- `GET /check_qrcode` 二维码状态(`qrcode_key`)
|
|
165
|
-
- `GET /fetch_user_full_view` UP 主总播放量(`host_mid`)
|
|
166
|
-
- `GET /av_to_bv` AV 转 BV(`avid`)
|
|
167
|
-
- `GET /bv_to_av` BV 转 AV(`bvid`)
|
|
168
|
-
|
|
169
|
-
- Kuaishou `/api/kuaishou`
|
|
170
|
-
- `GET /fetch_one_work` 单个视频作品数据(`photoId`)
|
|
171
|
-
- `GET /fetch_work_comments` 评论数据(`photoId`)
|
|
172
|
-
- `GET /fetch_emoji_list` Emoji 列表
|
|
173
|
-
|
|
174
|
-
- Xiaohongshu `/api/xiaohongshu`
|
|
175
|
-
- `GET /fetch_home_feed` 首页推荐(`cursor_score?`, `num?`, `refresh_type?`, `note_index?`, `category?`, `search_key?`)
|
|
176
|
-
- `GET /fetch_one_note` 单个笔记数据(`note_id`, `xsec_token`)
|
|
177
|
-
- `GET /fetch_note_comments` 评论数据(`note_id`, `xsec_token`, `cursor?`)
|
|
178
|
-
- `GET /fetch_user_profile` 用户数据(`user_id`)
|
|
179
|
-
- `GET /fetch_user_notes` 用户笔记(`user_id`, `cursor?`, `num?`)
|
|
180
|
-
- `GET /fetch_emoji_list` 表情列表
|
|
181
|
-
- `GET /fetch_search_notes` 搜索笔记(`keyword`, `page?`, `page_size?`, `sort?`, `note_type?`)
|
|
182
|
-
|
|
183
|
-
说明:
|
|
184
|
-
- 路由内部已固定 `methodType`,你只需传具体业务参数即可。
|
|
185
|
-
- 抖音的 `/fetch_one_work` 同路径注册了多个方法(视频 / 图集 / 合辑 / 聚合),推荐使用“聚合解析”。
|
|
186
|
-
|
|
187
|
-
## 统一响应结构
|
|
188
|
-
|
|
189
|
-
所有 API 返回统一结构:
|
|
190
|
-
|
|
191
|
-
```json
|
|
192
|
-
{
|
|
193
|
-
"success": true,
|
|
194
|
-
"code": 200,
|
|
195
|
-
"message": "获取成功",
|
|
196
|
-
"data": { ... },
|
|
197
|
-
"requestPath": "/api/bilibili/fetch_one_video?bvid=BV1xx411c7mD"
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
错误时:
|
|
202
|
-
|
|
203
|
-
```json
|
|
204
|
-
{
|
|
205
|
-
"success": false,
|
|
206
|
-
"code": 400,
|
|
207
|
-
"message": "参数错误",
|
|
208
|
-
"error": { "name": "ZodError", "details": [ ... ] },
|
|
209
|
-
"requestPath": "/api/douyin/fetch_work_comments?aweme_id=..."
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## 类型模式与参数校验
|
|
214
|
-
|
|
215
|
-
- 类型模式 `typeMode`
|
|
216
|
-
- `strict`:返回严格类型(基于已知响应结构,可能缺少平台新增字段)
|
|
217
|
-
- `loose`:返回 `any`,容错更强(默认)
|
|
218
|
-
- 使用位置:仅 SDK 直接调用可指定 `typeMode`,HTTP 路由默认等价于 `loose`
|
|
219
|
-
|
|
220
|
-
- 参数校验(Zod)
|
|
221
|
-
- 每个方法类型对应一套完整参数校验规则
|
|
222
|
-
- 请求入参不合法时将返回错误响应(含详细错误信息)
|
|
223
|
-
|
|
224
|
-
## 工具集与常用能力
|
|
225
|
-
|
|
226
|
-
所有平台工具集从包顶层导出,可直接使用:
|
|
227
|
-
|
|
228
|
-
```ts
|
|
229
|
-
import { douyinUtils, bilibiliUtils, kuaishouUtils } from '@ikenxuan/amagi'
|
|
230
|
-
import { xiaohongshuUtils } from '@ikenxuan/amagi'
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
- 抖音 `douyinUtils`
|
|
234
|
-
- `sign`: `douyinSign.Mstoken(length)`, `douyinSign.AB(url, ua)`, `douyinSign.XB(url, ua)`, `douyinSign.VerifyFpManager()`
|
|
235
|
-
- `douyinApiUrls`: 仅负责拼接基础 URL,需要再次以该 URL 生成反爬参数
|
|
236
|
-
- `api`: 原始 API 调用(需传 cookie);若使用 `client.douyin.api` 则已绑定 cookie
|
|
237
|
-
|
|
238
|
-
- B站 `bilibiliUtils`
|
|
239
|
-
- `sign`: `wbi_sign(baseUrl, cookie)`, `av2bv(aid: number)`, `bv2av(bvid: string)`
|
|
240
|
-
- `bilibiliApiUrls`: 仅拼接基础 URL
|
|
241
|
-
- `api`: 原始 API 调用(同上)
|
|
242
|
-
|
|
243
|
-
- 快手 `kuaishouUtils`
|
|
244
|
-
- `kuaishouApiUrls`: 仅拼接基础 URL
|
|
245
|
-
- `api`: 原始 API 调用(同上)
|
|
246
|
-
|
|
247
|
-
- 小红书 `xiaohongshuUtils`
|
|
248
|
-
- `sign`: `xiaohongshuSign.generateXSGet(path, a1Cookie, clientType?, params?)`,`generateXSPost(...)`,`generateXS(url, body, ua?, method?, a1Cookie?)`,`generateXSCommon(length?)`,`generateXT()`,`generateXB3Traceid()`,`extractA1FromCookie(cookieString)`,`getSearchId()`
|
|
249
|
-
- `xiaohongshuApiUrls`: 拼接 URL + POST 参数
|
|
250
|
-
- `api`: 原始 API 调用(同上)
|
|
251
|
-
|
|
252
|
-
### AV/BV 转换示例
|
|
253
|
-
|
|
254
|
-
```ts
|
|
255
|
-
import { bilibiliUtils } from '@ikenxuan/amagi'
|
|
256
|
-
|
|
257
|
-
const bv = bilibiliUtils.sign.av2bv(170001)
|
|
258
|
-
const av = bilibiliUtils.sign.bv2av('BV1xx411c7mD')
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## 运行建议与注意事项
|
|
262
|
-
|
|
263
|
-
- Cookie 与 UA:部分接口需要有效 Cookie 与合理的 `User-Agent`;请遵循平台使用政策
|
|
264
|
-
- 频率与限流:避免高频调用,合理设置请求重试与指数退避
|
|
265
|
-
- ESM/CJS:包 `type` 为 `module`,同时提供 ESM/CJS 两类入口
|
|
266
|
-
- ESM:`import amagi from '@ikenxuan/amagi'`
|
|
267
|
-
- CJS:`const amagi = require('@ikenxuan/amagi')`
|
|
39
|
+
- [完整文档](https://amagi-docs.vercel.app)
|
|
40
|
+
- [API 文档](https://amagi.apifox.cn)
|
|
268
41
|
|
|
269
42
|
## 许可证
|
|
270
43
|
|
|
271
|
-
GPL-3.0
|
|
272
|
-
|
|
273
|
-
## 变更日志与反馈
|
|
274
|
-
|
|
275
|
-
- 变更日志:请查看 GitHub Releases 或提交记录
|
|
276
|
-
- 问题反馈:GitHub Issues https://github.com/ikenxuan/amagi/issues
|
|
277
|
-
- 文档站点:https://amagi.apifox.cn
|
|
278
|
-
|
|
279
|
-
## 鸣谢
|
|
280
|
-
请求签名部分参考了以下项目的实现:
|
|
281
|
-
|
|
282
|
-
- [SocialSisterYi/bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
|
|
283
|
-
- [NearHuiwen/TiktokDouyinCrawler](https://github.com/NearHuiwen/TiktokDouyinCrawler)
|
|
284
|
-
- [Evil0ctal/Douyin_TikTok_Download_API](https://github.com/Evil0ctal/Douyin_TikTok_Download_API)
|
|
285
|
-
- [Johnserf-Seed/f2](https://github.com/Johnserf-Seed/f2)
|
|
286
|
-
- [ikenxuan/xhshow-ts](https://github.com/ikenxuan/xhshow-ts)
|
|
44
|
+
[GPL-3.0](../../LICENSE)
|