openclaw-github-trending 1.4.1 → 1.4.3
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 +44 -39
- package/dist/channels/wechat.d.ts +20 -28
- package/dist/channels/wechat.d.ts.map +1 -1
- package/dist/channels/wechat.js +318 -122
- package/dist/channels/wechat.js.map +1 -1
- package/dist/core/history.d.ts +2 -2
- package/dist/core/history.d.ts.map +1 -1
- package/dist/core/history.js +12 -4
- package/dist/core/history.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -21
- package/dist/index.js.map +1 -1
- package/dist/models/config.d.ts +1 -0
- package/dist/models/config.d.ts.map +1 -1
- package/dist/tool.d.ts.map +1 -1
- package/dist/tool.js +6 -17
- package/dist/tool.js.map +1 -1
- package/openclaw.plugin.json +13 -3
- package/package.json +2 -2
package/dist/channels/wechat.js
CHANGED
|
@@ -1,21 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.WeChatChannel = void 0;
|
|
4
37
|
const logger_1 = require("../utils/logger");
|
|
5
38
|
const logger = logger_1.Logger.get('WeChatChannel');
|
|
6
39
|
/**
|
|
7
|
-
* WeChat Channel
|
|
8
|
-
* Uses the @tencent-weixin/openclaw-weixin plugin
|
|
40
|
+
* WeChat Channel - 通过企业微信推送 GitHub 热榜
|
|
9
41
|
*/
|
|
10
42
|
class WeChatChannel {
|
|
11
43
|
/**
|
|
12
|
-
*
|
|
13
|
-
* @param newRepositories Array of new repositories
|
|
14
|
-
* @param seenRepositories Array of seen repositories
|
|
15
|
-
* @param since Time period for trending
|
|
16
|
-
* @returns Markdown formatted message
|
|
44
|
+
* 构建纯文本消息(企业微信不支持 markdown)
|
|
17
45
|
*/
|
|
18
|
-
static
|
|
46
|
+
static buildPlainText(newRepositories, seenRepositories, since = 'monthly') {
|
|
19
47
|
const currentDate = new Date();
|
|
20
48
|
const dateStr = currentDate.toLocaleDateString('zh-CN', {
|
|
21
49
|
year: 'numeric',
|
|
@@ -31,63 +59,101 @@ class WeChatChannel {
|
|
|
31
59
|
const sinceText = sinceTextMap[since];
|
|
32
60
|
const lines = [];
|
|
33
61
|
// Header
|
|
34
|
-
lines.push(
|
|
35
|
-
lines.push(``);
|
|
62
|
+
lines.push(`🚀 GitHub ${sinceText}热榜推送`);
|
|
36
63
|
lines.push(`📅 ${dateStr}`);
|
|
37
|
-
lines.push(
|
|
64
|
+
lines.push('');
|
|
38
65
|
// New repositories
|
|
39
66
|
if (newRepositories.length > 0) {
|
|
40
|
-
lines.push(
|
|
41
|
-
lines.push(
|
|
67
|
+
lines.push(`━━━ 🔥 新上榜项目 (${newRepositories.length}) ━━━`);
|
|
68
|
+
lines.push('');
|
|
42
69
|
newRepositories.forEach((repo, index) => {
|
|
43
70
|
const formattedStars = WeChatChannel.formatNumberWithK(repo.stars);
|
|
44
71
|
const formattedForks = repo.forks ? ` ⚡${WeChatChannel.formatNumberWithK(repo.forks)}` : '';
|
|
45
|
-
const language = repo.language ? `
|
|
46
|
-
lines.push(
|
|
72
|
+
const language = repo.language ? ` · ${repo.language}` : '';
|
|
73
|
+
lines.push(`【${index + 1}】${repo.full_name}`);
|
|
47
74
|
lines.push(`⭐ ${formattedStars}${formattedForks}${language}`);
|
|
75
|
+
lines.push(repo.url);
|
|
48
76
|
if (repo.ai_summary) {
|
|
49
|
-
lines.push(
|
|
50
|
-
lines.push(
|
|
51
|
-
|
|
77
|
+
lines.push('');
|
|
78
|
+
lines.push('🤖 项目介绍:');
|
|
79
|
+
const summaryLines = WeChatChannel.wrapText(repo.ai_summary, 50);
|
|
80
|
+
summaryLines.forEach(line => {
|
|
81
|
+
lines.push(` ${line}`);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (index < newRepositories.length - 1) {
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push('━━━━━━━━━━━━');
|
|
87
|
+
lines.push('');
|
|
52
88
|
}
|
|
53
|
-
lines.push(``);
|
|
54
89
|
});
|
|
55
90
|
}
|
|
56
91
|
// Seen repositories
|
|
57
92
|
if (seenRepositories.length > 0) {
|
|
58
93
|
if (newRepositories.length > 0) {
|
|
59
|
-
lines.push(
|
|
94
|
+
lines.push('');
|
|
95
|
+
lines.push('');
|
|
60
96
|
}
|
|
61
|
-
lines.push(
|
|
62
|
-
lines.push(
|
|
97
|
+
lines.push(`━━━ ⭐ 持续霸榜项目 (${seenRepositories.length}) ━━━`);
|
|
98
|
+
lines.push('');
|
|
63
99
|
seenRepositories.forEach((repo, index) => {
|
|
64
100
|
const formattedStars = WeChatChannel.formatNumberWithK(repo.stars);
|
|
65
101
|
const formattedForks = repo.forks ? ` ⚡${WeChatChannel.formatNumberWithK(repo.forks)}` : '';
|
|
66
|
-
const language = repo.language ? `
|
|
67
|
-
lines.push(
|
|
102
|
+
const language = repo.language ? ` · ${repo.language}` : '';
|
|
103
|
+
lines.push(`【${index + 1}】${repo.full_name}`);
|
|
68
104
|
lines.push(`⭐ ${formattedStars}${formattedForks}${language}`);
|
|
105
|
+
lines.push(repo.url);
|
|
69
106
|
if (repo.ai_summary) {
|
|
70
|
-
lines.push(
|
|
71
|
-
|
|
72
|
-
|
|
107
|
+
lines.push('');
|
|
108
|
+
const firstSentence = repo.ai_summary.split('.')[0] + '.';
|
|
109
|
+
const wrappedLines = WeChatChannel.wrapText(firstSentence, 50);
|
|
110
|
+
lines.push('🤖 简介:');
|
|
111
|
+
wrappedLines.forEach(line => {
|
|
112
|
+
lines.push(` ${line}`);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (index < seenRepositories.length - 1) {
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push('━━━━━━━━━━━━');
|
|
118
|
+
lines.push('');
|
|
73
119
|
}
|
|
74
|
-
lines.push(``);
|
|
75
120
|
});
|
|
76
121
|
}
|
|
77
122
|
// No repositories
|
|
78
123
|
if (newRepositories.length === 0 && seenRepositories.length === 0) {
|
|
79
|
-
lines.push(
|
|
124
|
+
lines.push('📌 暂无 trending 项目');
|
|
80
125
|
}
|
|
81
126
|
// Footer
|
|
82
|
-
lines.push(
|
|
83
|
-
lines.push(
|
|
84
|
-
lines.push(
|
|
127
|
+
lines.push('');
|
|
128
|
+
lines.push('');
|
|
129
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━');
|
|
130
|
+
lines.push('✨ 本消息由 GitHub 热榜机器人自动生成');
|
|
131
|
+
lines.push('🔗 https://github.com/wy-ruby/openclaw-github-trending');
|
|
85
132
|
return lines.join('\n');
|
|
86
133
|
}
|
|
87
134
|
/**
|
|
88
|
-
*
|
|
89
|
-
|
|
90
|
-
|
|
135
|
+
* 文本自动换行
|
|
136
|
+
*/
|
|
137
|
+
static wrapText(text, maxWidth = 60) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
let currentLine = '';
|
|
140
|
+
const words = text.split(/(?<=[\u4e00-\u9fa5])|(?=[\u4e00-\u9fa5])|\s+/).filter(w => w);
|
|
141
|
+
for (const word of words) {
|
|
142
|
+
if ((currentLine + word).length <= maxWidth) {
|
|
143
|
+
currentLine += word;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
if (currentLine)
|
|
147
|
+
lines.push(currentLine.trim());
|
|
148
|
+
currentLine = word;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (currentLine)
|
|
152
|
+
lines.push(currentLine.trim());
|
|
153
|
+
return lines;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 格式化数字(添加 k 后缀)
|
|
91
157
|
*/
|
|
92
158
|
static formatNumberWithK(num) {
|
|
93
159
|
if (num >= 1000) {
|
|
@@ -96,115 +162,245 @@ class WeChatChannel {
|
|
|
96
162
|
return num.toString();
|
|
97
163
|
}
|
|
98
164
|
/**
|
|
99
|
-
*
|
|
100
|
-
* The plugin should be installed and configured in OpenClaw
|
|
101
|
-
*
|
|
102
|
-
* @param markdownContent Markdown content to send
|
|
103
|
-
* @param openclawApi OpenClaw API instance for invoking channels
|
|
104
|
-
* @param config WeChat configuration
|
|
105
|
-
* @returns Push result
|
|
165
|
+
* 发送消息到微信(通过 openclaw CLI)
|
|
106
166
|
*/
|
|
107
|
-
static async send(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const wechatBotAccountId = config.bot_account_id || process.env.OPENCLAW_WECHAT_BOT_ACCOUNT_ID;
|
|
116
|
-
logger.info('WeChat configuration', {
|
|
117
|
-
receiverId: wechatReceiverId,
|
|
118
|
-
botAccountId: wechatBotAccountId
|
|
119
|
-
});
|
|
120
|
-
// 检查 openclawApi 是否包含 channels
|
|
121
|
-
if (!openclawApi || !openclawApi.channels) {
|
|
122
|
-
logger.error('openclawApi.channels not available');
|
|
123
|
-
return {
|
|
124
|
-
success: false,
|
|
125
|
-
error: 'openclawApi.channels not available - WeChat plugin may not be installed'
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
// 获取微信 channel 实例
|
|
129
|
-
const wechatChannel = openclawApi.channels['openclaw-weixin'];
|
|
130
|
-
if (!wechatChannel) {
|
|
131
|
-
logger.error('WeChat channel "openclaw-weixin" not found');
|
|
132
|
-
return {
|
|
133
|
-
success: false,
|
|
134
|
-
error: 'WeChat channel "openclaw-weixin" not found - please install and configure the plugin'
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
// 直接调用微信 channel 的 send 方法
|
|
138
|
-
// OpenClaw 的 channel API 通常有 send 方法
|
|
139
|
-
logger.debug('Invoking WeChat channel send...', {
|
|
140
|
-
receiverId: wechatReceiverId,
|
|
141
|
-
botAccountId: wechatBotAccountId,
|
|
142
|
-
messageLength: markdownContent.length
|
|
143
|
-
});
|
|
144
|
-
const sendResult = await wechatChannel.send({
|
|
145
|
-
to: wechatReceiverId,
|
|
146
|
-
accountId: wechatBotAccountId,
|
|
147
|
-
message: markdownContent
|
|
148
|
-
});
|
|
149
|
-
const duration = Date.now() - startTime;
|
|
150
|
-
logger.info('WeChat send completed', {
|
|
151
|
-
durationMs: duration,
|
|
152
|
-
messageId: sendResult?.message_id || sendResult?.id || 'unknown',
|
|
153
|
-
success: true
|
|
154
|
-
});
|
|
167
|
+
static async send(content, openclawApi, config) {
|
|
168
|
+
const startTime = Date.now();
|
|
169
|
+
const channelName = config.channel_name || 'openclaw-weixin';
|
|
170
|
+
// 检查微信插件是否已安装并启用
|
|
171
|
+
const wechatPluginEnabled = openclawApi?.config?.plugins?.entries?.['openclaw-weixin']?.enabled;
|
|
172
|
+
const wechatPluginInstalled = openclawApi?.config?.plugins?.installs?.['openclaw-weixin'];
|
|
173
|
+
if (!wechatPluginInstalled) {
|
|
174
|
+
logger.error('WeChat plugin not installed');
|
|
155
175
|
return {
|
|
156
|
-
success:
|
|
157
|
-
|
|
158
|
-
error: undefined
|
|
176
|
+
success: false,
|
|
177
|
+
error: '微信插件未安装:请先运行 `openclaw plugins install @tencent-weixin/openclaw-weixin` 安装微信插件'
|
|
159
178
|
};
|
|
160
179
|
}
|
|
161
|
-
|
|
162
|
-
logger.error('WeChat
|
|
163
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
164
|
-
stack: error instanceof Error ? error.stack : undefined
|
|
165
|
-
});
|
|
180
|
+
if (wechatPluginEnabled === false) {
|
|
181
|
+
logger.error('WeChat plugin is disabled');
|
|
166
182
|
return {
|
|
167
183
|
success: false,
|
|
168
|
-
error:
|
|
184
|
+
error: '微信插件已禁用:请在 openclaw.json 中设置 plugins.entries.openclaw-weixin.enabled = true'
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// 尝试从多个来源获取 receiver_id
|
|
188
|
+
const receiverId = await this.resolveReceiverId(config, openclawApi);
|
|
189
|
+
if (!receiverId) {
|
|
190
|
+
logger.error('WeChat receiver_id not found');
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
error: '微信接收者 ID 未配置。\n\n' +
|
|
194
|
+
'📌 解决方案(选择其一):\n\n' +
|
|
195
|
+
'1️⃣ 在插件配置中添加 receiver_id(推荐):\n' +
|
|
196
|
+
' 编辑 ~/.openclaw/openclaw.json\n' +
|
|
197
|
+
' plugins.entries.openclaw-github-trending.config.channels.wechat.receiver_id = "your-wechat-id@im.wechat"\n\n' +
|
|
198
|
+
'2️⃣ 设置环境变量:\n' +
|
|
199
|
+
' export OPENCLAW_WECHAT_RECEIVER_ID="your-wechat-id@im.wechat"\n\n' +
|
|
200
|
+
'3️⃣ 从微信发起一次对话:\n' +
|
|
201
|
+
' 如果你在微信中给机器人发送过消息,插件会自动回复给发送者\n\n' +
|
|
202
|
+
'💡 如何获取你的微信 ID:\n' +
|
|
203
|
+
' 运行命令:openclaw message channel list --channel openclaw-weixin\n' +
|
|
204
|
+
' 或者查看会话历史:cat ~/.openclaw/agents/main/sessions/sessions.json | grep weixin\n\n' +
|
|
205
|
+
'提示:微信 ID 格式通常为:xxx@im.wechat'
|
|
169
206
|
};
|
|
170
207
|
}
|
|
208
|
+
const botAccountId = config.bot_account_id || process.env.OPENCLAW_WECHAT_BOT_ACCOUNT_ID;
|
|
209
|
+
logger.info('Sending WeChat message', {
|
|
210
|
+
receiverId: receiverId ? `${receiverId.substring(0, 4)}****` : 'not set',
|
|
211
|
+
contentLength: content.length
|
|
212
|
+
});
|
|
213
|
+
const result = await this.sendViaCli(content, receiverId, botAccountId, channelName);
|
|
214
|
+
const duration = Date.now() - startTime;
|
|
215
|
+
if (result.success) {
|
|
216
|
+
logger.info('WeChat send completed', { durationMs: duration });
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
logger.error('WeChat send failed', {
|
|
220
|
+
durationMs: duration,
|
|
221
|
+
error: result.error
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return result;
|
|
171
225
|
}
|
|
172
226
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* @param markdownContent Markdown content to send
|
|
177
|
-
* @param openclawApi OpenClaw API instance
|
|
178
|
-
* @returns Push result
|
|
227
|
+
* 从多个来源解析 receiver_id
|
|
228
|
+
* 优先级:1. 插件配置 2. 环境变量 3. 消息上下文 4. 会话历史 5. OpenClaw API
|
|
179
229
|
*/
|
|
180
|
-
static async
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
230
|
+
static async resolveReceiverId(config, openclawApi) {
|
|
231
|
+
// 1. 优先使用插件配置中的 receiver_id
|
|
232
|
+
if (config.receiver_id) {
|
|
233
|
+
logger.info('Using receiver_id from plugin config');
|
|
234
|
+
return config.receiver_id;
|
|
235
|
+
}
|
|
236
|
+
// 2. 尝试从环境变量获取
|
|
237
|
+
if (process.env.OPENCLAW_WECHAT_RECEIVER_ID) {
|
|
238
|
+
logger.info('Using receiver_id from environment variable');
|
|
239
|
+
return process.env.OPENCLAW_WECHAT_RECEIVER_ID;
|
|
240
|
+
}
|
|
241
|
+
// 3. 尝试从消息上下文获取(如果当前会话来自微信)
|
|
242
|
+
if (openclawApi?.context?.channel === 'openclaw-weixin') {
|
|
243
|
+
const fromUser = openclawApi?.context?.from;
|
|
244
|
+
if (fromUser) {
|
|
245
|
+
logger.info('Using receiver_id from message context (echo back to sender)');
|
|
246
|
+
return fromUser;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// 4. 尝试从 OpenClaw 会话历史中获取最近使用的微信接收者
|
|
250
|
+
// 检查 sessions.json 中的微信会话
|
|
184
251
|
try {
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
252
|
+
const { readFileSync } = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
253
|
+
const { join } = await Promise.resolve().then(() => __importStar(require('path')));
|
|
254
|
+
const { homedir } = await Promise.resolve().then(() => __importStar(require('os')));
|
|
255
|
+
const sessionsPath = join(homedir(), '.openclaw', 'agents', 'main', 'sessions', 'sessions.json');
|
|
256
|
+
const sessionsData = JSON.parse(readFileSync(sessionsPath, 'utf-8'));
|
|
257
|
+
// sessions.json 的结构是 { [sessionKey]: sessionData, ... }
|
|
258
|
+
// 查找包含 openclaw-weixin 的会话键
|
|
259
|
+
const sessionKeys = Object.keys(sessionsData);
|
|
260
|
+
for (const key of sessionKeys) {
|
|
261
|
+
if (key.includes('openclaw-weixin')) {
|
|
262
|
+
// session key 格式:agent:main:openclaw-weixin:direct:xxx@im.wechat
|
|
263
|
+
// 从 key 中提取 receiver_id(最后一部分)
|
|
264
|
+
const keyParts = key.split(':');
|
|
265
|
+
const potentialReceiverId = keyParts[keyParts.length - 1];
|
|
266
|
+
if (potentialReceiverId && potentialReceiverId.includes('@im.wechat')) {
|
|
267
|
+
// ⚠️ 重要:微信 ID 区分大小写!
|
|
268
|
+
// 如果 ID 是全小写,尝试从已知的发送记录中获取正确的大小写格式
|
|
269
|
+
const lowercaseId = potentialReceiverId.toLowerCase();
|
|
270
|
+
// 尝试从 sessions.json 的其他地方查找正确的大小写格式
|
|
271
|
+
// 检查所有消息记录中的 to/from 字段
|
|
272
|
+
for (const sessionKey of sessionKeys) {
|
|
273
|
+
const session = sessionsData[sessionKey];
|
|
274
|
+
if (session?.lastTo && session.lastTo.toLowerCase() === lowercaseId) {
|
|
275
|
+
logger.info(`Using receiver_id from session.lastTo (preserving case): ${session.lastTo.substring(0, 8)}****`);
|
|
276
|
+
return session.lastTo;
|
|
277
|
+
}
|
|
278
|
+
if (session?.lastFrom && session.lastFrom.toLowerCase() === lowercaseId) {
|
|
279
|
+
logger.info(`Using receiver_id from session.lastFrom (preserving case): ${session.lastFrom.substring(0, 8)}****`);
|
|
280
|
+
return session.lastFrom;
|
|
281
|
+
}
|
|
282
|
+
if (session?.label && session.label.toLowerCase() === lowercaseId) {
|
|
283
|
+
logger.info(`Using receiver_id from session.label (preserving case): ${session.label.substring(0, 8)}****`);
|
|
284
|
+
return session.label;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// 如果找不到正确的大小写格式,使用原始提取的 ID
|
|
288
|
+
logger.info(`Using receiver_id from session key: ${potentialReceiverId.substring(0, 8)}****`);
|
|
289
|
+
return potentialReceiverId;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
logger.warn('Failed to read session history', { error: error instanceof Error ? error.message : error });
|
|
296
|
+
}
|
|
297
|
+
// 5. 尝试通过 OpenClaw 获取微信联系人信息
|
|
298
|
+
try {
|
|
299
|
+
logger.info('Attempting to get WeChat receiver_id from OpenClaw...');
|
|
300
|
+
// 方法 A: 尝试从微信插件的配置文件中获取
|
|
301
|
+
const { readFileSync, existsSync } = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
302
|
+
const { join } = await Promise.resolve().then(() => __importStar(require('path')));
|
|
303
|
+
const { homedir } = await Promise.resolve().then(() => __importStar(require('os')));
|
|
304
|
+
// 尝试读取微信插件的配置文件
|
|
305
|
+
const weixinConfigPaths = [
|
|
306
|
+
join(homedir(), '.openclaw', 'plugins', 'openclaw-weixin', 'config.json'),
|
|
307
|
+
join(homedir(), '.openclaw', 'extensions', 'openclaw-weixin', 'config.json'),
|
|
308
|
+
join(homedir(), '.openclaw', 'credentials.json')
|
|
309
|
+
];
|
|
310
|
+
for (const configPath of weixinConfigPaths) {
|
|
311
|
+
if (existsSync(configPath)) {
|
|
312
|
+
try {
|
|
313
|
+
const configData = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
314
|
+
// 尝试从配置中提取 receiver_id
|
|
315
|
+
// 微信插件可能存储了联系人信息
|
|
316
|
+
if (configData?.accounts) {
|
|
317
|
+
const accountKeys = Object.keys(configData.accounts);
|
|
318
|
+
if (accountKeys.length > 0) {
|
|
319
|
+
logger.info(`Using receiver_id from WeChat plugin config: ${accountKeys[0].substring(0, 8)}****`);
|
|
320
|
+
return accountKeys[0];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
// 忽略读取错误,继续尝试其他方法
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// 方法 B: 尝试从 openclaw-weixin 的 session 中获取
|
|
330
|
+
const sessionsPath = join(homedir(), '.openclaw', 'agents', 'main', 'sessions', 'sessions.json');
|
|
331
|
+
if (existsSync(sessionsPath)) {
|
|
332
|
+
const sessionsData = JSON.parse(readFileSync(sessionsPath, 'utf-8'));
|
|
333
|
+
const sessionKeys = Object.keys(sessionsData);
|
|
334
|
+
// 查找最近的微信 direct 会话
|
|
335
|
+
for (const key of sessionKeys) {
|
|
336
|
+
if (key.includes('openclaw-weixin:direct:')) {
|
|
337
|
+
// 从 key 中提取 receiver_id
|
|
338
|
+
const match = key.match(/openclaw-weixin:direct:([a-zA-Z0-9_-]+@im\.wechat)/i);
|
|
339
|
+
if (match && match[1]) {
|
|
340
|
+
logger.info(`Using receiver_id from WeChat direct session: ${match[1].substring(0, 8)}****`);
|
|
341
|
+
return match[1];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
logger.warn('Failed to get receiver_id from OpenClaw', { error: error instanceof Error ? error.message : error });
|
|
349
|
+
}
|
|
350
|
+
logger.warn('No receiver_id found in any source');
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* 通过 openclaw CLI 发送消息
|
|
355
|
+
*/
|
|
356
|
+
static async sendViaCli(content, to, accountId, channelName) {
|
|
357
|
+
try {
|
|
358
|
+
const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
359
|
+
const args = [
|
|
360
|
+
'message', 'send',
|
|
361
|
+
'--channel', channelName,
|
|
362
|
+
'--target', to,
|
|
363
|
+
'--message', content
|
|
364
|
+
];
|
|
365
|
+
// if (accountId) {
|
|
366
|
+
// args.push('--account', accountId);
|
|
367
|
+
// }
|
|
368
|
+
logger.info('Executing CLI', {
|
|
369
|
+
channel: channelName,
|
|
370
|
+
to,
|
|
371
|
+
argsCount: args.length,
|
|
372
|
+
contentLength: content.length
|
|
373
|
+
});
|
|
374
|
+
const result = await new Promise((resolve, reject) => {
|
|
375
|
+
execFile('openclaw', args, {
|
|
376
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
377
|
+
timeout: 30000
|
|
378
|
+
}, (error, stdout, stderr) => {
|
|
379
|
+
if (error) {
|
|
380
|
+
reject(error);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
resolve({ stdout, stderr });
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
logger.info('CLI send completed', {
|
|
388
|
+
stdout: result.stdout.substring(0, 200),
|
|
389
|
+
stderr: result.stderr ? result.stderr.substring(0, 200) : ''
|
|
193
390
|
});
|
|
194
391
|
return {
|
|
195
392
|
success: true,
|
|
196
|
-
messageId:
|
|
393
|
+
messageId: 'sent-via-cli',
|
|
197
394
|
error: undefined
|
|
198
395
|
};
|
|
199
396
|
}
|
|
200
397
|
catch (error) {
|
|
201
|
-
logger.error('
|
|
202
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
203
|
-
stack: error instanceof Error ? error.stack : undefined
|
|
398
|
+
logger.error('CLI send failed', {
|
|
399
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
204
400
|
});
|
|
205
401
|
return {
|
|
206
402
|
success: false,
|
|
207
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
403
|
+
error: `CLI 发送失败:${error instanceof Error ? error.message : 'Unknown error'}`
|
|
208
404
|
};
|
|
209
405
|
}
|
|
210
406
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wechat.js","sourceRoot":"","sources":["../../src/channels/wechat.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wechat.js","sourceRoot":"","sources":["../../src/channels/wechat.ts"],"names":[],"mappings":"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"}
|
package/dist/core/history.d.ts
CHANGED
|
@@ -40,11 +40,11 @@ export declare class HistoryManager {
|
|
|
40
40
|
/**
|
|
41
41
|
* Determine if a repository should be pushed again
|
|
42
42
|
*/
|
|
43
|
-
shouldPushAgain(repo: RepositoryInfo, history: RepositoryHistory, config: HistoryConfig): boolean;
|
|
43
|
+
shouldPushAgain(repo: RepositoryInfo, history: RepositoryHistory, config: HistoryConfig, since?: string): boolean;
|
|
44
44
|
/**
|
|
45
45
|
* Categorize repositories into new, should push, and already seen
|
|
46
46
|
*/
|
|
47
|
-
categorizeRepositories(repositories: RepositoryInfo[], config: HistoryConfig): {
|
|
47
|
+
categorizeRepositories(repositories: RepositoryInfo[], config: HistoryConfig, since?: 'daily' | 'weekly' | 'monthly'): {
|
|
48
48
|
newlySeen: RepositoryInfo[];
|
|
49
49
|
shouldPush: RepositoryInfo[];
|
|
50
50
|
alreadySeen: RepositoryInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAc;;IAS1B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,UAAU,IAAI,WAAW;IAKzB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAc;;IAS1B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,UAAU,IAAI,WAAW;IAKzB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAwBjH;;OAEG;IACH,sBAAsB,CACpB,YAAY,EAAE,cAAc,EAAE,EAC9B,MAAM,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GACrC;QACD,SAAS,EAAE,cAAc,EAAE,CAAC;QAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;KAC/B;IAyBD;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,IAAI;IA+BhD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOxD;;OAEG;IACH,QAAQ,IAAI;QACV,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAaF;AAED,eAAe,cAAc,CAAC"}
|
package/dist/core/history.js
CHANGED
|
@@ -34,14 +34,22 @@ class HistoryManager {
|
|
|
34
34
|
/**
|
|
35
35
|
* Determine if a repository should be pushed again
|
|
36
36
|
*/
|
|
37
|
-
shouldPushAgain(repo, history, config) {
|
|
37
|
+
shouldPushAgain(repo, history, config, since) {
|
|
38
38
|
// Never pushed before
|
|
39
39
|
if (!history.last_pushed) {
|
|
40
40
|
return true;
|
|
41
41
|
}
|
|
42
42
|
// Stars increased significantly
|
|
43
43
|
const starGrowth = repo.stars - history.last_stars;
|
|
44
|
-
|
|
44
|
+
// 根据榜单周期调整阈值:今日×1,本周×2,本月×5
|
|
45
|
+
let adjustedThreshold = config.star_threshold;
|
|
46
|
+
if (since === 'weekly') {
|
|
47
|
+
adjustedThreshold *= 2;
|
|
48
|
+
}
|
|
49
|
+
else if (since === 'monthly') {
|
|
50
|
+
adjustedThreshold *= 5;
|
|
51
|
+
}
|
|
52
|
+
if (starGrowth >= adjustedThreshold) {
|
|
45
53
|
return true;
|
|
46
54
|
}
|
|
47
55
|
return false;
|
|
@@ -49,7 +57,7 @@ class HistoryManager {
|
|
|
49
57
|
/**
|
|
50
58
|
* Categorize repositories into new, should push, and already seen
|
|
51
59
|
*/
|
|
52
|
-
categorizeRepositories(repositories, config) {
|
|
60
|
+
categorizeRepositories(repositories, config, since) {
|
|
53
61
|
const newlySeen = [];
|
|
54
62
|
const shouldPush = [];
|
|
55
63
|
const alreadySeen = [];
|
|
@@ -60,7 +68,7 @@ class HistoryManager {
|
|
|
60
68
|
newlySeen.push(repo);
|
|
61
69
|
shouldPush.push(repo);
|
|
62
70
|
}
|
|
63
|
-
else if (config.enabled && this.shouldPushAgain(repo, history, config)) {
|
|
71
|
+
else if (config.enabled && this.shouldPushAgain(repo, history, config, since)) {
|
|
64
72
|
// Seen before, but should push again (star growth)
|
|
65
73
|
shouldPush.push(repo);
|
|
66
74
|
alreadySeen.push(repo);
|