@wu529778790/open-im 1.11.4-beta.18 → 1.11.4-beta.19

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.
@@ -262,39 +262,48 @@ async function extractImages(msg) {
262
262
  log.warn('Image item missing full_url/cdn_url');
263
263
  continue;
264
264
  }
265
- // AES key: aeskey 字段是 32 字符 hex(16 字节),需要直接用作 AES-128-CBC key
266
- const aesKeyHex = imageItem?.aeskey;
267
265
  try {
268
- // Download from CDN
266
+ // 直接从 full_url 下载图片(CDN 返回的是已解密的图片数据)
269
267
  const response = await fetch(imageUrl, { signal: AbortSignal.timeout(30_000) });
270
268
  if (!response.ok) {
271
269
  log.warn(`Image download failed: HTTP ${response.status}`);
272
270
  continue;
273
271
  }
274
272
  const buffer = Buffer.from(await response.arrayBuffer());
275
- // 解密:aeskey 是 hex 编码的 16 字节密钥,用 AES-128-CBC 解密
276
- let decrypted;
277
- if (aesKeyHex && aesKeyHex.length === 32) {
278
- try {
279
- const keyBuf = Buffer.from(aesKeyHex, 'hex');
280
- const iv = keyBuf.subarray(0, 16);
281
- const decipher = createDecipheriv('aes-128-cbc', keyBuf, iv);
282
- decrypted = Buffer.concat([decipher.update(buffer), decipher.final()]);
283
- }
284
- catch {
285
- log.info('AES-128 decryption failed, using raw image data');
286
- decrypted = buffer;
287
- }
273
+ // 检查是否是有效图片
274
+ const first4 = buffer.subarray(0, 4).toString('hex');
275
+ const isJpeg = first4 === 'ffd8ffe0' || first4 === 'ffd8ffe1';
276
+ const isPng = first4 === '89504e47';
277
+ let finalBuffer;
278
+ if (isJpeg || isPng) {
279
+ // CDN 返回的是有效图片,直接使用
280
+ finalBuffer = buffer;
288
281
  }
289
282
  else {
290
- decrypted = buffer;
283
+ // CDN 返回的是加密数据,尝试解密
284
+ const aesKeyHex = imageItem?.aeskey;
285
+ if (aesKeyHex && aesKeyHex.length === 32) {
286
+ try {
287
+ const keyBuf = Buffer.from(aesKeyHex, 'hex');
288
+ const iv = keyBuf.subarray(0, 16);
289
+ const decipher = createDecipheriv('aes-128-cbc', keyBuf, iv);
290
+ finalBuffer = Buffer.concat([decipher.update(buffer), decipher.final()]);
291
+ }
292
+ catch {
293
+ log.info('AES decryption failed, using raw image data');
294
+ finalBuffer = buffer;
295
+ }
296
+ }
297
+ else {
298
+ finalBuffer = buffer;
299
+ }
291
300
  }
292
301
  // Save to disk
293
302
  const targetPath = createMediaTargetPath('.jpg', `clawbot-${Date.now()}`);
294
303
  const { writeFile } = await import('node:fs/promises');
295
304
  const { mkdir } = await import('node:fs/promises');
296
305
  await mkdir('/tmp/t/open-im-images', { recursive: true });
297
- await writeFile(targetPath, decrypted);
306
+ await writeFile(targetPath, finalBuffer);
298
307
  paths.push(targetPath);
299
308
  log.info(`ClawBot image saved: ${targetPath}`);
300
309
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wu529778790/open-im",
3
- "version": "1.11.4-beta.18",
3
+ "version": "1.11.4-beta.19",
4
4
  "description": "Your AI coding assistant, in every chat app. Multi-platform IM bridge for Claude Code, Codex, and CodeBuddy.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",