weflow-cli 1.5.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/LICENSE +21 -0
- package/README.md +149 -0
- package/bin/weflow-cli-electron.cjs +59 -0
- package/bin/weflow-cli.ts +2311 -0
- package/cli.cjs +3 -0
- package/dist/bin/weflow-cli.d.ts +3 -0
- package/dist/bin/weflow-cli.d.ts.map +1 -0
- package/dist/bin/weflow-cli.js +2270 -0
- package/dist/bin/weflow-cli.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +690 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/core/dbPathService.d.ts +40 -0
- package/dist/src/core/dbPathService.d.ts.map +1 -0
- package/dist/src/core/dbPathService.js +324 -0
- package/dist/src/core/dbPathService.js.map +1 -0
- package/dist/src/core/keyService.d.ts +59 -0
- package/dist/src/core/keyService.d.ts.map +1 -0
- package/dist/src/core/keyService.js +368 -0
- package/dist/src/core/keyService.js.map +1 -0
- package/dist/src/core/ntCore.d.ts +62 -0
- package/dist/src/core/ntCore.d.ts.map +1 -0
- package/dist/src/core/ntCore.js +191 -0
- package/dist/src/core/ntCore.js.map +1 -0
- package/dist/src/core/sqlcipherCore.d.ts +119 -0
- package/dist/src/core/sqlcipherCore.d.ts.map +1 -0
- package/dist/src/core/sqlcipherCore.js +693 -0
- package/dist/src/core/sqlcipherCore.js.map +1 -0
- package/dist/src/core/wcdbCore.d.ts +738 -0
- package/dist/src/core/wcdbCore.d.ts.map +1 -0
- package/dist/src/core/wcdbCore.js +4545 -0
- package/dist/src/core/wcdbCore.js.map +1 -0
- package/dist/src/core/wechatClient.d.ts +23 -0
- package/dist/src/core/wechatClient.d.ts.map +1 -0
- package/dist/src/core/wechatClient.js +166 -0
- package/dist/src/core/wechatClient.js.map +1 -0
- package/dist/src/services/chatService.d.ts +25 -0
- package/dist/src/services/chatService.d.ts.map +1 -0
- package/dist/src/services/chatService.js +291 -0
- package/dist/src/services/chatService.js.map +1 -0
- package/dist/src/services/configService.d.ts +43 -0
- package/dist/src/services/configService.d.ts.map +1 -0
- package/dist/src/services/configService.js +156 -0
- package/dist/src/services/configService.js.map +1 -0
- package/dist/src/services/exportService.d.ts +30 -0
- package/dist/src/services/exportService.d.ts.map +1 -0
- package/dist/src/services/exportService.js +273 -0
- package/dist/src/services/exportService.js.map +1 -0
- package/dist/src/services/wechat-formatter.d.ts +69 -0
- package/dist/src/services/wechat-formatter.d.ts.map +1 -0
- package/dist/src/services/wechat-formatter.js +248 -0
- package/dist/src/services/wechat-formatter.js.map +1 -0
- package/dist/src/services/wechatMessageService.d.ts +28 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -0
- package/dist/src/services/wechatMessageService.js +341 -0
- package/dist/src/services/wechatMessageService.js.map +1 -0
- package/dist/src/services/wereadService.d.ts +206 -0
- package/dist/src/services/wereadService.d.ts.map +1 -0
- package/dist/src/services/wereadService.js +145 -0
- package/dist/src/services/wereadService.js.map +1 -0
- package/dist/src/services/whitelistService.d.ts +20 -0
- package/dist/src/services/whitelistService.d.ts.map +1 -0
- package/dist/src/services/whitelistService.js +60 -0
- package/dist/src/services/whitelistService.js.map +1 -0
- package/dist/src/types.d.ts +140 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/errors.d.ts +25 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +43 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/pathUtils.d.ts +5 -0
- package/dist/src/utils/pathUtils.d.ts.map +1 -0
- package/dist/src/utils/pathUtils.js +16 -0
- package/dist/src/utils/pathUtils.js.map +1 -0
- package/dist/src/utils/pythonRunner.d.ts +27 -0
- package/dist/src/utils/pythonRunner.d.ts.map +1 -0
- package/dist/src/utils/pythonRunner.js +62 -0
- package/dist/src/utils/pythonRunner.js.map +1 -0
- package/dist/src/utils/talkerUtils.d.ts +14 -0
- package/dist/src/utils/talkerUtils.d.ts.map +1 -0
- package/dist/src/utils/talkerUtils.js +73 -0
- package/dist/src/utils/talkerUtils.js.map +1 -0
- package/mcp-server/index.ts +757 -0
- package/package.json +72 -0
- package/resources/key/win32/x64/wx_key.dll +0 -0
- package/resources/wcdb/win32/x64/SDL2.dll +0 -0
- package/resources/wcdb/win32/x64/WCDB.dll +0 -0
- package/resources/wcdb/win32/x64/msvcp140.dll +0 -0
- package/resources/wcdb/win32/x64/msvcp140_1.dll +0 -0
- package/resources/wcdb/win32/x64/vcruntime140.dll +0 -0
- package/resources/wcdb/win32/x64/vcruntime140_1.dll +0 -0
- package/resources/wcdb/win32/x64/wcdb_api.dll +0 -0
- package/scripts/_batch_link_sources.py +73 -0
- package/scripts/_utils.py +531 -0
- package/scripts/annual_report.py +796 -0
- package/scripts/auto_tag.py +128 -0
- package/scripts/biz_daily.py +896 -0
- package/scripts/chat_report.py +397 -0
- package/scripts/chat_stats.py +702 -0
- package/scripts/classify_daily.py +411 -0
- package/scripts/compile_wiki.py +258 -0
- package/scripts/create_reading_notes.py +370 -0
- package/scripts/enrich_backlinks.py +163 -0
- package/scripts/export_chat_html.py +766 -0
- package/scripts/extract_3x_key.py +86 -0
- package/scripts/extract_todos.py +404 -0
- package/scripts/fav_server.py +392 -0
- package/scripts/fix_topics.py +111 -0
- package/scripts/generate_ai_report.py +367 -0
- package/scripts/generate_html.py +1372 -0
- package/scripts/generate_review.py +170 -0
- package/scripts/mcp_bridge.py +398 -0
- package/scripts/nt_decrypt.py +562 -0
- package/scripts/pipeline.py +145 -0
- package/scripts/promote_all.py +310 -0
- package/scripts/promote_ideas.py +297 -0
- package/scripts/rag_chat.py +191 -0
- package/scripts/scan_decrypt_4x.py +329 -0
- package/scripts/semantic_search.py +431 -0
- package/scripts/sync_fav.py +146 -0
- package/scripts/sync_weread.py +192 -0
- package/scripts/vault_rag.py +139 -0
- package/scripts/vault_search.py +141 -0
- package/src/core/dbPathService.ts +348 -0
- package/src/core/keyService.ts +409 -0
- package/src/core/ntCore.ts +224 -0
- package/src/core/sqlcipherCore.ts +764 -0
- package/src/core/wcdbCore.ts +4568 -0
- package/src/core/wechatClient.ts +204 -0
- package/src/lz4.d.ts +10 -0
- package/src/services/chatService.ts +296 -0
- package/src/services/configService.ts +197 -0
- package/src/services/exportService.ts +305 -0
- package/src/services/wechat-formatter.ts +348 -0
- package/src/services/wechatMessageService.ts +383 -0
- package/src/services/wereadService.ts +308 -0
- package/src/services/whitelistService.ts +72 -0
- package/src/types.ts +141 -0
- package/src/utils/errors.ts +42 -0
- package/src/utils/pathUtils.ts +16 -0
- package/src/utils/pythonRunner.ts +81 -0
- package/src/utils/talkerUtils.ts +84 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { WechatOCConfig, WechatLoginSession, WechatInboundMessage } from '../types.js';
|
|
2
|
+
export declare class WechatMessageService {
|
|
3
|
+
private client;
|
|
4
|
+
private config;
|
|
5
|
+
private loginSession;
|
|
6
|
+
private shutdownFlag;
|
|
7
|
+
private contextTokens;
|
|
8
|
+
private syncBuf;
|
|
9
|
+
private messageCallbacks;
|
|
10
|
+
constructor(config?: WechatOCConfig);
|
|
11
|
+
startLogin(): Promise<{
|
|
12
|
+
qrcodeUrl: string;
|
|
13
|
+
qrcodeContent: string;
|
|
14
|
+
}>;
|
|
15
|
+
pollQrStatus(): Promise<WechatLoginSession>;
|
|
16
|
+
waitForLogin(pollIntervalMs?: number): Promise<WechatLoginSession>;
|
|
17
|
+
startPolling(): Promise<void>;
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
sendText(userId: string, text: string): Promise<boolean>;
|
|
20
|
+
sendMedia(userId: string, filePath: string, mediaType: 'image' | 'video' | 'file'): Promise<boolean>;
|
|
21
|
+
sendImage(userId: string, imagePath: string): Promise<boolean>;
|
|
22
|
+
sendFile(userId: string, filePath: string, _fileName?: string): Promise<boolean>;
|
|
23
|
+
onMessage(callback: (msg: WechatInboundMessage) => void): void;
|
|
24
|
+
isLoggedIn(): boolean;
|
|
25
|
+
getAccountId(): string | null;
|
|
26
|
+
private parseInboundMessage;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=wechatMessageService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wechatMessageService.d.ts","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAA0B,MAAM,aAAa,CAAA;AAUnH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,gBAAgB,CAAiD;gBAE7D,MAAM,GAAE,cAAmB;IAajC,UAAU,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBnE,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkC3C,YAAY,CAAC,cAAc,SAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkChE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBxD,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GACpC,OAAO,CAAC,OAAO,CAAC;IAwFb,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtF,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,GAAG,IAAI;IAM9D,UAAU,IAAI,OAAO;IAIrB,YAAY,IAAI,MAAM,GAAG,IAAI;IAM7B,OAAO,CAAC,mBAAmB;CAuD5B"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 微信消息收发服务 — 通过 ilink API 桥接登录、收消息、发消息。
|
|
3
|
+
*
|
|
4
|
+
* 协议参考: AstrBot weixin_oc_adapter.py
|
|
5
|
+
*/
|
|
6
|
+
import crypto from 'crypto';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { WechatClient } from '../core/wechatClient.js';
|
|
9
|
+
import { configService } from './configService.js';
|
|
10
|
+
function sleep(ms) {
|
|
11
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12
|
+
}
|
|
13
|
+
function uuidHex() {
|
|
14
|
+
return crypto.randomUUID().replace(/-/g, '');
|
|
15
|
+
}
|
|
16
|
+
export class WechatMessageService {
|
|
17
|
+
client;
|
|
18
|
+
config;
|
|
19
|
+
loginSession = null;
|
|
20
|
+
shutdownFlag = false;
|
|
21
|
+
contextTokens = new Map();
|
|
22
|
+
syncBuf;
|
|
23
|
+
messageCallbacks = [];
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.syncBuf = config.syncBuf || '';
|
|
27
|
+
this.client = new WechatClient({
|
|
28
|
+
baseUrl: config.baseUrl,
|
|
29
|
+
cdnBaseUrl: config.cdnBaseUrl,
|
|
30
|
+
apiTimeoutMs: config.apiTimeoutMs,
|
|
31
|
+
token: config.token,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// ====== Login ======
|
|
35
|
+
async startLogin() {
|
|
36
|
+
const data = await this.client.requestJson('GET', 'ilink/bot/get_bot_qrcode', {
|
|
37
|
+
params: { bot_type: this.config.botType || '3' },
|
|
38
|
+
});
|
|
39
|
+
const qrcode = data.qrcode;
|
|
40
|
+
const qrcodeImgContent = data.qrcode_img_content;
|
|
41
|
+
this.loginSession = {
|
|
42
|
+
sessionKey: uuidHex(),
|
|
43
|
+
qrcode,
|
|
44
|
+
qrcodeImgContent,
|
|
45
|
+
startedAt: Date.now(),
|
|
46
|
+
status: 'wait',
|
|
47
|
+
};
|
|
48
|
+
return { qrcodeUrl: qrcode, qrcodeContent: qrcodeImgContent };
|
|
49
|
+
}
|
|
50
|
+
async pollQrStatus() {
|
|
51
|
+
if (!this.loginSession) {
|
|
52
|
+
throw new Error('未开始登录流程,请先调用 startLogin()');
|
|
53
|
+
}
|
|
54
|
+
const data = await this.client.requestJson('GET', 'ilink/bot/get_qrcode_status', {
|
|
55
|
+
params: { qrcode: this.loginSession.qrcode },
|
|
56
|
+
extraHeaders: { 'iLink-App-ClientVersion': '1' },
|
|
57
|
+
});
|
|
58
|
+
const status = data.status;
|
|
59
|
+
this.loginSession.status = status;
|
|
60
|
+
if (status === 'confirmed') {
|
|
61
|
+
this.loginSession.botToken = data.bot_token;
|
|
62
|
+
this.loginSession.accountId = data.ilink_bot_id;
|
|
63
|
+
this.loginSession.baseUrl = data.baseurl;
|
|
64
|
+
this.loginSession.userId = data.ilink_user_id;
|
|
65
|
+
// Persist token
|
|
66
|
+
if (this.loginSession.botToken) {
|
|
67
|
+
this.client.token = this.loginSession.botToken;
|
|
68
|
+
configService.set('wechatOcToken', this.loginSession.botToken);
|
|
69
|
+
}
|
|
70
|
+
if (this.loginSession.accountId) {
|
|
71
|
+
configService.set('wechatOcAccountId', this.loginSession.accountId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (status === 'expired') {
|
|
75
|
+
// qrcode expired — caller should retry startLogin()
|
|
76
|
+
}
|
|
77
|
+
return this.loginSession;
|
|
78
|
+
}
|
|
79
|
+
async waitForLogin(pollIntervalMs = 2000) {
|
|
80
|
+
let expiredCount = 0;
|
|
81
|
+
while (true) {
|
|
82
|
+
try {
|
|
83
|
+
const session = await this.pollQrStatus();
|
|
84
|
+
if (session.status === 'confirmed') {
|
|
85
|
+
return session;
|
|
86
|
+
}
|
|
87
|
+
if (session.status === 'expired') {
|
|
88
|
+
expiredCount++;
|
|
89
|
+
if (expiredCount >= 3) {
|
|
90
|
+
session.error = '二维码过期次数过多,请重新运行登录命令';
|
|
91
|
+
return session;
|
|
92
|
+
}
|
|
93
|
+
await this.startLogin();
|
|
94
|
+
console.log('二维码已过期,已获取新二维码,请重新扫码');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
// Timeout or network error — retry after interval
|
|
99
|
+
if (e.message?.includes('timeout')) {
|
|
100
|
+
// Expected: QR status poll times out, keep retrying
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.error(`轮询异常: ${e.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await sleep(pollIntervalMs);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ====== Message Polling ======
|
|
110
|
+
async startPolling() {
|
|
111
|
+
while (!this.shutdownFlag) {
|
|
112
|
+
try {
|
|
113
|
+
const data = await this.client.requestJson('POST', 'ilink/bot/getupdates', {
|
|
114
|
+
payload: {
|
|
115
|
+
base_info: { channel_version: 'astrbot' },
|
|
116
|
+
get_updates_buf: this.syncBuf,
|
|
117
|
+
},
|
|
118
|
+
tokenRequired: true,
|
|
119
|
+
timeoutMs: 40_000, // Long-poll: server will hold until message arrives
|
|
120
|
+
});
|
|
121
|
+
// ret/errcode may be absent on empty response (normal for long-poll timeout)
|
|
122
|
+
if (data.ret != null && data.ret !== 0 || data.errcode != null && data.errcode !== 0) {
|
|
123
|
+
console.error(`getupdates error: ret=${data.ret} errcode=${data.errcode} errmsg=${data.errmsg || 'unknown'}`);
|
|
124
|
+
if (data.errcode === -1 || data.errcode === 401) {
|
|
125
|
+
console.error('Token may have expired, please login again');
|
|
126
|
+
}
|
|
127
|
+
await sleep(5000);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (data.get_updates_buf) {
|
|
131
|
+
this.syncBuf = data.get_updates_buf;
|
|
132
|
+
configService.set('wechatOcSyncBuf', this.syncBuf);
|
|
133
|
+
}
|
|
134
|
+
const msgs = data.msgs || [];
|
|
135
|
+
for (const msg of msgs) {
|
|
136
|
+
if (this.shutdownFlag)
|
|
137
|
+
return;
|
|
138
|
+
const inbound = this.parseInboundMessage(msg);
|
|
139
|
+
if (inbound) {
|
|
140
|
+
for (const cb of this.messageCallbacks) {
|
|
141
|
+
try {
|
|
142
|
+
cb(inbound);
|
|
143
|
+
}
|
|
144
|
+
catch { }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
if (this.shutdownFlag)
|
|
151
|
+
return;
|
|
152
|
+
// Long-poll timeout is normal — server holds connection until message arrives
|
|
153
|
+
if (e.name === 'AbortError' || e.message?.includes('timeout')) {
|
|
154
|
+
// Restart poll immediately
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
console.error(`Polling error: ${e.message}`);
|
|
158
|
+
await sleep(5000);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async stop() {
|
|
163
|
+
this.shutdownFlag = true;
|
|
164
|
+
}
|
|
165
|
+
// ====== Send ======
|
|
166
|
+
async sendText(userId, text) {
|
|
167
|
+
if (!this.client.token)
|
|
168
|
+
return false;
|
|
169
|
+
const contextToken = this.contextTokens.get(userId);
|
|
170
|
+
if (!contextToken)
|
|
171
|
+
return false;
|
|
172
|
+
const result = await this.client.requestJson('POST', 'ilink/bot/sendmessage', {
|
|
173
|
+
payload: {
|
|
174
|
+
base_info: { channel_version: 'astrbot' },
|
|
175
|
+
msg: {
|
|
176
|
+
from_user_id: '',
|
|
177
|
+
to_user_id: userId,
|
|
178
|
+
client_id: uuidHex(),
|
|
179
|
+
message_type: 2,
|
|
180
|
+
message_state: 2,
|
|
181
|
+
context_token: contextToken,
|
|
182
|
+
item_list: [{ type: 1, text_item: { text } }],
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
tokenRequired: true,
|
|
186
|
+
});
|
|
187
|
+
return result.ret === 0 && result.errcode === 0;
|
|
188
|
+
}
|
|
189
|
+
async sendMedia(userId, filePath, mediaType) {
|
|
190
|
+
if (!this.client.token)
|
|
191
|
+
return false;
|
|
192
|
+
const contextToken = this.contextTokens.get(userId);
|
|
193
|
+
if (!contextToken)
|
|
194
|
+
return false;
|
|
195
|
+
const fs = await import('fs/promises');
|
|
196
|
+
const fileBuffer = await fs.readFile(filePath);
|
|
197
|
+
const fileName = path.basename(filePath);
|
|
198
|
+
const rawMD5 = crypto.createHash('md5').update(fileBuffer).digest('hex');
|
|
199
|
+
const rawSize = fileBuffer.length;
|
|
200
|
+
const fileKey = uuidHex();
|
|
201
|
+
const aesKeyHex = crypto.randomBytes(16).toString('hex');
|
|
202
|
+
const cipherSize = WechatClient.aesPaddedSize(rawSize);
|
|
203
|
+
const typeMap = {
|
|
204
|
+
image: { uploadMediaType: 1, itemType: 2 },
|
|
205
|
+
video: { uploadMediaType: 2, itemType: 5 },
|
|
206
|
+
file: { uploadMediaType: 3, itemType: 4 },
|
|
207
|
+
};
|
|
208
|
+
const { uploadMediaType, itemType } = typeMap[mediaType];
|
|
209
|
+
// Get upload URL
|
|
210
|
+
const uploadResult = await this.client.requestJson('POST', 'ilink/bot/getuploadurl', {
|
|
211
|
+
payload: {
|
|
212
|
+
filekey: fileKey,
|
|
213
|
+
media_type: uploadMediaType,
|
|
214
|
+
to_user_id: userId,
|
|
215
|
+
rawsize: rawSize,
|
|
216
|
+
rawfilemd5: rawMD5,
|
|
217
|
+
filesize: cipherSize,
|
|
218
|
+
aeskey: aesKeyHex,
|
|
219
|
+
no_need_thumb: true,
|
|
220
|
+
base_info: { channel_version: 'astrbot' },
|
|
221
|
+
},
|
|
222
|
+
tokenRequired: true,
|
|
223
|
+
});
|
|
224
|
+
if (uploadResult.ret !== 0 || uploadResult.errcode !== 0) {
|
|
225
|
+
console.error(`getuploadurl error: ${uploadResult.errmsg}`);
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
// Upload to CDN
|
|
229
|
+
const encryptedParam = await this.client.uploadToCdn(uploadResult.upload_full_url, uploadResult.upload_param, fileKey, aesKeyHex, fileBuffer);
|
|
230
|
+
// Build media item and send
|
|
231
|
+
const mediaPayload = {
|
|
232
|
+
encrypt_query_param: encryptedParam,
|
|
233
|
+
aes_key: Buffer.from(aesKeyHex, 'hex').toString('base64'),
|
|
234
|
+
encrypt_type: 1,
|
|
235
|
+
};
|
|
236
|
+
let itemList;
|
|
237
|
+
if (mediaType === 'image') {
|
|
238
|
+
itemList = [{ type: 2, image_item: { media: mediaPayload, mid_size: rawSize, aeskey: aesKeyHex } }];
|
|
239
|
+
}
|
|
240
|
+
else if (mediaType === 'file') {
|
|
241
|
+
itemList = [{ type: 4, file_item: { media: mediaPayload, file_name: fileName, len: rawSize } }];
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
itemList = [{ type: 5, video_item: { media: mediaPayload, video_size: rawSize } }];
|
|
245
|
+
}
|
|
246
|
+
const result = await this.client.requestJson('POST', 'ilink/bot/sendmessage', {
|
|
247
|
+
payload: {
|
|
248
|
+
base_info: { channel_version: 'astrbot' },
|
|
249
|
+
msg: {
|
|
250
|
+
from_user_id: '',
|
|
251
|
+
to_user_id: userId,
|
|
252
|
+
client_id: uuidHex(),
|
|
253
|
+
message_type: 2,
|
|
254
|
+
message_state: 2,
|
|
255
|
+
context_token: contextToken,
|
|
256
|
+
item_list: itemList,
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
tokenRequired: true,
|
|
260
|
+
});
|
|
261
|
+
return result.ret === 0 && result.errcode === 0;
|
|
262
|
+
}
|
|
263
|
+
async sendImage(userId, imagePath) {
|
|
264
|
+
return this.sendMedia(userId, imagePath, 'image');
|
|
265
|
+
}
|
|
266
|
+
async sendFile(userId, filePath, _fileName) {
|
|
267
|
+
return this.sendMedia(userId, filePath, 'file');
|
|
268
|
+
}
|
|
269
|
+
// ====== Callbacks ======
|
|
270
|
+
onMessage(callback) {
|
|
271
|
+
this.messageCallbacks.push(callback);
|
|
272
|
+
}
|
|
273
|
+
// ====== Status ======
|
|
274
|
+
isLoggedIn() {
|
|
275
|
+
return !!(this.client.token || this.config.token);
|
|
276
|
+
}
|
|
277
|
+
getAccountId() {
|
|
278
|
+
return this.config.accountId || null;
|
|
279
|
+
}
|
|
280
|
+
// ====== Private ======
|
|
281
|
+
parseInboundMessage(msg) {
|
|
282
|
+
const fromUserId = msg.from_user_id || '';
|
|
283
|
+
if (!fromUserId)
|
|
284
|
+
return null;
|
|
285
|
+
// Store context token for future replies
|
|
286
|
+
if (msg.context_token) {
|
|
287
|
+
this.contextTokens.set(fromUserId, msg.context_token);
|
|
288
|
+
}
|
|
289
|
+
const components = [];
|
|
290
|
+
const itemList = msg.item_list || [];
|
|
291
|
+
for (const item of itemList) {
|
|
292
|
+
const itemType = item.type;
|
|
293
|
+
if (itemType === 1 && item.text_item) {
|
|
294
|
+
components.push({ type: 'plain', text: item.text_item.text || '' });
|
|
295
|
+
}
|
|
296
|
+
else if (itemType === 2 && item.image_item) {
|
|
297
|
+
components.push({ type: 'image', filePath: '' }); // image download deferred
|
|
298
|
+
}
|
|
299
|
+
else if (itemType === 3 && item.voice_item) {
|
|
300
|
+
components.push({ type: 'record', filePath: '' });
|
|
301
|
+
}
|
|
302
|
+
else if (itemType === 4 && item.file_item) {
|
|
303
|
+
components.push({ type: 'file', name: item.file_item.file_name || '', filePath: '' });
|
|
304
|
+
}
|
|
305
|
+
else if (itemType === 5 && item.video_item) {
|
|
306
|
+
components.push({ type: 'video', filePath: '' });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Determine message kind
|
|
310
|
+
let messageKind = 'unknown';
|
|
311
|
+
if (itemList.length === 1) {
|
|
312
|
+
const t = itemList[0].type;
|
|
313
|
+
if (t === 1)
|
|
314
|
+
messageKind = 'text';
|
|
315
|
+
else if (t === 2)
|
|
316
|
+
messageKind = 'image';
|
|
317
|
+
else if (t === 3)
|
|
318
|
+
messageKind = 'voice';
|
|
319
|
+
else if (t === 4)
|
|
320
|
+
messageKind = 'file';
|
|
321
|
+
else if (t === 5)
|
|
322
|
+
messageKind = 'video';
|
|
323
|
+
}
|
|
324
|
+
const textComponents = components.filter(c => c.type === 'plain');
|
|
325
|
+
const messageStr = textComponents.map(c => c.text).join('');
|
|
326
|
+
return {
|
|
327
|
+
messageId: msg.client_id || uuidHex(),
|
|
328
|
+
fromUserId,
|
|
329
|
+
senderNickname: msg.from_user_id || '',
|
|
330
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
331
|
+
timestampMs: Date.now(),
|
|
332
|
+
components,
|
|
333
|
+
messageStr,
|
|
334
|
+
messageKind,
|
|
335
|
+
rawMessage: msg,
|
|
336
|
+
isReply: !!(msg.ref_msg),
|
|
337
|
+
quotedText: msg.ref_msg?.text || undefined,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=wechatMessageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wechatMessageService.js","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 微信读书 Agent API Gateway 封装
|
|
3
|
+
*
|
|
4
|
+
* 接口文档: ~/.claude/skills/weread-skills/
|
|
5
|
+
* Gateway: https://i.weread.qq.com/api/agent/gateway
|
|
6
|
+
*/
|
|
7
|
+
export interface WereadResult<T = any> {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
data?: T;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ShelfBook {
|
|
13
|
+
bookId: string;
|
|
14
|
+
title: string;
|
|
15
|
+
author: string;
|
|
16
|
+
cover: string;
|
|
17
|
+
category: string;
|
|
18
|
+
readUpdateTime: number;
|
|
19
|
+
finishReading: number;
|
|
20
|
+
updateTime: number;
|
|
21
|
+
secret: number;
|
|
22
|
+
isTop: boolean;
|
|
23
|
+
payType: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ShelfData {
|
|
26
|
+
books: ShelfBook[];
|
|
27
|
+
albums: any[];
|
|
28
|
+
mp: any;
|
|
29
|
+
archive: {
|
|
30
|
+
name: string;
|
|
31
|
+
bookIds: string[];
|
|
32
|
+
albumIds: string[];
|
|
33
|
+
}[];
|
|
34
|
+
bookCount: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ReadDetail {
|
|
37
|
+
baseTime: number;
|
|
38
|
+
readTimes: Record<string, number>;
|
|
39
|
+
readDays: number;
|
|
40
|
+
totalReadTime: number;
|
|
41
|
+
dayAverageReadTime: number;
|
|
42
|
+
compare?: number;
|
|
43
|
+
readLongest: {
|
|
44
|
+
book?: any;
|
|
45
|
+
albumInfo?: any;
|
|
46
|
+
readTime: number;
|
|
47
|
+
tags?: string[];
|
|
48
|
+
}[];
|
|
49
|
+
readStat: {
|
|
50
|
+
stat: string;
|
|
51
|
+
counts: string;
|
|
52
|
+
scheme?: string;
|
|
53
|
+
}[];
|
|
54
|
+
preferCategory: {
|
|
55
|
+
categoryId: number;
|
|
56
|
+
categoryTitle: string;
|
|
57
|
+
readingTime: number;
|
|
58
|
+
readingCount: number;
|
|
59
|
+
val: number;
|
|
60
|
+
}[];
|
|
61
|
+
preferCategoryWord?: string;
|
|
62
|
+
preferTime: number[];
|
|
63
|
+
preferTimeWord?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface NotebookItem {
|
|
66
|
+
bookId: string;
|
|
67
|
+
title: string;
|
|
68
|
+
author: string;
|
|
69
|
+
cover: string;
|
|
70
|
+
highlightCount: number;
|
|
71
|
+
noteCount: number;
|
|
72
|
+
bookmarkCount: number;
|
|
73
|
+
updateTime: number;
|
|
74
|
+
}
|
|
75
|
+
export interface NoteDetail {
|
|
76
|
+
bookId: string;
|
|
77
|
+
chapterUid: number;
|
|
78
|
+
chapterTitle: string;
|
|
79
|
+
markText: string;
|
|
80
|
+
content: string;
|
|
81
|
+
range: string;
|
|
82
|
+
createTime: number;
|
|
83
|
+
type: number;
|
|
84
|
+
}
|
|
85
|
+
export interface SearchResult {
|
|
86
|
+
bookId: string;
|
|
87
|
+
title: string;
|
|
88
|
+
author: string;
|
|
89
|
+
cover: string;
|
|
90
|
+
rating: number;
|
|
91
|
+
ratingCount: number;
|
|
92
|
+
category: string;
|
|
93
|
+
wordCount: string;
|
|
94
|
+
intro: string;
|
|
95
|
+
}
|
|
96
|
+
export interface BookInfo {
|
|
97
|
+
bookId: string;
|
|
98
|
+
title: string;
|
|
99
|
+
author: string;
|
|
100
|
+
cover: string;
|
|
101
|
+
rating: number;
|
|
102
|
+
ratingCount: number;
|
|
103
|
+
category: string;
|
|
104
|
+
wordCount: string;
|
|
105
|
+
intro: string;
|
|
106
|
+
publisher: string;
|
|
107
|
+
isbn: string;
|
|
108
|
+
totalWords: string;
|
|
109
|
+
format: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ChapterInfo {
|
|
112
|
+
bookId: string;
|
|
113
|
+
title: string;
|
|
114
|
+
chapters: {
|
|
115
|
+
chapterUid: number;
|
|
116
|
+
title: string;
|
|
117
|
+
level: number;
|
|
118
|
+
wordCount: number;
|
|
119
|
+
}[];
|
|
120
|
+
}
|
|
121
|
+
export interface BookReview {
|
|
122
|
+
reviewId: string;
|
|
123
|
+
content: string;
|
|
124
|
+
rating: number;
|
|
125
|
+
createTime: number;
|
|
126
|
+
user: {
|
|
127
|
+
name: string;
|
|
128
|
+
avatar: string;
|
|
129
|
+
};
|
|
130
|
+
likeCount: number;
|
|
131
|
+
}
|
|
132
|
+
export interface RecommendBook {
|
|
133
|
+
bookId: string;
|
|
134
|
+
title: string;
|
|
135
|
+
author: string;
|
|
136
|
+
cover: string;
|
|
137
|
+
rating: number;
|
|
138
|
+
intro: string;
|
|
139
|
+
}
|
|
140
|
+
export interface UserProfile {
|
|
141
|
+
vid: string;
|
|
142
|
+
name: string;
|
|
143
|
+
avatar: string;
|
|
144
|
+
gender: number;
|
|
145
|
+
totalReadTime: number;
|
|
146
|
+
totalReadDays: number;
|
|
147
|
+
totalBooks: number;
|
|
148
|
+
totalFinished: number;
|
|
149
|
+
totalNotes: number;
|
|
150
|
+
totalHighlights: number;
|
|
151
|
+
totalReviews: number;
|
|
152
|
+
}
|
|
153
|
+
export declare class WereadService {
|
|
154
|
+
private apiKey;
|
|
155
|
+
constructor(apiKey?: string);
|
|
156
|
+
private call;
|
|
157
|
+
/** 书架同步 */
|
|
158
|
+
shelf(): Promise<WereadResult<ShelfData>>;
|
|
159
|
+
/** 阅读统计: mode = weekly | monthly | annually | overall */
|
|
160
|
+
readData(mode?: string, baseTime?: number): Promise<WereadResult<ReadDetail>>;
|
|
161
|
+
/** 笔记列表: 获取用户的笔记本列表 */
|
|
162
|
+
notebooks(count?: number, lastSort?: number): Promise<WereadResult<{
|
|
163
|
+
books: NotebookItem[];
|
|
164
|
+
synckey: number;
|
|
165
|
+
}>>;
|
|
166
|
+
/** 某本书的划线 */
|
|
167
|
+
bookmarks(bookId: string, count?: number): Promise<WereadResult<{
|
|
168
|
+
updated: NoteDetail[];
|
|
169
|
+
removed: any[];
|
|
170
|
+
synckey: number;
|
|
171
|
+
}>>;
|
|
172
|
+
/** 某本书的热门划线 */
|
|
173
|
+
bestBookmarks(bookId: string, count?: number): Promise<WereadResult<{
|
|
174
|
+
chapters: any[];
|
|
175
|
+
}>>;
|
|
176
|
+
/** 搜索书籍 */
|
|
177
|
+
search(keyword: string, count?: number, scope?: string): Promise<WereadResult<{
|
|
178
|
+
books: SearchResult[];
|
|
179
|
+
}>>;
|
|
180
|
+
/** 书籍详情 */
|
|
181
|
+
bookInfo(bookId: string): Promise<WereadResult<BookInfo>>;
|
|
182
|
+
/** 章节目录 */
|
|
183
|
+
chapterInfo(bookId: string): Promise<WereadResult<ChapterInfo>>;
|
|
184
|
+
/** 阅读进度 */
|
|
185
|
+
getProgress(bookId: string): Promise<WereadResult<{
|
|
186
|
+
chapterUid: number;
|
|
187
|
+
chapterTitle: string;
|
|
188
|
+
progress: number;
|
|
189
|
+
}>>;
|
|
190
|
+
/** 书评 */
|
|
191
|
+
reviews(bookId: string, count?: number, sort?: string): Promise<WereadResult<{
|
|
192
|
+
reviews: BookReview[];
|
|
193
|
+
}>>;
|
|
194
|
+
/** 个性化推荐 */
|
|
195
|
+
recommend(count?: number): Promise<WereadResult<{
|
|
196
|
+
books: RecommendBook[];
|
|
197
|
+
}>>;
|
|
198
|
+
/** 相似推荐 */
|
|
199
|
+
similar(bookId: string, count?: number): Promise<WereadResult<{
|
|
200
|
+
books: RecommendBook[];
|
|
201
|
+
}>>;
|
|
202
|
+
/** 个人中心(聚合多个接口) */
|
|
203
|
+
profile(): Promise<WereadResult<UserProfile>>;
|
|
204
|
+
}
|
|
205
|
+
export declare const wereadService: WereadService;
|
|
206
|
+
//# sourceMappingURL=wereadService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wereadService.d.ts","sourceRoot":"","sources":["../../../src/services/wereadService.ts"],"names":[],"mappings":"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"}
|