@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 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.6.4](https://github.com/XZXZZX-Ai/bilibili-mcp/releases/tag/v1.6.4)
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` | 编译 TypeScript 到 `dist/` |
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** 进行架构决策与计划分解,**Claude Code** 执行实现;目前覆盖 30+ AI 客户端的 MCP 接入配置、7 个 MCP 工具、180 个单元测试。
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.6.4](https://github.com/XZXZZX-Ai/bilibili-mcp/releases/tag/v1.6.4)
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` | Compile TypeScript into `dist/` |
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, while **Claude Code** executes implementation; now covers 30+ AI client MCP configurations, 7 MCP tools, and 180 unit tests.
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
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkBrC,eAAe,MAAM,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
@@ -16,8 +16,7 @@ try {
16
16
  catch (e) {
17
17
  // .env is optional
18
18
  }
19
- // 供 Smithery 沙盒反射使用的纯净实例导出
20
- // 绝不能在这里执行任何副作用
19
+ // Reusable default server export for programmatic use
21
20
  export default server;
22
21
  // 启动服务器的入口点
23
22
  async function main() {
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,2BAA2B;AAC3B,gBAAgB;AAChB,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
+ {"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":"AAWA,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;;IAsBF,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"}
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"}
@@ -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
- ...defaultOptions,
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
- ...defaultOptions,
27
- maxSize: 100,
22
+ maxSize: config.maxCacheSize,
28
23
  maxAge: 30 * 60 * 1000 // 30 minutes for comments
29
24
  });
30
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
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.0",
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",
@@ -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"}
@@ -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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"}