@xzxzzx/bilibili-mcp 1.7.0 → 1.7.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 +7 -3
- package/README_EN.md +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +3 -8
- package/dist/utils/cache.js.map +1 -1
- package/package.json +2 -9
- package/dist/bilibili/auth.d.ts +0 -72
- package/dist/bilibili/auth.d.ts.map +0 -1
- package/dist/bilibili/auth.js +0 -162
- package/dist/bilibili/auth.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
Bilibili MCP server — 让 Claude、Cursor、Codex 等 AI 客户端直接读取 Bilibili 视频字幕、转录、元数据和热门评论的 MCP server。
|
|
8
8
|
|
|
9
|
-
🌐 [English Documentation](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/README_EN.md) · 📜 [更新日志](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/CHANGELOG.md) · 📦 [npm](https://www.npmjs.com/package/@xzxzzx/bilibili-mcp) · 🚀 [Release v1.
|
|
9
|
+
🌐 [English Documentation](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/README_EN.md) · 📜 [更新日志](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/CHANGELOG.md) · 📦 [npm](https://www.npmjs.com/package/@xzxzzx/bilibili-mcp) · 🚀 [Release v1.7.1](https://github.com/XZXZZX-Ai/bilibili-mcp/releases/tag/v1.7.1)
|
|
10
10
|
|
|
11
11
|
> [!TIP]
|
|
12
12
|
> ⚠️ 你可以把下方“用 agent 工具帮你安装”的提示词复制给 Codex、Claude Code、Cursor 等 agent,让它帮你完成 MCP 客户端接入和 Cookie 配置引导。为了稳定获取字幕、转录和评论,安装后仍需配置 B 站 Cookie(agent会引导你);不要把 Cookie 写进 MCP 客户端配置。Metadata 可能无需 Cookie。详见 [**凭证配置**](#️-凭证配置)。
|
|
@@ -1423,6 +1423,10 @@ BILIBILI_DEDEUSERID=<your_dedeuserid>
|
|
|
1423
1423
|
- **执行方式**:对 API 请求启动做节流,避免瞬时大并发;适合本地单用户 MCP 使用。
|
|
1424
1424
|
- **重试策略**:对 408、429、5xx、网络错误和超时进行最多 3 次指数退避重试。
|
|
1425
1425
|
- **超时控制**:默认 10 秒,可通过 `BILIBILI_REQUEST_TIMEOUT_MS` 调整。
|
|
1426
|
+
- **缓存容量**:默认 100 条,可通过 `BILIBILI_CACHE_SIZE` 调整。
|
|
1427
|
+
- **User-Agent**:可通过 `USER_AGENT` 覆盖默认请求头。
|
|
1428
|
+
|
|
1429
|
+
以上环境变量均在 MCP server 进程启动时读取,修改后需重启 MCP 客户端或重连 MCP server 才能生效。
|
|
1426
1430
|
|
|
1427
1431
|
---
|
|
1428
1432
|
|
|
@@ -1450,7 +1454,7 @@ npm run watch
|
|
|
1450
1454
|
|
|
1451
1455
|
| 命令 | 用途 |
|
|
1452
1456
|
|---|---|
|
|
1453
|
-
| `npm run build` |
|
|
1457
|
+
| `npm run build` | 清理 `dist/` 后编译 TypeScript |
|
|
1454
1458
|
| `npm test` | 运行 Vitest 单元测试 |
|
|
1455
1459
|
| `npm run watch` | 开发时持续编译 |
|
|
1456
1460
|
| `npm start` | 运行已编译的 stdio MCP server |
|
|
@@ -1486,7 +1490,7 @@ npm run watch
|
|
|
1486
1490
|
|
|
1487
1491
|
1. **初版生成**:由 **Claude Code** (搭载 **GLM-4.7** 模型) 快速搭建核心架构与基础逻辑。
|
|
1488
1492
|
2. **调试与优化**:在 **Antigravity** 环境下,利用 **Claude** 和 **Gemini** 模型进行深度的 Bug 修复与功能增强,确保了字幕提取与评论分析的稳定性。
|
|
1489
|
-
3. **迭代与扩展**:由 **Codex**
|
|
1493
|
+
3. **迭代与扩展**:由 **Codex** 进行架构决策与计划分解,通过 **Paseo** 启动 **Claude Code** 执行实现;目前覆盖 30+ AI 客户端的 MCP 接入配置、8 个 MCP 工具、244 个单元测试。
|
|
1490
1494
|
|
|
1491
1495
|
---
|
|
1492
1496
|
|
package/README_EN.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
MCP server that gives AI clients access to Bilibili video subtitles, transcripts, metadata, and popular comments.
|
|
8
8
|
|
|
9
|
-
View in [简体中文](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/README.md) · 📜 [Changelog](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/CHANGELOG_EN.md) · 📦 [npm](https://www.npmjs.com/package/@xzxzzx/bilibili-mcp) · 🚀 [Release v1.
|
|
9
|
+
View in [简体中文](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/README.md) · 📜 [Changelog](https://github.com/XZXZZX-Ai/bilibili-mcp/blob/master/CHANGELOG_EN.md) · 📦 [npm](https://www.npmjs.com/package/@xzxzzx/bilibili-mcp) · 🚀 [Release v1.7.1](https://github.com/XZXZZX-Ai/bilibili-mcp/releases/tag/v1.7.1)
|
|
10
10
|
|
|
11
11
|
> [!TIP]
|
|
12
12
|
> ⚠️ You can copy the "Install With Your Agent" prompt below to Codex, Claude Code, Cursor, or another agent and let it add this MCP server to your client and guide Cookie setup. For reliable subtitles, transcripts, and comments, you still need to configure Bilibili Cookies after installation; do not write Cookies into MCP client config. Metadata may work without cookies. See [**Credential Configuration**](#-credential-configuration).
|
|
@@ -1423,6 +1423,10 @@ Built-in request controls reduce the chance of triggering Bilibili risk checks o
|
|
|
1423
1423
|
- **Execution model**: throttles API request starts to avoid burst concurrency; intended for local single-user MCP usage.
|
|
1424
1424
|
- **Retry strategy**: retries 408, 429, 5xx, network errors, and timeouts up to 3 times with exponential backoff.
|
|
1425
1425
|
- **Timeout**: defaults to 10 seconds, configurable with `BILIBILI_REQUEST_TIMEOUT_MS`.
|
|
1426
|
+
- **Cache capacity**: defaults to 100 entries, configurable with `BILIBILI_CACHE_SIZE`.
|
|
1427
|
+
- **User-Agent**: overridable via `USER_AGENT`.
|
|
1428
|
+
|
|
1429
|
+
All of the above environment variables are read at MCP server process startup. After changing them, restart the MCP client or reconnect the MCP server for the new values to take effect.
|
|
1426
1430
|
|
|
1427
1431
|
---
|
|
1428
1432
|
|
|
@@ -1450,7 +1454,7 @@ Common commands:
|
|
|
1450
1454
|
|
|
1451
1455
|
| Command | Purpose |
|
|
1452
1456
|
|---|---|
|
|
1453
|
-
| `npm run build` |
|
|
1457
|
+
| `npm run build` | Clean `dist/` then compile TypeScript |
|
|
1454
1458
|
| `npm test` | Run the Vitest unit tests |
|
|
1455
1459
|
| `npm run watch` | Continuously compile during development |
|
|
1456
1460
|
| `npm start` | Run the compiled stdio MCP server |
|
|
@@ -1483,7 +1487,7 @@ This project is a crystal of AI-collaborative development, spanning from prototy
|
|
|
1483
1487
|
|
|
1484
1488
|
1. **Initial Generation**: Core architecture and base logic were rapidly built by **Claude Code** (powered by **GLM-4.7** model).
|
|
1485
1489
|
2. **Debugging & Optimization**: Bugs were fixed and features enhanced using **Claude** and **Gemini** models within the **Antigravity** environment, ensuring stable subtitle extraction and comment analysis.
|
|
1486
|
-
3. **Iteration & Expansion**: **Codex** handles architectural decisions and planning,
|
|
1490
|
+
3. **Iteration & Expansion**: **Codex** handles architectural decisions and planning, launching **Claude Code** via **Paseo** for implementation; now covers 30+ AI client MCP configurations, 8 MCP tools, and 244 unit tests.
|
|
1487
1491
|
|
|
1488
1492
|
---
|
|
1489
1493
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY;AACZ,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,aAAa;AACb,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9C,IAAI,CAAC;IACH,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,mBAAmB;AACrB,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY;AACZ,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,aAAa;AACb,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9C,IAAI,CAAC;IACH,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,mBAAmB;AACrB,CAAC;AAED,sDAAsD;AACtD,eAAe,MAAM,CAAC;AAEtB,YAAY;AACZ,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,cAAc;AACd,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAOA,qBAAa,YAAY,CAAC,UAAU,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO;IACpE,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,UAAU,CAKhB;;IAeF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAUjD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAKlD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMlC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAUrD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAKtD,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMpC,QAAQ,IAAI,OAAO,IAAI,CAAC,UAAU;IAKlC,KAAK,IAAI,IAAI;IAYb,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM;CASxD;AAGD,eAAO,MAAM,YAAY,gCAAqB,CAAC"}
|
package/dist/utils/cache.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* 使用LRU缓存实现视频信息和评论的缓存
|
|
4
4
|
*/
|
|
5
5
|
import QuickLRU from 'quick-lru';
|
|
6
|
+
import { config } from '../config.js';
|
|
6
7
|
export class CacheManager {
|
|
7
8
|
videoCache;
|
|
8
9
|
commentCache;
|
|
@@ -13,18 +14,12 @@ export class CacheManager {
|
|
|
13
14
|
deletes: 0
|
|
14
15
|
};
|
|
15
16
|
constructor() {
|
|
16
|
-
const defaultOptions = {
|
|
17
|
-
maxSize: 100,
|
|
18
|
-
maxAge: 60 * 60 * 1000 // 1 hour
|
|
19
|
-
};
|
|
20
17
|
this.videoCache = new QuickLRU({
|
|
21
|
-
|
|
22
|
-
maxSize: 100,
|
|
18
|
+
maxSize: config.maxCacheSize,
|
|
23
19
|
maxAge: 60 * 60 * 1000 // 1 hour for video info
|
|
24
20
|
});
|
|
25
21
|
this.commentCache = new QuickLRU({
|
|
26
|
-
|
|
27
|
-
maxSize: 100,
|
|
22
|
+
maxSize: config.maxCacheSize,
|
|
28
23
|
maxAge: 30 * 60 * 1000 // 30 minutes for comments
|
|
29
24
|
});
|
|
30
25
|
}
|
package/dist/utils/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,QAAQ,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xzxzzx/bilibili-mcp",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Bilibili MCP tool for video metadata, transcripts, subtitles, and comment summarization",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"bilibili-mcp": "dist/cli.js"
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
|
-
"build": "tsc",
|
|
13
|
+
"build": "node --input-type=commonjs -e \"const{rmSync}=require('fs');const{resolve,dirname,basename}=require('path');const d=resolve('dist');if(dirname(d)!==process.cwd()||basename(d)!=='dist'){console.error('Safety check failed: '+d);process.exit(1);}rmSync(d,{recursive:true,force:true});\" && tsc",
|
|
14
14
|
"watch": "tsc --watch",
|
|
15
15
|
"start": "node dist/index.js",
|
|
16
16
|
"prepublishOnly": "npm run build",
|
|
@@ -19,13 +19,6 @@
|
|
|
19
19
|
"test:env": "node -e \"console.log('检查环境变量...'); console.log('BILIBILI_SESSDATA:', process.env.BILIBILI_SESSDATA ? '✅ 已配置' : '❌ 未配置'); console.log('BILIBILI_BILI_JCT:', process.env.BILIBILI_BILI_JCT ? '✅ 已配置' : '❌ 未配置'); console.log('BILIBILI_DEDEUSERID:', process.env.BILIBILI_DEDEUSERID ? '✅ 已配置' : '❌ 未配置');\"",
|
|
20
20
|
"release": "semantic-release"
|
|
21
21
|
},
|
|
22
|
-
"config": {
|
|
23
|
-
"bilibili": {
|
|
24
|
-
"rateLimitMs": 500,
|
|
25
|
-
"requestTimeoutMs": 10000,
|
|
26
|
-
"cacheSize": 100
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
22
|
"files": [
|
|
30
23
|
"dist",
|
|
31
24
|
"README.md",
|
package/dist/bilibili/auth.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* B站认证模块
|
|
3
|
-
* 处理用户登录和认证相关功能
|
|
4
|
-
*/
|
|
5
|
-
import { BilibiliCredentials } from '../utils/credentials.js';
|
|
6
|
-
export interface LoginResponse {
|
|
7
|
-
code: number;
|
|
8
|
-
message: string;
|
|
9
|
-
data?: {
|
|
10
|
-
token_info?: {
|
|
11
|
-
mid: string;
|
|
12
|
-
access_token: string;
|
|
13
|
-
refresh_token: string;
|
|
14
|
-
expires_in: number;
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
export interface UserInfo {
|
|
19
|
-
mid: string;
|
|
20
|
-
name: string;
|
|
21
|
-
sex: string;
|
|
22
|
-
face: string;
|
|
23
|
-
sign: string;
|
|
24
|
-
rank: number;
|
|
25
|
-
level: number;
|
|
26
|
-
jointime: number;
|
|
27
|
-
moral: number;
|
|
28
|
-
silence: number;
|
|
29
|
-
coins: number;
|
|
30
|
-
birthday: number;
|
|
31
|
-
identification: number;
|
|
32
|
-
vip: {
|
|
33
|
-
type: number;
|
|
34
|
-
status: number;
|
|
35
|
-
due_date: number;
|
|
36
|
-
vip_pay_type: number;
|
|
37
|
-
theme_type: number;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export declare class BilibiliAuth {
|
|
41
|
-
/**
|
|
42
|
-
* 用户登录
|
|
43
|
-
* @param username 用户名/手机号/邮箱
|
|
44
|
-
* @param password 密码
|
|
45
|
-
*/
|
|
46
|
-
static login(username: string, password: string): Promise<BilibiliCredentials>;
|
|
47
|
-
/**
|
|
48
|
-
* 获取用户信息
|
|
49
|
-
*/
|
|
50
|
-
static getUserInfo(): Promise<UserInfo>;
|
|
51
|
-
/**
|
|
52
|
-
* 检查登录状态
|
|
53
|
-
*/
|
|
54
|
-
static checkLoginStatus(): boolean;
|
|
55
|
-
/**
|
|
56
|
-
* 登出
|
|
57
|
-
*/
|
|
58
|
-
static logout(): void;
|
|
59
|
-
/**
|
|
60
|
-
* 从环境变量设置凭证
|
|
61
|
-
*/
|
|
62
|
-
static setupFromEnv(): boolean;
|
|
63
|
-
/**
|
|
64
|
-
* 检查并刷新登录状态
|
|
65
|
-
*/
|
|
66
|
-
static checkAndRefreshLogin(): Promise<boolean>;
|
|
67
|
-
/**
|
|
68
|
-
* 验证登录状态
|
|
69
|
-
*/
|
|
70
|
-
static validateLogin(): Promise<boolean>;
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/bilibili/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE;YACX,GAAG,EAAE,MAAM,CAAC;YACZ,YAAY,EAAE,MAAM,CAAC;YACrB,aAAa,EAAE,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,YAAY;IACvB;;;;OAIG;WACU,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgEpF;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IA8B7C;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,OAAO;IAIlC;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,IAAI;IAKrB;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,OAAO;IAS9B;;OAEG;WACU,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAwBrD;;OAEG;WACU,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;CAc/C"}
|
package/dist/bilibili/auth.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* B站认证模块
|
|
3
|
-
* 处理用户登录和认证相关功能
|
|
4
|
-
*/
|
|
5
|
-
import { config } from '../config.js';
|
|
6
|
-
import { credentialManager } from '../utils/credentials.js';
|
|
7
|
-
import { logger } from '../utils/logger.js';
|
|
8
|
-
export class BilibiliAuth {
|
|
9
|
-
/**
|
|
10
|
-
* 用户登录
|
|
11
|
-
* @param username 用户名/手机号/邮箱
|
|
12
|
-
* @param password 密码
|
|
13
|
-
*/
|
|
14
|
-
static async login(username, password) {
|
|
15
|
-
try {
|
|
16
|
-
logger.info('Attempting to login to Bilibili', { username });
|
|
17
|
-
const response = await fetch('https://passport.bilibili.com/x/passport-login/web/key?hash=qr_login', {
|
|
18
|
-
method: 'GET',
|
|
19
|
-
headers: {
|
|
20
|
-
'User-Agent': config.userAgent,
|
|
21
|
-
'Referer': config.referer,
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
const keyData = await response.json();
|
|
25
|
-
if (keyData.code !== 0) {
|
|
26
|
-
throw new Error(`Failed to get login key: ${keyData.message}`);
|
|
27
|
-
}
|
|
28
|
-
const loginData = {
|
|
29
|
-
username,
|
|
30
|
-
password,
|
|
31
|
-
keepalive: true,
|
|
32
|
-
key: keyData.data.hash,
|
|
33
|
-
timestamp: keyData.data.timestamp,
|
|
34
|
-
};
|
|
35
|
-
const loginResponse = await fetch('https://passport.bilibili.com/x/passport-login/web/login', {
|
|
36
|
-
method: 'POST',
|
|
37
|
-
headers: {
|
|
38
|
-
'User-Agent': config.userAgent,
|
|
39
|
-
'Referer': config.referer,
|
|
40
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
41
|
-
},
|
|
42
|
-
body: new URLSearchParams(loginData).toString(),
|
|
43
|
-
});
|
|
44
|
-
const loginResult = await loginResponse.json();
|
|
45
|
-
if (loginResult.code !== 0) {
|
|
46
|
-
throw new Error(`Login failed: ${loginResult.message}`);
|
|
47
|
-
}
|
|
48
|
-
if (!loginResult.data?.token_info) {
|
|
49
|
-
throw new Error('Login successful but no token info received');
|
|
50
|
-
}
|
|
51
|
-
const tokenInfo = loginResult.data.token_info;
|
|
52
|
-
const credentials = {
|
|
53
|
-
sessdata: tokenInfo.access_token,
|
|
54
|
-
bili_jct: tokenInfo.access_token.substring(0, 32),
|
|
55
|
-
dedeuserid: tokenInfo.mid,
|
|
56
|
-
expiresAt: Date.now() + tokenInfo.expires_in * 1000,
|
|
57
|
-
};
|
|
58
|
-
credentialManager.setCredentials(credentials);
|
|
59
|
-
logger.info('Login successful', { mid: tokenInfo.mid });
|
|
60
|
-
return credentials;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
logger.error('Login failed', { error: error instanceof Error ? error.message : error });
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 获取用户信息
|
|
69
|
-
*/
|
|
70
|
-
static async getUserInfo() {
|
|
71
|
-
try {
|
|
72
|
-
const headers = credentialManager.getAuthHeaders();
|
|
73
|
-
if (!headers['Cookie']) {
|
|
74
|
-
throw new Error('Not logged in');
|
|
75
|
-
}
|
|
76
|
-
const response = await fetch('https://api.bilibili.com/x/space/acc/info', {
|
|
77
|
-
method: 'GET',
|
|
78
|
-
headers: {
|
|
79
|
-
'User-Agent': config.userAgent,
|
|
80
|
-
'Referer': config.referer,
|
|
81
|
-
...headers,
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
const data = await response.json();
|
|
85
|
-
if (data.code !== 0) {
|
|
86
|
-
throw new Error(`Failed to get user info: ${data.message}`);
|
|
87
|
-
}
|
|
88
|
-
return data.data;
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
logger.error('Failed to get user info', { error: error instanceof Error ? error.message : error });
|
|
92
|
-
throw error;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 检查登录状态
|
|
97
|
-
*/
|
|
98
|
-
static checkLoginStatus() {
|
|
99
|
-
return credentialManager.isLoggedIn();
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 登出
|
|
103
|
-
*/
|
|
104
|
-
static logout() {
|
|
105
|
-
credentialManager.clearCredentials();
|
|
106
|
-
logger.info('Logged out successfully');
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 从环境变量设置凭证
|
|
110
|
-
*/
|
|
111
|
-
static setupFromEnv() {
|
|
112
|
-
const credentials = credentialManager.loadFromEnv();
|
|
113
|
-
if (credentials) {
|
|
114
|
-
logger.info('Credentials loaded from environment variables');
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 检查并刷新登录状态
|
|
121
|
-
*/
|
|
122
|
-
static async checkAndRefreshLogin() {
|
|
123
|
-
if (!credentialManager.isLoggedIn()) {
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
// 如果凭证即将过期,尝试刷新
|
|
127
|
-
if (credentialManager.isExpiringSoon()) {
|
|
128
|
-
logger.warn('Credentials are expiring soon, attempting to refresh');
|
|
129
|
-
try {
|
|
130
|
-
// 获取用户信息来验证凭证是否仍然有效
|
|
131
|
-
await this.getUserInfo();
|
|
132
|
-
// 如果成功,刷新过期时间
|
|
133
|
-
credentialManager.refreshExpiration();
|
|
134
|
-
logger.info('Credentials refreshed successfully');
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
logger.error('Failed to refresh credentials', { error: error instanceof Error ? error.message : error });
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 验证登录状态
|
|
146
|
-
*/
|
|
147
|
-
static async validateLogin() {
|
|
148
|
-
if (!credentialManager.isLoggedIn()) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
try {
|
|
152
|
-
await this.getUserInfo();
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
logger.error('Login validation failed', { error: error instanceof Error ? error.message : error });
|
|
157
|
-
credentialManager.clearCredentials();
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/bilibili/auth.ts"],"names":[],"mappings":"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"}
|