@wecode-ai/weibo-openclaw-plugin 2.2.9 → 2.2.11

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.
Files changed (37) hide show
  1. package/node_modules/tar/dist/commonjs/header.d.ts.map +1 -1
  2. package/node_modules/tar/dist/commonjs/header.js +51 -16
  3. package/node_modules/tar/dist/commonjs/header.js.map +1 -1
  4. package/node_modules/tar/dist/commonjs/index.min.js +3 -3
  5. package/node_modules/tar/dist/commonjs/index.min.js.map +3 -3
  6. package/node_modules/tar/dist/commonjs/pack.d.ts +1 -1
  7. package/node_modules/tar/dist/commonjs/pack.d.ts.map +1 -1
  8. package/node_modules/tar/dist/commonjs/pack.js +4 -5
  9. package/node_modules/tar/dist/commonjs/pack.js.map +1 -1
  10. package/node_modules/tar/dist/commonjs/types.d.ts +9 -0
  11. package/node_modules/tar/dist/commonjs/types.d.ts.map +1 -1
  12. package/node_modules/tar/dist/commonjs/types.js +21 -1
  13. package/node_modules/tar/dist/commonjs/types.js.map +1 -1
  14. package/node_modules/tar/dist/esm/header.d.ts.map +1 -1
  15. package/node_modules/tar/dist/esm/header.js +51 -16
  16. package/node_modules/tar/dist/esm/header.js.map +1 -1
  17. package/node_modules/tar/dist/esm/index.min.js +3 -3
  18. package/node_modules/tar/dist/esm/index.min.js.map +3 -3
  19. package/node_modules/tar/dist/esm/pack.d.ts +1 -1
  20. package/node_modules/tar/dist/esm/pack.d.ts.map +1 -1
  21. package/node_modules/tar/dist/esm/pack.js +4 -5
  22. package/node_modules/tar/dist/esm/pack.js.map +1 -1
  23. package/node_modules/tar/dist/esm/types.d.ts +9 -0
  24. package/node_modules/tar/dist/esm/types.d.ts.map +1 -1
  25. package/node_modules/tar/dist/esm/types.js +20 -0
  26. package/node_modules/tar/dist/esm/types.js.map +1 -1
  27. package/node_modules/tar/package.json +11 -10
  28. package/node_modules/ws/lib/receiver.js +54 -0
  29. package/node_modules/ws/lib/websocket-server.js +8 -0
  30. package/node_modules/ws/lib/websocket.js +14 -0
  31. package/node_modules/ws/package.json +1 -1
  32. package/package.json +1 -1
  33. package/skills/manifest.json +2 -1
  34. package/skills/weibo-adincentive/SKILL.md +512 -0
  35. package/skills/weibo-adincentive/scripts/weibo-adincentive.js +217 -0
  36. package/skills/weibo-creator/SKILL.md +37 -9
  37. package/skills/weibo-creator/scripts/weibo-creator.js +2 -0
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 微博激励计划数据摘要脚本
5
+ *
6
+ * 使用方法:
7
+ * node weibo-adincentive.js summary --token=<token>
8
+ *
9
+ * 命令:
10
+ * summary 获取激励计划数据摘要(在线计划列表、计划高收益博文示例、博主优质博文)
11
+ * help 显示帮助信息
12
+ */
13
+
14
+ import https from 'https';
15
+ import http from 'http';
16
+ import { URL } from 'url';
17
+
18
+ const BASE_URL = 'https://open-im.api.weibo.com';
19
+
20
+ // ============================================================================
21
+ // HTTP 请求
22
+ // ============================================================================
23
+
24
+ /**
25
+ * 发送 HTTP 请求
26
+ * @param {string} method - HTTP 方法
27
+ * @param {string} url - 请求 URL
28
+ * @param {object|null} data - 请求数据(POST 时使用)
29
+ * @returns {Promise<object>} 响应数据
30
+ */
31
+ function request(method, url, data = null) {
32
+ return new Promise((resolve, reject) => {
33
+ const urlObj = new URL(url);
34
+ const isHttps = urlObj.protocol === 'https:';
35
+ const httpModule = isHttps ? https : http;
36
+
37
+ const options = {
38
+ hostname: urlObj.hostname,
39
+ port: urlObj.port || (isHttps ? 443 : 80),
40
+ path: urlObj.pathname + urlObj.search,
41
+ method: method,
42
+ headers: {
43
+ 'Content-Type': 'application/json',
44
+ 'Accept': 'application/json',
45
+ },
46
+ };
47
+
48
+ const req = httpModule.request(options, (res) => {
49
+ let body = '';
50
+ res.on('data', (chunk) => { body += chunk; });
51
+ res.on('end', () => {
52
+ try { resolve(JSON.parse(body)); }
53
+ catch (e) { reject(new Error(`解析响应失败: ${body}`)); }
54
+ });
55
+ });
56
+
57
+ req.on('error', (e) => { reject(e); });
58
+ if (data) req.write(JSON.stringify(data));
59
+ req.end();
60
+ });
61
+ }
62
+
63
+ // ============================================================================
64
+ // API 函数
65
+ // ============================================================================
66
+
67
+ /**
68
+ * 获取激励计划数据摘要
69
+ *
70
+ * 返回结构(AdIncentiveSummary)包含:
71
+ * - uid: 用户 uid
72
+ * - userLevel: 用户认证等级(如"金V"、"蓝V"、"普通用户"等)
73
+ * - plans: 在线激励计划列表(IncentivePlan[])
74
+ * - totalPlans: 在线激励计划总数
75
+ * - planRanks: 计划高收益博文示例(Map<key, PlanRank>,通过planName与plans关联)
76
+ * - myBlogs: 博主近7日高收益博文列表(MyBlog[])
77
+ *
78
+ * @param {string} token - 认证令牌
79
+ * @returns {Promise<object>} 激励计划数据摘要
80
+ */
81
+ async function getAdIncentiveSummary(token) {
82
+ const params = new URLSearchParams({ token });
83
+ const url = `${BASE_URL}/open/adincentive/summary?${params.toString()}`;
84
+ return request('GET', url);
85
+ }
86
+
87
+ // ============================================================================
88
+ // 命令行参数解析
89
+ // ============================================================================
90
+
91
+ /**
92
+ * 解析命令行参数
93
+ * @param {string[]} args - 命令行参数
94
+ * @returns {object} 解析后的参数对象
95
+ */
96
+ function parseArgs(args) {
97
+ const result = {};
98
+ for (let i = 0; i < args.length; i++) {
99
+ const arg = args[i];
100
+ if (arg.startsWith('--')) {
101
+ const [key, ...valueParts] = arg.slice(2).split('=');
102
+ const value = valueParts.join('=') || args[++i] || true;
103
+ result[key] = value;
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+
109
+ // ============================================================================
110
+ // 帮助信息
111
+ // ============================================================================
112
+
113
+ function printHelp() {
114
+ console.log(`
115
+ 微博激励计划数据摘要脚本
116
+
117
+ 使用方法:
118
+ node weibo-adincentive.js <command> [options]
119
+
120
+ 命令:
121
+ summary 获取激励计划数据摘要
122
+ help 显示帮助信息
123
+
124
+ 选项:
125
+ --token=<token> 微博 API 访问令牌(必填,通过 weibo_token 工具获取)
126
+
127
+ 示例:
128
+ node weibo-adincentive.js summary --token=<your_token>
129
+
130
+ 返回数据说明:
131
+ data.uid 用户 uid
132
+ data.userLevel 用户认证等级(如"金V"、"蓝V"、"普通用户"等)
133
+ data.plans 在线激励计划列表
134
+ .name 计划名称
135
+ .desc 计划描述/规则简介
136
+ .category 业务分类标识(hot/video/campus/cross/other)
137
+ .categoryName 业务分类中文名
138
+ .prUrl 计划PR博文链接
139
+ .hasRank 是否有高收益博文示例(周榜数据)
140
+ .tags[] 激励内容方向标签列表
141
+ .name 方向标签名称
142
+ data.totalPlans 在线激励计划总数
143
+ data.planRanks 计划高收益博文示例(Map结构,通过planName与plans关联)
144
+ .<key>.planName 计划名称
145
+ .<key>.rankRule 高收益博文示例规则说明
146
+ .<key>.prUrl 计划PR博文链接
147
+ .<key>.period 当前示例周期(最新一周)
148
+ .<key>.categories[] 分类tab列表
149
+ .cateId 分类ID
150
+ .name 分类名称
151
+ .<key>.blogs[] 高收益博文示例列表
152
+ .mid 博文mid
153
+ .text 博文正文内容
154
+ .topics[] 命中话题列表
155
+ .category 所属类别/tab名称
156
+ .hasVideo 是否含视频
157
+ .<key>.totalInPage 当前页博文数量
158
+ .<key>.hasMore 是否有更多数据
159
+ data.myBlogs 博主近7日高收益博文列表
160
+ .mid 博文mid
161
+ .text 博文正文内容
162
+ .createTime 发博日期(Y-m-d)
163
+ .topics[] 命中话题列表
164
+ .hasVideo 是否含视频
165
+ .matchedPlans[] 命中的激励计划列表
166
+ .name 计划名称
167
+ .prUrl 计划PR链接
168
+ `);
169
+ }
170
+
171
+ // ============================================================================
172
+ // 主函数
173
+ // ============================================================================
174
+
175
+ async function main() {
176
+ const args = process.argv.slice(2);
177
+ const command = args[0];
178
+ const options = parseArgs(args.slice(1));
179
+
180
+ if (!command || command === 'help') {
181
+ printHelp();
182
+ return;
183
+ }
184
+
185
+ try {
186
+ let result;
187
+
188
+ switch (command) {
189
+ case 'summary': {
190
+ if (!options.token) {
191
+ console.error('需要指定 --token 参数,请先通过 weibo_token 工具获取');
192
+ process.exit(1);
193
+ }
194
+ result = await getAdIncentiveSummary(options.token);
195
+ break;
196
+ }
197
+
198
+ default:
199
+ console.error(`未知命令: ${command}`);
200
+ console.log('使用 "node weibo-adincentive.js help" 查看帮助信息');
201
+ process.exit(1);
202
+ }
203
+
204
+ console.log(JSON.stringify(result, null, 2));
205
+
206
+ } catch (error) {
207
+ console.error(`请求失败: ${error.message}`);
208
+ process.exit(1);
209
+ }
210
+ }
211
+
212
+ // 导出函数供模块使用
213
+ export {
214
+ getAdIncentiveSummary,
215
+ };
216
+
217
+ main();
@@ -9,7 +9,7 @@ description: |
9
9
  或当用户询问自己的 V榜排名、得分、与同领域博主对比、哪些方面需要提升时激活;
10
10
  或当用户询问粉丝群运营情况、群活跃度、铁粉在群率、视频播放数据时激活。
11
11
  metadata:
12
- version: "1.0.3"
12
+ version: "1.0.5"
13
13
  ---
14
14
 
15
15
  # 微博创作者数据工具
@@ -36,6 +36,20 @@ node scripts/weibo-creator.js summary --token=<token>
36
36
 
37
37
  返回的 `data` 字段为 `CreatorSummary` 对象,包含以下维度:
38
38
 
39
+ ### 0. 用户基本信息
40
+
41
+ #### `data.uid` — 用户 uid
42
+
43
+ #### `data.userLevel` — 用户认证等级
44
+
45
+ | 字段 | 类型 | 说明 |
46
+ |------|------|------|
47
+ | `userLevel` | string | 用户认证等级(如 "金V"、"橙V"、"蓝V"、"黄V"、"普通用户" 等) |
48
+
49
+ > `userLevel` 反映博主当前的认证身份,在金橙V升级分析中可直接用于判断当前状态,无需从其他数据推断。
50
+
51
+ ---
52
+
39
53
  ### 1. 近30天阅读数据
40
54
 
41
55
  #### `data.readTrend30Days` — 每日阅读趋势(数组,T-1 至 T-30,共30条)
@@ -219,15 +233,25 @@ node scripts/weibo-creator.js summary --token=<token>
219
233
 
220
234
  #### `data.groupDetails` — 单个粉丝群活跃数据列表(数组,每个群一条)
221
235
 
236
+ **T-1 当前值字段**:
237
+
222
238
  | 字段 | 类型 | 说明 |
223
239
  |------|------|------|
224
240
  | `gid` | string | 粉丝群 ID |
225
241
  | `name` | string | 粉丝群名称 |
226
- | `memberCount` | string | 群成员人数(近7日,T-1 当前值) |
227
- | `openCount` | string | 群内打开人数(近7日,T-1 当前值) |
228
- | `speakCount` | string | 群内发言人数(T-1 日) |
229
- | `avgSpeak` | string | 人均发言条数(T-1 日) |
230
- | `bigfanCount` | string | 群内铁粉人数(T-1 日) |
242
+ | `genderRate` | object | 群内性别分布:key "男"/"女",value 为百分比整数字符串(如 "56") |
243
+ | `bigfanRate` | string | 铁粉占比(T-1 日,%) |
244
+ | `loveFanRate` | string | 真爱粉占比(T-1 日,%) |
245
+
246
+ **近7日趋势字段**(每个字段均为数组,共7条,每条含 `date`(yyyy-MM-dd)和 `num`(指标值字符串)):
247
+
248
+ | 字段 | 说明 |
249
+ |------|------|
250
+ | `memberCountTrend` | 单个群成员人数近7日趋势 |
251
+ | `openCountTrend` | 单个群打开人数近7日趋势 |
252
+ | `speakCountTrend` | 单个群发言人数近7日趋势 |
253
+ | `speakTimesTrend` | 单个群发言条数近7日趋势 |
254
+ | `joinCountTrend` | 单个群进群人数近7日趋势 |
231
255
 
232
256
  ---
233
257
 
@@ -313,6 +337,7 @@ node scripts/weibo-creator.js help
313
337
  "message": "success",
314
338
  "data": {
315
339
  "uid": 1234567890,
340
+ "userLevel": "黄V",
316
341
  "readTrend30Days": [
317
342
  { "date": "2026-05-07", "totalReadCount": 12500 },
318
343
  { "date": "2026-05-06", "totalReadCount": 9800 }
@@ -463,8 +488,11 @@ node scripts/weibo-creator.js help
463
488
 
464
489
  **第一步:判断当前状态**
465
490
 
466
- - **已是黄V,尚未达到橙V**:铁粉数 < 100 或近30天排水阅读量 < 30 万
467
- - **已是橙V,尚未达到金V**:粉丝量 < 1 万 或 铁粉数 < 1000 或 近30天排水阅读量 < 1000 万
491
+ 根据 `userLevel` 字段直接判断当前认证等级:
492
+
493
+ - **已是黄V,尚未达到橙V**:`userLevel` 为 "黄V",且铁粉数 < 100 或近30天排水阅读量 < 30 万
494
+ - **已是橙V,尚未达到金V**:`userLevel` 为 "橙V",且粉丝量 < 1 万 或 铁粉数 < 1000 或 近30天排水阅读量 < 1000 万
495
+ - **已是金V**:`userLevel` 为 "金V"
468
496
 
469
497
  **第二步:计算各项达标差距**
470
498
 
@@ -625,7 +653,7 @@ node scripts/weibo-creator.js help
625
653
 
626
654
  **第四步:分析各群详情(如有多个群)**
627
655
 
628
- 从 `groupDetails` 中对比各群的 `memberCount`、`speakCount`、`bigfanCount`,找出最活跃的群和需要重点运营的群。
656
+ 从 `groupDetails` 中对比各群的 `bigfanRate`,以及 `speakCountTrend`、`memberCountTrend` 近7日趋势,找出最活跃的群和需要重点运营的群。
629
657
 
630
658
  **第五步:输出分析报告**
631
659
 
@@ -69,6 +69,7 @@ function request(method, url, data = null) {
69
69
  *
70
70
  * 返回结构(CreatorSummary)包含:
71
71
  * - uid: 用户 uid
72
+ * - userLevel: 用户认证等级(如"金V"、"橙V"、"蓝V"、"黄V"、"普通用户"等)
72
73
  * - readTrend30Days: 近30天每日阅读趋势(DailyReadData[])
73
74
  * - readSourceSummary30Days: 近30日分场景阅读汇总(ReadSourceSummary)
74
75
  * - postTrend30Days: 近30天每日发博趋势(DailyPostData[])
@@ -131,6 +132,7 @@ function printHelp() {
131
132
 
132
133
  返回数据说明:
133
134
  data.uid 用户 uid
135
+ data.userLevel 用户认证等级(如"金V"、"橙V"、"蓝V"、"黄V"、"普通用户"等)
134
136
  data.readTrend30Days 近30天每日阅读趋势(date, totalReadCount)
135
137
  data.readSourceSummary30Days 近30日分场景阅读汇总
136
138
  .followReadCount / followReadRate 关注流阅读数/占比(私域)