@wecode-ai/weibo-openclaw-plugin 1.0.7 → 1.0.8-beta.0
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/index.d.ts.map +1 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/weibo-crowd/SkILL.md +799 -0
- package/skills/weibo-token/SKILL.md +141 -0
- package/src/weibo-hot-search.d.ts.map +1 -1
- package/src/weibo-hot-search.js +3 -61
- package/src/weibo-hot-search.js.map +1 -1
- package/src/weibo-search.d.ts.map +1 -1
- package/src/weibo-search.js +3 -61
- package/src/weibo-search.js.map +1 -1
- package/src/weibo-status.d.ts.map +1 -1
- package/src/weibo-status.js +3 -55
- package/src/weibo-status.js.map +1 -1
- package/src/weibo-token-tool.d.ts +45 -0
- package/src/weibo-token-tool.d.ts.map +1 -0
- package/src/weibo-token-tool.js +155 -0
- package/src/weibo-token-tool.js.map +1 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: weibo-token
|
|
3
|
+
description: |
|
|
4
|
+
微博 API 访问令牌工具。用于获取和管理微博 API 的访问 token。
|
|
5
|
+
此工具为其他微博工具(热搜、搜索、用户微博等)提供统一的 token 管理服务。
|
|
6
|
+
token 有效期为 2 小时,工具会自动缓存和刷新。
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 微博 Token 工具
|
|
10
|
+
|
|
11
|
+
使用 `weibo_token` 工具获取微博 API 访问令牌。此工具提供统一的 token 管理服务,为其他微博工具提供认证支持。
|
|
12
|
+
|
|
13
|
+
## 基本用法
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"tool_calls": [
|
|
18
|
+
{
|
|
19
|
+
"name": "weibo_token",
|
|
20
|
+
"arguments": {}
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
此工具不需要任何参数,直接调用即可获取当前有效的 token。
|
|
27
|
+
|
|
28
|
+
## 参数说明
|
|
29
|
+
|
|
30
|
+
此工具无需参数。
|
|
31
|
+
|
|
32
|
+
## 返回结果
|
|
33
|
+
|
|
34
|
+
成功时返回:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"success": true,
|
|
39
|
+
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
40
|
+
"acquiredAt": "2026-03-12T15:30:00.000Z",
|
|
41
|
+
"expiresIn": 7200,
|
|
42
|
+
"expiresAt": "2026-03-12T17:30:00.000Z"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
错误时返回:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"success": false,
|
|
51
|
+
"error": "获取微博 token 失败: 错误信息"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 返回字段说明
|
|
56
|
+
|
|
57
|
+
| 字段 | 类型 | 说明 |
|
|
58
|
+
|------|------|------|
|
|
59
|
+
| `success` | boolean | 是否成功获取 token |
|
|
60
|
+
| `token` | string | 访问令牌 |
|
|
61
|
+
| `acquiredAt` | string | token 获取时间(ISO 8601 格式) |
|
|
62
|
+
| `expiresIn` | number | token 有效期(秒),默认 7200 秒(2小时) |
|
|
63
|
+
| `expiresAt` | string | token 过期时间(ISO 8601 格式) |
|
|
64
|
+
|
|
65
|
+
## 配置(必填)
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"channels": {
|
|
70
|
+
"weibo": {
|
|
71
|
+
"appId": "your_app_id",
|
|
72
|
+
"appSecret": "your_app_secret"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 配置项说明
|
|
79
|
+
|
|
80
|
+
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|
|
81
|
+
|--------|------|------|--------|------|
|
|
82
|
+
| `appId` | string | 是 | - | 应用 ID,用于获取 token |
|
|
83
|
+
| `appSecret` | string | 是 | - | 应用密钥,用于获取 token |
|
|
84
|
+
| `tokenEndpoint` | string | 否 | `http://open-im.api.weibo.com/open/auth/ws_token` | Token 获取端点 |
|
|
85
|
+
| `weiboTokenEnabled` | boolean | 否 | `true` | 是否启用 token 工具 |
|
|
86
|
+
|
|
87
|
+
## API 说明
|
|
88
|
+
|
|
89
|
+
此工具使用微博开放平台的 token 接口:
|
|
90
|
+
|
|
91
|
+
### 获取 Token
|
|
92
|
+
```
|
|
93
|
+
POST http://open-im.api.weibo.com/open/auth/ws_token
|
|
94
|
+
Content-Type: application/json
|
|
95
|
+
|
|
96
|
+
{
|
|
97
|
+
"app_id": "your_app_id",
|
|
98
|
+
"app_secret": "your_app_secret"
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 响应示例
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"data": {
|
|
106
|
+
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
107
|
+
"expire_in": 7200
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Token 缓存机制
|
|
113
|
+
|
|
114
|
+
1. **自动缓存**:首次获取的 token 会被缓存
|
|
115
|
+
2. **自动刷新**:在 token 过期前 60 秒自动刷新
|
|
116
|
+
3. **共享使用**:所有微博工具共享同一个 token 缓存
|
|
117
|
+
|
|
118
|
+
## 使用场景
|
|
119
|
+
|
|
120
|
+
此工具主要用于以下场景:
|
|
121
|
+
|
|
122
|
+
1. **调试**:检查当前 token 状态和有效期
|
|
123
|
+
2. **预热**:在使用其他微博工具前预先获取 token
|
|
124
|
+
3. **监控**:监控 token 的获取和刷新情况
|
|
125
|
+
|
|
126
|
+
## 与其他工具的关系
|
|
127
|
+
|
|
128
|
+
以下微博工具依赖此 token 工具进行认证:
|
|
129
|
+
|
|
130
|
+
- `weibo_hot_search` - 微博热搜榜
|
|
131
|
+
- `weibo_search` - 微博智搜
|
|
132
|
+
- `weibo_status` - 用户微博
|
|
133
|
+
|
|
134
|
+
这些工具会自动调用 token 管理功能,无需手动获取 token。
|
|
135
|
+
|
|
136
|
+
## 注意事项
|
|
137
|
+
|
|
138
|
+
1. 此工具需要配置 `appId` 和 `appSecret` 才能使用
|
|
139
|
+
2. Token 有效期为 2 小时(7200 秒)
|
|
140
|
+
3. 工具会在 token 过期前 60 秒自动刷新
|
|
141
|
+
4. 所有微博工具共享同一个 token 缓存,避免重复获取
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-hot-search.d.ts","sourceRoot":"","sources":["../../src/weibo-hot-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-hot-search.d.ts","sourceRoot":"","sources":["../../src/weibo-hot-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKtD,eAAO,MAAM,oBAAoB;;;EAa/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAwBvE;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,kBAAkB,EAAE,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAyGF,MAAM,MAAM,oBAAoB,GAAG;IACjC,0CAA0C;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAeF,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,iBAAiB,QA6DjE"}
|
package/src/weibo-hot-search.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { getValidWeiboToken } from "./weibo-token-tool.js";
|
|
2
3
|
// ============ Schema ============
|
|
3
4
|
export const WeiboHotSearchSchema = Type.Object({
|
|
4
5
|
category: Type.String({
|
|
@@ -41,65 +42,6 @@ const CATEGORY_MAP = {
|
|
|
41
42
|
科技榜: "v_openclaw_tech",
|
|
42
43
|
体育榜: "v_openclaw_sport",
|
|
43
44
|
};
|
|
44
|
-
// ============ Token Management ============
|
|
45
|
-
// Token 过期时间:2小时(7200秒),提前60秒刷新
|
|
46
|
-
const TOKEN_EXPIRE_SECONDS = 7200;
|
|
47
|
-
const TOKEN_REFRESH_BUFFER_SECONDS = 60;
|
|
48
|
-
// 默认 token 端点
|
|
49
|
-
const DEFAULT_TOKEN_ENDPOINT = "http://open-im.api.weibo.com/open/auth/ws_token";
|
|
50
|
-
// 热搜专用的 token 缓存
|
|
51
|
-
let hotSearchTokenCache = null;
|
|
52
|
-
/**
|
|
53
|
-
* 获取热搜用的 token
|
|
54
|
-
* 通过 http://open-im.api.weibo.com/open/auth/ws_token 获取
|
|
55
|
-
* token 过期时间为 2 小时
|
|
56
|
-
*/
|
|
57
|
-
async function fetchHotSearchToken(appId, appSecret, tokenEndpoint) {
|
|
58
|
-
const endpoint = tokenEndpoint || DEFAULT_TOKEN_ENDPOINT;
|
|
59
|
-
const response = await fetch(endpoint, {
|
|
60
|
-
method: "POST",
|
|
61
|
-
headers: {
|
|
62
|
-
"Content-Type": "application/json",
|
|
63
|
-
},
|
|
64
|
-
body: JSON.stringify({
|
|
65
|
-
app_id: appId,
|
|
66
|
-
app_secret: appSecret,
|
|
67
|
-
}),
|
|
68
|
-
});
|
|
69
|
-
if (!response.ok) {
|
|
70
|
-
const errorText = await response.text().catch(() => "");
|
|
71
|
-
throw new Error(`获取热搜 token 失败: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ""}`);
|
|
72
|
-
}
|
|
73
|
-
const result = (await response.json());
|
|
74
|
-
if (!result.data?.token) {
|
|
75
|
-
throw new Error("获取热搜 token 失败: 响应中缺少 token");
|
|
76
|
-
}
|
|
77
|
-
const tokenCache = {
|
|
78
|
-
token: result.data.token,
|
|
79
|
-
acquiredAt: Date.now(),
|
|
80
|
-
expiresIn: result.data.expire_in || TOKEN_EXPIRE_SECONDS,
|
|
81
|
-
};
|
|
82
|
-
hotSearchTokenCache = tokenCache;
|
|
83
|
-
return tokenCache;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* 获取有效的热搜 token
|
|
87
|
-
* 如果缓存的 token 未过期则返回缓存,否则重新获取
|
|
88
|
-
*/
|
|
89
|
-
async function getValidHotSearchToken(appId, appSecret, tokenEndpoint) {
|
|
90
|
-
// 检查缓存的 token 是否有效
|
|
91
|
-
if (hotSearchTokenCache) {
|
|
92
|
-
const expiresAt = hotSearchTokenCache.acquiredAt +
|
|
93
|
-
hotSearchTokenCache.expiresIn * 1000 -
|
|
94
|
-
TOKEN_REFRESH_BUFFER_SECONDS * 1000;
|
|
95
|
-
if (Date.now() < expiresAt) {
|
|
96
|
-
return hotSearchTokenCache.token;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// 获取新 token
|
|
100
|
-
const tokenResult = await fetchHotSearchToken(appId, appSecret, tokenEndpoint);
|
|
101
|
-
return tokenResult.token;
|
|
102
|
-
}
|
|
103
45
|
// ============ Core Functions ============
|
|
104
46
|
// 默认热搜端点
|
|
105
47
|
const DEFAULT_HOT_SEARCH_ENDPOINT = "http://open-im.api.weibo.com/open/weibo/hot_search";
|
|
@@ -208,8 +150,8 @@ export function registerWeiboHotSearchTools(api) {
|
|
|
208
150
|
error: `无效的榜单类型: ${p.category}。支持的类型: ${Object.keys(CATEGORY_MAP).join("、")}`,
|
|
209
151
|
});
|
|
210
152
|
}
|
|
211
|
-
// 获取有效的 token
|
|
212
|
-
const token = await
|
|
153
|
+
// 获取有效的 token(使用共享的 token 工具)
|
|
154
|
+
const token = await getValidWeiboToken(appId, appSecret, cfg.tokenEndpoint);
|
|
213
155
|
const result = await fetchHotSearch(token, p.category, p.count, cfg.weiboHotSearchEndpoint);
|
|
214
156
|
return json(formatHotSearchResult(result, p.category));
|
|
215
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-hot-search.js","sourceRoot":"","sources":["../../src/weibo-hot-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-hot-search.js","sourceRoot":"","sources":["../../src/weibo-hot-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-search.d.ts","sourceRoot":"","sources":["../../src/weibo-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-search.d.ts","sourceRoot":"","sources":["../../src/weibo-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA0B7D;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAyFF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,0CAA0C;IAC1C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,iBAAiB,QAoD9D"}
|
package/src/weibo-search.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WeiboSearchSchema } from "./search-schema.js";
|
|
2
|
+
import { getValidWeiboToken } from "./weibo-token-tool.js";
|
|
2
3
|
// ============ Helpers ============
|
|
3
4
|
function json(data) {
|
|
4
5
|
return {
|
|
@@ -16,65 +17,6 @@ function readOptionalNonBlankString(value) {
|
|
|
16
17
|
const trimmed = value.trim();
|
|
17
18
|
return trimmed ? trimmed : undefined;
|
|
18
19
|
}
|
|
19
|
-
// ============ Token Management ============
|
|
20
|
-
// Token 过期时间:2小时(7200秒),提前60秒刷新
|
|
21
|
-
const TOKEN_EXPIRE_SECONDS = 7200;
|
|
22
|
-
const TOKEN_REFRESH_BUFFER_SECONDS = 60;
|
|
23
|
-
// 默认 token 端点
|
|
24
|
-
const DEFAULT_TOKEN_ENDPOINT = "http://open-im.api.weibo.com/open/auth/ws_token";
|
|
25
|
-
// 搜索专用的 token 缓存
|
|
26
|
-
let searchTokenCache = null;
|
|
27
|
-
/**
|
|
28
|
-
* 获取搜索用的 token
|
|
29
|
-
* 通过 http://open-im.api.weibo.com/open/auth/ws_token 获取
|
|
30
|
-
* token 过期时间为 2 小时
|
|
31
|
-
*/
|
|
32
|
-
async function fetchSearchToken(appId, appSecret, tokenEndpoint) {
|
|
33
|
-
const endpoint = tokenEndpoint || DEFAULT_TOKEN_ENDPOINT;
|
|
34
|
-
const response = await fetch(endpoint, {
|
|
35
|
-
method: "POST",
|
|
36
|
-
headers: {
|
|
37
|
-
"Content-Type": "application/json",
|
|
38
|
-
},
|
|
39
|
-
body: JSON.stringify({
|
|
40
|
-
app_id: appId,
|
|
41
|
-
app_secret: appSecret,
|
|
42
|
-
}),
|
|
43
|
-
});
|
|
44
|
-
if (!response.ok) {
|
|
45
|
-
const errorText = await response.text().catch(() => "");
|
|
46
|
-
throw new Error(`获取搜索 token 失败: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ""}`);
|
|
47
|
-
}
|
|
48
|
-
const result = (await response.json());
|
|
49
|
-
if (!result.data?.token) {
|
|
50
|
-
throw new Error("获取搜索 token 失败: 响应中缺少 token");
|
|
51
|
-
}
|
|
52
|
-
const tokenCache = {
|
|
53
|
-
token: result.data.token,
|
|
54
|
-
acquiredAt: Date.now(),
|
|
55
|
-
expiresIn: result.data.expire_in || TOKEN_EXPIRE_SECONDS,
|
|
56
|
-
};
|
|
57
|
-
searchTokenCache = tokenCache;
|
|
58
|
-
return tokenCache;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* 获取有效的搜索 token
|
|
62
|
-
* 如果缓存的 token 未过期则返回缓存,否则重新获取
|
|
63
|
-
*/
|
|
64
|
-
async function getValidSearchToken(appId, appSecret, tokenEndpoint) {
|
|
65
|
-
// 检查缓存的 token 是否有效
|
|
66
|
-
if (searchTokenCache) {
|
|
67
|
-
const expiresAt = searchTokenCache.acquiredAt +
|
|
68
|
-
searchTokenCache.expiresIn * 1000 -
|
|
69
|
-
TOKEN_REFRESH_BUFFER_SECONDS * 1000;
|
|
70
|
-
if (Date.now() < expiresAt) {
|
|
71
|
-
return searchTokenCache.token;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// 获取新 token
|
|
75
|
-
const tokenResult = await fetchSearchToken(appId, appSecret, tokenEndpoint);
|
|
76
|
-
return tokenResult.token;
|
|
77
|
-
}
|
|
78
20
|
// ============ Core Functions ============
|
|
79
21
|
// 默认搜索端点
|
|
80
22
|
const DEFAULT_SEARCH_ENDPOINT = "http://open-im.api.weibo.com/open/wis/search_query";
|
|
@@ -175,8 +117,8 @@ export function registerWeiboSearchTools(api) {
|
|
|
175
117
|
async execute(_toolCallId, params) {
|
|
176
118
|
const p = params;
|
|
177
119
|
try {
|
|
178
|
-
// 获取有效的 token
|
|
179
|
-
const token = await
|
|
120
|
+
// 获取有效的 token(使用共享的 token 工具)
|
|
121
|
+
const token = await getValidWeiboToken(appId, appSecret, searchCfg.tokenEndpoint);
|
|
180
122
|
const result = await searchWeibo(p.query, token, searchCfg.weiboSearchEndpoint);
|
|
181
123
|
return json(formatSearchResult(result));
|
|
182
124
|
}
|
package/src/weibo-search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-search.js","sourceRoot":"","sources":["../../src/weibo-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-search.js","sourceRoot":"","sources":["../../src/weibo-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-status.d.ts","sourceRoot":"","sources":["../../src/weibo-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-status.d.ts","sourceRoot":"","sources":["../../src/weibo-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKtD,eAAO,MAAM,iBAAiB;;EAQ5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAwBjE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU;IACV,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa;IACb,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAwGF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAgBF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,iBAAiB,QAkD9D"}
|
package/src/weibo-status.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { getValidWeiboToken } from "./weibo-token-tool.js";
|
|
2
3
|
// ============ Schema ============
|
|
3
4
|
export const WeiboStatusSchema = Type.Object({
|
|
4
5
|
count: Type.Optional(Type.Number({
|
|
@@ -24,60 +25,6 @@ function readOptionalNonBlankString(value) {
|
|
|
24
25
|
const trimmed = value.trim();
|
|
25
26
|
return trimmed ? trimmed : undefined;
|
|
26
27
|
}
|
|
27
|
-
// ============ Token Management ============
|
|
28
|
-
// Token 过期时间:2小时(7200秒),提前60秒刷新
|
|
29
|
-
const TOKEN_EXPIRE_SECONDS = 7200;
|
|
30
|
-
const TOKEN_REFRESH_BUFFER_SECONDS = 60;
|
|
31
|
-
// 默认 token 端点
|
|
32
|
-
const DEFAULT_TOKEN_ENDPOINT = "http://open-im.api.weibo.com/open/auth/ws_token";
|
|
33
|
-
// 专用的 token 缓存
|
|
34
|
-
let weiboStatusTokenCache = null;
|
|
35
|
-
/**
|
|
36
|
-
* 获取 token
|
|
37
|
-
*/
|
|
38
|
-
async function fetchWeiboStatusToken(appId, appSecret, tokenEndpoint) {
|
|
39
|
-
const endpoint = tokenEndpoint || DEFAULT_TOKEN_ENDPOINT;
|
|
40
|
-
const response = await fetch(endpoint, {
|
|
41
|
-
method: "POST",
|
|
42
|
-
headers: {
|
|
43
|
-
"Content-Type": "application/json",
|
|
44
|
-
},
|
|
45
|
-
body: JSON.stringify({
|
|
46
|
-
app_id: appId,
|
|
47
|
-
app_secret: appSecret,
|
|
48
|
-
}),
|
|
49
|
-
});
|
|
50
|
-
if (!response.ok) {
|
|
51
|
-
const errorText = await response.text().catch(() => "");
|
|
52
|
-
throw new Error(`获取 token 失败: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ""}`);
|
|
53
|
-
}
|
|
54
|
-
const result = (await response.json());
|
|
55
|
-
if (!result.data?.token) {
|
|
56
|
-
throw new Error("获取 token 失败: 响应中缺少 token");
|
|
57
|
-
}
|
|
58
|
-
const tokenCache = {
|
|
59
|
-
token: result.data.token,
|
|
60
|
-
acquiredAt: Date.now(),
|
|
61
|
-
expiresIn: result.data.expire_in || TOKEN_EXPIRE_SECONDS,
|
|
62
|
-
};
|
|
63
|
-
weiboStatusTokenCache = tokenCache;
|
|
64
|
-
return tokenCache;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* 获取有效的 token
|
|
68
|
-
*/
|
|
69
|
-
async function getValidWeiboStatusToken(appId, appSecret, tokenEndpoint) {
|
|
70
|
-
if (weiboStatusTokenCache) {
|
|
71
|
-
const expiresAt = weiboStatusTokenCache.acquiredAt +
|
|
72
|
-
weiboStatusTokenCache.expiresIn * 1000 -
|
|
73
|
-
TOKEN_REFRESH_BUFFER_SECONDS * 1000;
|
|
74
|
-
if (Date.now() < expiresAt) {
|
|
75
|
-
return weiboStatusTokenCache.token;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const tokenResult = await fetchWeiboStatusToken(appId, appSecret, tokenEndpoint);
|
|
79
|
-
return tokenResult.token;
|
|
80
|
-
}
|
|
81
28
|
// ============ Core Functions ============
|
|
82
29
|
const DEFAULT_WEIBO_STATUS_ENDPOINT = "http://open-im.api.weibo.com/open/weibo/user_status";
|
|
83
30
|
/**
|
|
@@ -184,7 +131,8 @@ export function registerWeiboStatusTools(api) {
|
|
|
184
131
|
async execute(_toolCallId, params) {
|
|
185
132
|
const p = params;
|
|
186
133
|
try {
|
|
187
|
-
|
|
134
|
+
// 获取有效的 token(使用共享的 token 工具)
|
|
135
|
+
const token = await getValidWeiboToken(appId, appSecret, cfg.tokenEndpoint);
|
|
188
136
|
const result = await fetchWeiboStatus({
|
|
189
137
|
token,
|
|
190
138
|
count: p.count,
|
package/src/weibo-status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weibo-status.js","sourceRoot":"","sources":["../../src/weibo-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"weibo-status.js","sourceRoot":"","sources":["../../src/weibo-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAEhF,mCAAmC;AAEnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG;KACb,CAAC,CACH;CACF,CAAC,CAAC;AAIH,oCAAoC;AAEpC,SAAS,IAAI,CAAC,IAAa;IACzB,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAqDD,2CAA2C;AAE3C,MAAM,6BAA6B,GAAG,qDAAqD,CAAC;AAQ5F;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,OAAgC;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,6BAA6B,CAAC;IAEtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,MAAM,SAAS,GAA4B;QACzC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,UAAU;QAC5B,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,aAAa,EAAE,MAAM,CAAC,cAAc;QACpC,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,cAAc,EAAE,MAAM,CAAC,eAAe;QACtC,IAAI,EAAE;YACJ,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;SACpC;KACF,CAAC;IAEF,WAAW;IACX,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,MAA8B;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAEzB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI,CAAC,YAAY;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;KAC9C,CAAC;AACJ,CAAC;AAYD,SAAS,oBAAoB,CAAC,GAAsB;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAA4C,CAAC;IAEpF,OAAO;QACL,mBAAmB,EAAE,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,CAAC;QAC9E,KAAK,EAAE,0BAA0B,CAAC,QAAQ,EAAE,KAAK,CAAC;QAClD,SAAS,EAAE,0BAA0B,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC1D,aAAa,EAAE,0BAA0B,CAAC,QAAQ,EAAE,aAAa,CAAC;QAClE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,KAAK,KAAK;KAChD,CAAC;AACJ,CAAC;AAED,8CAA8C;AAE9C,MAAM,UAAU,wBAAwB,CAAC,GAAsB;IAC7D,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,oDAAoD,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,gEAAgE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAEhC,GAAG,CAAC,YAAY,CACd,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,4CAA4C;QAC9C,UAAU,EAAE,iBAAiB;QAC7B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM;YAC/B,MAAM,CAAC,GAAG,MAA2B,CAAC;YACtC,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CACpC,KAAK,EACL,SAAS,EACT,GAAG,CAAC,aAAa,CAClB,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;oBACpC,KAAK;oBACL,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,GAAG,CAAC,mBAAmB;iBAClC,CAAC,CAAC;gBAEH,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;oBACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC,EACF,EAAE,IAAI,EAAE,cAAc,EAAE,CACzB,CAAC;IACF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,4CAA4C,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
2
|
+
import { type Static } from "@sinclair/typebox";
|
|
3
|
+
export declare const WeiboTokenSchema: import("@sinclair/typebox").TObject<{}>;
|
|
4
|
+
export type WeiboTokenParams = Static<typeof WeiboTokenSchema>;
|
|
5
|
+
export type WeiboTokenCache = {
|
|
6
|
+
token: string;
|
|
7
|
+
acquiredAt: number;
|
|
8
|
+
expiresIn: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 获取微博 API token
|
|
12
|
+
* 通过 http://open-im.api.weibo.com/open/auth/ws_token 获取
|
|
13
|
+
* token 过期时间为 2 小时
|
|
14
|
+
*/
|
|
15
|
+
export declare function fetchWeiboToken(appId: string, appSecret: string, tokenEndpoint?: string): Promise<WeiboTokenCache>;
|
|
16
|
+
/**
|
|
17
|
+
* 检查 token 是否有效
|
|
18
|
+
*/
|
|
19
|
+
export declare function isTokenValid(tokenCache: WeiboTokenCache | null): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 获取有效的微博 token
|
|
22
|
+
* 如果缓存的 token 未过期则返回缓存,否则重新获取
|
|
23
|
+
*/
|
|
24
|
+
export declare function getValidWeiboToken(appId: string, appSecret: string, tokenEndpoint?: string): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* 获取当前缓存的 token 信息
|
|
27
|
+
*/
|
|
28
|
+
export declare function getCachedToken(): WeiboTokenCache | null;
|
|
29
|
+
/**
|
|
30
|
+
* 清除 token 缓存
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearWeiboTokenCache(): void;
|
|
33
|
+
export type WeiboTokenConfig = {
|
|
34
|
+
/** App ID,用于获取 token */
|
|
35
|
+
appId?: string;
|
|
36
|
+
/** App Secret,用于获取 token */
|
|
37
|
+
appSecret?: string;
|
|
38
|
+
/** Token 端点,默认为 http://open-im.api.weibo.com/open/auth/ws_token */
|
|
39
|
+
tokenEndpoint?: string;
|
|
40
|
+
/** 是否启用 token 工具,默认为 true */
|
|
41
|
+
enabled?: boolean;
|
|
42
|
+
};
|
|
43
|
+
export declare function getWeiboTokenConfig(api: OpenClawPluginApi): WeiboTokenConfig;
|
|
44
|
+
export declare function registerWeiboTokenTools(api: OpenClawPluginApi): void;
|
|
45
|
+
//# sourceMappingURL=weibo-token-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weibo-token-tool.d.ts","sourceRoot":"","sources":["../../src/weibo-token-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAItD,eAAO,MAAM,gBAAgB,yCAAkB,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AA+B/D,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAYF;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC,CAmC1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CASxE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAID,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,gBAAgB,CAQ5E;AAID,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,QA0D7D"}
|