wechaty-puppet-matrix 0.0.54 → 0.0.56
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/dist/cjs/src/engine-schema.d.ts +1 -0
- package/dist/cjs/src/engine-schema.d.ts.map +1 -1
- package/dist/cjs/src/matrix/messages/message-contact-card.d.ts +16 -0
- package/dist/cjs/src/matrix/messages/message-contact-card.d.ts.map +1 -0
- package/dist/cjs/src/matrix/messages/message-contact-card.js +25 -0
- package/dist/cjs/src/matrix/messages/message-emotion.d.ts +7 -0
- package/dist/cjs/src/matrix/messages/message-emotion.d.ts.map +1 -1
- package/dist/cjs/src/matrix/messages/message-emotion.js +20 -0
- package/dist/cjs/src/matrix/messages/message-image.d.ts +8 -0
- package/dist/cjs/src/matrix/messages/message-image.d.ts.map +1 -1
- package/dist/cjs/src/matrix/messages/message-image.js +38 -2
- package/dist/cjs/src/matrix/messages/message-image.spec.d.ts +3 -0
- package/dist/cjs/src/matrix/messages/message-image.spec.d.ts.map +1 -0
- package/dist/cjs/src/matrix/messages/message-image.spec.js +66 -0
- package/dist/cjs/src/matrix/messages/message-video.d.ts +6 -0
- package/dist/cjs/src/matrix/messages/message-video.d.ts.map +1 -1
- package/dist/cjs/src/matrix/messages/message-video.js +20 -0
- package/dist/cjs/src/matrix/messages/message-video.spec.d.ts +3 -0
- package/dist/cjs/src/matrix/messages/message-video.spec.d.ts.map +1 -0
- package/dist/cjs/src/matrix/messages/message-video.spec.js +27 -0
- package/dist/cjs/src/matrix/service/request.d.ts +21 -0
- package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
- package/dist/cjs/src/matrix/service/request.js +194 -32
- package/dist/cjs/src/matrix/utils/file-type.d.ts +4 -0
- package/dist/cjs/src/matrix/utils/file-type.d.ts.map +1 -0
- package/dist/cjs/src/matrix/utils/file-type.js +55 -0
- package/dist/cjs/src/matrix/utils/file-type.spec.d.ts +3 -0
- package/dist/cjs/src/matrix/utils/file-type.spec.d.ts.map +1 -0
- package/dist/cjs/src/matrix/utils/file-type.spec.js +25 -0
- package/dist/cjs/src/puppet-matrix.d.ts +3 -0
- package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
- package/dist/cjs/src/puppet-matrix.js +121 -33
- package/dist/esm/src/engine-schema.d.ts +1 -0
- package/dist/esm/src/engine-schema.d.ts.map +1 -1
- package/dist/esm/src/matrix/messages/message-contact-card.d.ts +16 -0
- package/dist/esm/src/matrix/messages/message-contact-card.d.ts.map +1 -0
- package/dist/esm/src/matrix/messages/message-contact-card.js +22 -0
- package/dist/esm/src/matrix/messages/message-emotion.d.ts +7 -0
- package/dist/esm/src/matrix/messages/message-emotion.d.ts.map +1 -1
- package/dist/esm/src/matrix/messages/message-emotion.js +19 -0
- package/dist/esm/src/matrix/messages/message-image.d.ts +8 -0
- package/dist/esm/src/matrix/messages/message-image.d.ts.map +1 -1
- package/dist/esm/src/matrix/messages/message-image.js +37 -2
- package/dist/esm/src/matrix/messages/message-image.spec.d.ts +3 -0
- package/dist/esm/src/matrix/messages/message-image.spec.d.ts.map +1 -0
- package/dist/esm/src/matrix/messages/message-image.spec.js +64 -0
- package/dist/esm/src/matrix/messages/message-video.d.ts +6 -0
- package/dist/esm/src/matrix/messages/message-video.d.ts.map +1 -1
- package/dist/esm/src/matrix/messages/message-video.js +19 -0
- package/dist/esm/src/matrix/messages/message-video.spec.d.ts +3 -0
- package/dist/esm/src/matrix/messages/message-video.spec.d.ts.map +1 -0
- package/dist/esm/src/matrix/messages/message-video.spec.js +25 -0
- package/dist/esm/src/matrix/service/request.d.ts +21 -0
- package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
- package/dist/esm/src/matrix/service/request.js +193 -32
- package/dist/esm/src/matrix/utils/file-type.d.ts +4 -0
- package/dist/esm/src/matrix/utils/file-type.d.ts.map +1 -0
- package/dist/esm/src/matrix/utils/file-type.js +47 -0
- package/dist/esm/src/matrix/utils/file-type.spec.d.ts +3 -0
- package/dist/esm/src/matrix/utils/file-type.spec.d.ts.map +1 -0
- package/dist/esm/src/matrix/utils/file-type.spec.js +23 -0
- package/dist/esm/src/puppet-matrix.d.ts +3 -0
- package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
- package/dist/esm/src/puppet-matrix.js +121 -33
- package/package.json +1 -1
- package/src/engine-schema.ts +1 -0
- package/src/matrix/messages/message-contact-card.ts +48 -0
- package/src/matrix/messages/message-emotion.ts +36 -0
- package/src/matrix/messages/message-image.spec.ts +107 -0
- package/src/matrix/messages/message-image.ts +63 -2
- package/src/matrix/messages/message-video.spec.ts +37 -0
- package/src/matrix/messages/message-video.ts +28 -1
- package/src/matrix/service/request.ts +274 -32
- package/src/matrix/utils/file-type.spec.ts +29 -0
- package/src/matrix/utils/file-type.ts +59 -0
- package/src/puppet-matrix.ts +150 -35
|
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.FriendshipType = exports.WechatMessageType = exports.NotifyTypeEnum = void 0;
|
|
40
|
+
exports.parseSizeMismatch = parseSizeMismatch;
|
|
40
41
|
const axios_1 = __importDefault(require("axios"));
|
|
41
42
|
const wechaty_puppet_1 = require("@juzi/wechaty-puppet");
|
|
42
43
|
const events_1 = require("events");
|
|
@@ -136,6 +137,10 @@ var WechatMessageType;
|
|
|
136
137
|
WechatMessageType[WechatMessageType["Sys"] = 10000] = "Sys";
|
|
137
138
|
WechatMessageType[WechatMessageType["SysTemplate"] = 10002] = "SysTemplate";
|
|
138
139
|
})(WechatMessageType || (exports.WechatMessageType = WechatMessageType = {}));
|
|
140
|
+
function parseSizeMismatch(errmsg) {
|
|
141
|
+
const match = typeof errmsg === 'string' ? errmsg.match(/size differs: expected \d+, got (\d+)/) : null;
|
|
142
|
+
return match && Number(match[1]) > 0 ? match[1] : undefined;
|
|
143
|
+
}
|
|
139
144
|
var FriendshipType;
|
|
140
145
|
(function (FriendshipType) {
|
|
141
146
|
FriendshipType[FriendshipType["Unknown"] = 0] = "Unknown";
|
|
@@ -366,6 +371,12 @@ const genImageSnsXml = (wxid, contentDesc, mediaList, location) => {
|
|
|
366
371
|
</TimelineObject>`;
|
|
367
372
|
return xmlTemplate;
|
|
368
373
|
};
|
|
374
|
+
function pickClientMsgId(res) {
|
|
375
|
+
const item = res?.list?.[0] || res;
|
|
376
|
+
const v = item?.clientMsgId ?? item?.client_msg_id ?? item?.clientMsgid;
|
|
377
|
+
const n = typeof v === 'string' ? parseInt(v, 10) : v;
|
|
378
|
+
return typeof n === 'number' && !isNaN(n) ? n : undefined;
|
|
379
|
+
}
|
|
369
380
|
class Client extends events_1.EventEmitter {
|
|
370
381
|
options;
|
|
371
382
|
connectionStatus = { status: 'disconnected' };
|
|
@@ -1341,6 +1352,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1341
1352
|
});
|
|
1342
1353
|
return {
|
|
1343
1354
|
id: res?.list?.[0].newMsgId || '',
|
|
1355
|
+
clientMsgId: pickClientMsgId(res),
|
|
1344
1356
|
timeStamp: res?.list?.[0].createTime || '',
|
|
1345
1357
|
msgType: res?.list?.[0].type || '',
|
|
1346
1358
|
talkerId: selfId || '',
|
|
@@ -1366,6 +1378,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1366
1378
|
});
|
|
1367
1379
|
return {
|
|
1368
1380
|
id: res?.list?.[0].newMsgId || '',
|
|
1381
|
+
clientMsgId: pickClientMsgId(res),
|
|
1369
1382
|
timeStamp: res?.list?.[0].createTime || '',
|
|
1370
1383
|
msgType: res?.list?.[0].type || '',
|
|
1371
1384
|
talkerId: selfId || '',
|
|
@@ -1388,8 +1401,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1388
1401
|
},
|
|
1389
1402
|
});
|
|
1390
1403
|
}
|
|
1391
|
-
async retryDownload(fn) {
|
|
1392
|
-
const maxRetries = 5;
|
|
1404
|
+
async retryDownload(fn, maxRetries = 5) {
|
|
1393
1405
|
const delayMs = 5000;
|
|
1394
1406
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
1395
1407
|
try {
|
|
@@ -1398,6 +1410,9 @@ class Client extends events_1.EventEmitter {
|
|
|
1398
1410
|
return res;
|
|
1399
1411
|
}
|
|
1400
1412
|
wechaty_puppet_1.log.warn(PRE, 'download attempt %d/%d failed (no url in response): %s', attempt, maxRetries, JSON.stringify(res));
|
|
1413
|
+
if (parseSizeMismatch(res?.errmsg)) {
|
|
1414
|
+
return res;
|
|
1415
|
+
}
|
|
1401
1416
|
}
|
|
1402
1417
|
catch (e) {
|
|
1403
1418
|
wechaty_puppet_1.log.warn(PRE, 'download attempt %d/%d error: %s', attempt, maxRetries, e);
|
|
@@ -1408,21 +1423,51 @@ class Client extends events_1.EventEmitter {
|
|
|
1408
1423
|
}
|
|
1409
1424
|
return null;
|
|
1410
1425
|
}
|
|
1426
|
+
async cdnDownloadWithFallback(label, baseParams, candidates) {
|
|
1427
|
+
const queue = [...candidates];
|
|
1428
|
+
const tried = new Set();
|
|
1429
|
+
const retriesPerCandidate = candidates.length > 1 ? 2 : 5;
|
|
1430
|
+
while (queue.length) {
|
|
1431
|
+
const candidate = queue.shift();
|
|
1432
|
+
const key = `${candidate.file_id}|${candidate.file_size}|${candidate.aes_key || ''}`;
|
|
1433
|
+
if (!candidate.file_id || tried.has(key)) {
|
|
1434
|
+
continue;
|
|
1435
|
+
}
|
|
1436
|
+
tried.add(key);
|
|
1437
|
+
const params = {
|
|
1438
|
+
...baseParams,
|
|
1439
|
+
file_id: candidate.file_id,
|
|
1440
|
+
file_size: candidate.file_size,
|
|
1441
|
+
...(candidate.aes_key ? { aes_key: candidate.aes_key } : {}),
|
|
1442
|
+
};
|
|
1443
|
+
const res = await this.retryDownload(() => this.postData({ path: '/cloud/cdn_download', data: params }), retriesPerCandidate);
|
|
1444
|
+
if (res?.url) {
|
|
1445
|
+
if (tried.size > 1) {
|
|
1446
|
+
wechaty_puppet_1.log.info(PRE, '%s succeeded with fallback, file_size: %s', label, candidate.file_size);
|
|
1447
|
+
}
|
|
1448
|
+
return encodeURI(res.url) || '';
|
|
1449
|
+
}
|
|
1450
|
+
const actualSize = parseSizeMismatch(res?.errmsg);
|
|
1451
|
+
if (actualSize) {
|
|
1452
|
+
wechaty_puppet_1.log.warn(PRE, '%s size mismatch (xml %s, actual %s), retry with actual size', label, candidate.file_size, actualSize);
|
|
1453
|
+
queue.unshift({ ...candidate, file_size: actualSize });
|
|
1454
|
+
continue;
|
|
1455
|
+
}
|
|
1456
|
+
wechaty_puppet_1.log.warn(PRE, '%s candidate failed, params: %s', label, JSON.stringify(params));
|
|
1457
|
+
}
|
|
1458
|
+
wechaty_puppet_1.log.error(PRE, '%s failed for all candidates: %s', label, JSON.stringify(candidates));
|
|
1459
|
+
return '';
|
|
1460
|
+
}
|
|
1411
1461
|
async downloadImage(imageInfo) {
|
|
1412
|
-
const
|
|
1462
|
+
const candidates = imageInfo.candidates?.length
|
|
1463
|
+
? imageInfo.candidates
|
|
1464
|
+
: [{ file_id: imageInfo.file_id, file_size: imageInfo.file_size || '' }];
|
|
1465
|
+
return this.cdnDownloadWithFallback('downloadImage', {
|
|
1413
1466
|
log_response: true,
|
|
1414
1467
|
file_type: 2,
|
|
1415
|
-
file_id: imageInfo.file_id,
|
|
1416
1468
|
aes_key: imageInfo.aes_key,
|
|
1417
|
-
file_size: imageInfo.file_size,
|
|
1418
1469
|
file_name: `/微信图片_${(0, date_fns_1.format)(new Date(), 'yyyyMMddHHmmss')}.png`,
|
|
1419
|
-
};
|
|
1420
|
-
const res = await this.retryDownload(() => this.postData({ path: '/cloud/cdn_download', data: params }));
|
|
1421
|
-
if (res?.url) {
|
|
1422
|
-
return encodeURI(res.url) || '';
|
|
1423
|
-
}
|
|
1424
|
-
wechaty_puppet_1.log.error(PRE, 'downloadImage failed after %d retries, params: %s', 5, JSON.stringify(params));
|
|
1425
|
-
return '';
|
|
1470
|
+
}, candidates);
|
|
1426
1471
|
}
|
|
1427
1472
|
async downloadWWMedia(imageInfo, type) {
|
|
1428
1473
|
const typeNameMap = {
|
|
@@ -1446,20 +1491,12 @@ class Client extends events_1.EventEmitter {
|
|
|
1446
1491
|
return '';
|
|
1447
1492
|
}
|
|
1448
1493
|
async downloadFile(imageInfo) {
|
|
1449
|
-
|
|
1494
|
+
return this.cdnDownloadWithFallback('downloadFile', {
|
|
1450
1495
|
log_response: true,
|
|
1451
1496
|
file_type: 5,
|
|
1452
|
-
file_id: imageInfo.file_id.replace('@cdn_', ''),
|
|
1453
1497
|
aes_key: imageInfo.aes_key,
|
|
1454
|
-
file_size: imageInfo.file_size,
|
|
1455
1498
|
file_name: '/' + sanitizeFilename(imageInfo.file_name),
|
|
1456
|
-
};
|
|
1457
|
-
const res = await this.retryDownload(() => this.postData({ path: '/cloud/cdn_download', data: params }));
|
|
1458
|
-
if (res?.url) {
|
|
1459
|
-
return encodeURI(res.url) || '';
|
|
1460
|
-
}
|
|
1461
|
-
wechaty_puppet_1.log.error(PRE, 'downloadFile failed after %d retries, params: %s', 5, JSON.stringify(params));
|
|
1462
|
-
return '';
|
|
1499
|
+
}, [{ file_id: imageInfo.file_id.replace('@cdn_', ''), file_size: imageInfo.file_size || '' }]);
|
|
1463
1500
|
}
|
|
1464
1501
|
async downloadAudio(msgId, voiceInfo, roomId) {
|
|
1465
1502
|
const params = {
|
|
@@ -1537,19 +1574,14 @@ class Client extends events_1.EventEmitter {
|
|
|
1537
1574
|
return '';
|
|
1538
1575
|
}
|
|
1539
1576
|
async downloadVideo(videoInfo) {
|
|
1540
|
-
const
|
|
1577
|
+
const candidates = videoInfo.candidates?.length
|
|
1578
|
+
? videoInfo.candidates
|
|
1579
|
+
: [{ file_id: videoInfo.file_id, file_size: videoInfo.file_size }];
|
|
1580
|
+
return this.cdnDownloadWithFallback('downloadVideo', {
|
|
1541
1581
|
file_type: 4,
|
|
1542
|
-
file_id: videoInfo.file_id,
|
|
1543
1582
|
aes_key: videoInfo.aes_key,
|
|
1544
|
-
file_size: videoInfo.file_size,
|
|
1545
1583
|
file_name: `/微信视频_${(0, date_fns_1.format)(new Date(), 'yyyyMMddHHmmss')}.mp4`,
|
|
1546
|
-
};
|
|
1547
|
-
const res = await this.retryDownload(() => this.postData({ path: '/cloud/cdn_download', data: params }));
|
|
1548
|
-
if (res?.url) {
|
|
1549
|
-
return encodeURI(res.url) || '';
|
|
1550
|
-
}
|
|
1551
|
-
wechaty_puppet_1.log.error(PRE, 'downloadVideo failed after %d retries, params: %s', 5, JSON.stringify(params));
|
|
1552
|
-
return '';
|
|
1584
|
+
}, candidates);
|
|
1553
1585
|
}
|
|
1554
1586
|
async sendUrlImg(contactId, url, selfId) {
|
|
1555
1587
|
try {
|
|
@@ -1571,6 +1603,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1571
1603
|
});
|
|
1572
1604
|
return {
|
|
1573
1605
|
id: res?.newMsgId || '',
|
|
1606
|
+
clientMsgId: pickClientMsgId(res),
|
|
1574
1607
|
timeStamp: res?.createTime || '',
|
|
1575
1608
|
msgType: WechatMessageType.Image,
|
|
1576
1609
|
talkerId: selfId || '',
|
|
@@ -1604,6 +1637,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1604
1637
|
});
|
|
1605
1638
|
return {
|
|
1606
1639
|
id: res?.newMsgId || '',
|
|
1640
|
+
clientMsgId: pickClientMsgId(res),
|
|
1607
1641
|
timeStamp: res?.createTime || (0, date_fns_1.getUnixTime)(new Date()),
|
|
1608
1642
|
msgType: WechatMessageType.Video,
|
|
1609
1643
|
talkerId: selfId || '',
|
|
@@ -1635,6 +1669,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1635
1669
|
});
|
|
1636
1670
|
return {
|
|
1637
1671
|
id: res?.newMsgId || '',
|
|
1672
|
+
clientMsgId: pickClientMsgId(res),
|
|
1638
1673
|
timeStamp: res?.createTime || '',
|
|
1639
1674
|
msgType: WechatMessageType.File,
|
|
1640
1675
|
talkerId: selfId || '',
|
|
@@ -1662,6 +1697,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1662
1697
|
});
|
|
1663
1698
|
return {
|
|
1664
1699
|
id: res?.newMsgId || '',
|
|
1700
|
+
clientMsgId: pickClientMsgId(res),
|
|
1665
1701
|
timeStamp: res?.createTime || '',
|
|
1666
1702
|
msgType: WechatMessageType.Text,
|
|
1667
1703
|
talkerId: selfId || '',
|
|
@@ -1698,6 +1734,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1698
1734
|
});
|
|
1699
1735
|
return {
|
|
1700
1736
|
id: res?.newMsgId || '',
|
|
1737
|
+
clientMsgId: pickClientMsgId(res),
|
|
1701
1738
|
timeStamp: res?.createTime || '',
|
|
1702
1739
|
msgType: WechatMessageType.MiniProgram,
|
|
1703
1740
|
talkerId: selfId || '',
|
|
@@ -1724,6 +1761,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1724
1761
|
});
|
|
1725
1762
|
return {
|
|
1726
1763
|
id: res?.newMsgId || '',
|
|
1764
|
+
clientMsgId: pickClientMsgId(res),
|
|
1727
1765
|
timeStamp: res?.createTime || '',
|
|
1728
1766
|
msgType: WechatMessageType.App,
|
|
1729
1767
|
talkerId: selfId || '',
|
|
@@ -1878,6 +1916,7 @@ class Client extends events_1.EventEmitter {
|
|
|
1878
1916
|
});
|
|
1879
1917
|
return {
|
|
1880
1918
|
id: res?.newMsgId || '',
|
|
1919
|
+
clientMsgId: pickClientMsgId(res),
|
|
1881
1920
|
timeStamp: res?.createTime || '',
|
|
1882
1921
|
msgType: WechatMessageType.App,
|
|
1883
1922
|
talkerId: selfId || '',
|
|
@@ -1891,6 +1930,129 @@ class Client extends events_1.EventEmitter {
|
|
|
1891
1930
|
wechaty_puppet_1.log.error(PRE, 'sendContactCard(%s, %s): %s', contactId, xml, error);
|
|
1892
1931
|
}
|
|
1893
1932
|
}
|
|
1933
|
+
async sendContact({ toId, shareId, shareNickname, shareHeadImg, }, selfId) {
|
|
1934
|
+
try {
|
|
1935
|
+
const res = await this.postData({
|
|
1936
|
+
path: '/msg/send_share_card',
|
|
1937
|
+
data: {
|
|
1938
|
+
to_username: toId,
|
|
1939
|
+
share_username: shareId,
|
|
1940
|
+
share_nickname: shareNickname || '',
|
|
1941
|
+
share_head_img: shareHeadImg || '',
|
|
1942
|
+
},
|
|
1943
|
+
});
|
|
1944
|
+
return {
|
|
1945
|
+
id: res?.newMsgId || '',
|
|
1946
|
+
clientMsgId: pickClientMsgId(res),
|
|
1947
|
+
timeStamp: res?.createTime || '',
|
|
1948
|
+
msgType: WechatMessageType.ShareCard,
|
|
1949
|
+
talkerId: selfId || '',
|
|
1950
|
+
text: shareId,
|
|
1951
|
+
msg: shareId,
|
|
1952
|
+
fromWxid: (0, is_type_js_1.isRoomId)(toId) ? toId : '',
|
|
1953
|
+
listenerId: toId,
|
|
1954
|
+
};
|
|
1955
|
+
}
|
|
1956
|
+
catch (error) {
|
|
1957
|
+
wechaty_puppet_1.log.error(PRE, 'sendContact(%s, %s): %s', toId, shareId, error);
|
|
1958
|
+
}
|
|
1959
|
+
}
|
|
1960
|
+
async sendEmojiMd5(toId, md5, size, selfId) {
|
|
1961
|
+
try {
|
|
1962
|
+
const res = await this.postData({
|
|
1963
|
+
path: '/msg/send_emoji_md5',
|
|
1964
|
+
data: {
|
|
1965
|
+
to_username: toId,
|
|
1966
|
+
file_md5: md5,
|
|
1967
|
+
file_size: size,
|
|
1968
|
+
},
|
|
1969
|
+
});
|
|
1970
|
+
wechaty_puppet_1.log.verbose(PRE, 'sendEmojiMd5 res: %s', JSON.stringify(res));
|
|
1971
|
+
return this.emojiResult(res, toId, md5, selfId);
|
|
1972
|
+
}
|
|
1973
|
+
catch (error) {
|
|
1974
|
+
wechaty_puppet_1.log.error(PRE, 'sendEmojiMd5(%s, %s): %s', toId, md5, error);
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
async sendEmojiUrl(toId, url, selfId) {
|
|
1978
|
+
try {
|
|
1979
|
+
const res = await this.postData({
|
|
1980
|
+
path: '/msg/send_emoji_url',
|
|
1981
|
+
data: {
|
|
1982
|
+
to_username: toId,
|
|
1983
|
+
url,
|
|
1984
|
+
},
|
|
1985
|
+
});
|
|
1986
|
+
wechaty_puppet_1.log.verbose(PRE, 'sendEmojiUrl res: %s', JSON.stringify(res));
|
|
1987
|
+
return this.emojiResult(res, toId, url, selfId);
|
|
1988
|
+
}
|
|
1989
|
+
catch (error) {
|
|
1990
|
+
wechaty_puppet_1.log.error(PRE, 'sendEmojiUrl(%s, %s): %s', toId, url, error);
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1993
|
+
emojiResult(res, toId, text, selfId) {
|
|
1994
|
+
const item = res?.emojiItem?.[0] || res?.list?.[0] || res;
|
|
1995
|
+
const id = item?.newMsgId || item?.msgId;
|
|
1996
|
+
if (!id || (item?.ret !== undefined && item.ret !== 0)) {
|
|
1997
|
+
wechaty_puppet_1.log.warn(PRE, 'send emoji failed: %s', JSON.stringify(res));
|
|
1998
|
+
return;
|
|
1999
|
+
}
|
|
2000
|
+
return {
|
|
2001
|
+
clientMsgId: pickClientMsgId(item),
|
|
2002
|
+
fromWxid: (0, is_type_js_1.isRoomId)(toId) ? toId : '',
|
|
2003
|
+
id: String(id),
|
|
2004
|
+
listenerId: toId,
|
|
2005
|
+
msg: text,
|
|
2006
|
+
msgType: WechatMessageType.Emoticon,
|
|
2007
|
+
talkerId: selfId || '',
|
|
2008
|
+
text,
|
|
2009
|
+
timeStamp: item?.createTime || '',
|
|
2010
|
+
};
|
|
2011
|
+
}
|
|
2012
|
+
async sendPat(toId, pattedId) {
|
|
2013
|
+
try {
|
|
2014
|
+
const res = await this.postData({
|
|
2015
|
+
path: '/msg/send_pat',
|
|
2016
|
+
data: {
|
|
2017
|
+
to_username: toId,
|
|
2018
|
+
patted_username: pattedId,
|
|
2019
|
+
},
|
|
2020
|
+
});
|
|
2021
|
+
wechaty_puppet_1.log.verbose(PRE, 'sendPat res: %s', JSON.stringify(res));
|
|
2022
|
+
if (!res || res.errcode || (res.baseResponse?.ret !== undefined && res.baseResponse.ret !== 0)) {
|
|
2023
|
+
wechaty_puppet_1.log.warn(PRE, 'sendPat(%s, %s) failed: %s', toId, pattedId, JSON.stringify(res));
|
|
2024
|
+
return false;
|
|
2025
|
+
}
|
|
2026
|
+
return true;
|
|
2027
|
+
}
|
|
2028
|
+
catch (error) {
|
|
2029
|
+
wechaty_puppet_1.log.error(PRE, 'sendPat(%s, %s): %s', toId, pattedId, error);
|
|
2030
|
+
return false;
|
|
2031
|
+
}
|
|
2032
|
+
}
|
|
2033
|
+
async revokeMsg(toId, msgId, clientMsgId) {
|
|
2034
|
+
try {
|
|
2035
|
+
const res = await this.postData({
|
|
2036
|
+
path: '/msg/revoke_msg',
|
|
2037
|
+
data: {
|
|
2038
|
+
to_username: toId,
|
|
2039
|
+
msg_id: msgId,
|
|
2040
|
+
client_msg_id: clientMsgId || 0,
|
|
2041
|
+
},
|
|
2042
|
+
});
|
|
2043
|
+
wechaty_puppet_1.log.verbose(PRE, 'revokeMsg res: %s', JSON.stringify(res));
|
|
2044
|
+
const ret = res?.baseResponse?.ret;
|
|
2045
|
+
if (ret !== undefined && ret !== 0) {
|
|
2046
|
+
wechaty_puppet_1.log.warn(PRE, 'revokeMsg(%s, %s) failed: %s', toId, msgId, JSON.stringify(res?.baseResponse));
|
|
2047
|
+
return false;
|
|
2048
|
+
}
|
|
2049
|
+
return !!res;
|
|
2050
|
+
}
|
|
2051
|
+
catch (error) {
|
|
2052
|
+
wechaty_puppet_1.log.error(PRE, 'revokeMsg(%s, %s): %s', toId, msgId, error);
|
|
2053
|
+
return false;
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
1894
2056
|
async sendAnnouncement(roomId, content) {
|
|
1895
2057
|
try {
|
|
1896
2058
|
const res = await this.postData({
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function detectImageExt(head: Buffer): string | undefined;
|
|
2
|
+
export declare function fetchRemoteHead(url: string, bytes?: number, timeoutMs?: number): Promise<Buffer | undefined>;
|
|
3
|
+
export declare function replaceExt(fileName: string, ext: string): string;
|
|
4
|
+
//# sourceMappingURL=file-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-type.d.ts","sourceRoot":"","sources":["../../../../../src/matrix/utils/file-type.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0BhE;AAKD,wBAAsB,eAAe,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAa7G;AAKD,wBAAgB,UAAU,CAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectImageExt = detectImageExt;
|
|
7
|
+
exports.fetchRemoteHead = fetchRemoteHead;
|
|
8
|
+
exports.replaceExt = replaceExt;
|
|
9
|
+
const axios_1 = __importDefault(require("axios"));
|
|
10
|
+
function detectImageExt(head) {
|
|
11
|
+
if (head.length >= 3 && head[0] === 0xff && head[1] === 0xd8 && head[2] === 0xff) {
|
|
12
|
+
return 'jpg';
|
|
13
|
+
}
|
|
14
|
+
if (head.length >= 8 && head.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
|
|
15
|
+
return 'png';
|
|
16
|
+
}
|
|
17
|
+
if (head.length >= 6 && ['GIF87a', 'GIF89a'].includes(head.subarray(0, 6).toString('ascii'))) {
|
|
18
|
+
return 'gif';
|
|
19
|
+
}
|
|
20
|
+
if (head.length >= 12 && head.subarray(0, 4).toString('ascii') === 'RIFF' && head.subarray(8, 12).toString('ascii') === 'WEBP') {
|
|
21
|
+
return 'webp';
|
|
22
|
+
}
|
|
23
|
+
if (head.length >= 2 && head[0] === 0x42 && head[1] === 0x4d) {
|
|
24
|
+
return 'bmp';
|
|
25
|
+
}
|
|
26
|
+
if (head.length >= 12 && head.subarray(4, 8).toString('ascii') === 'ftyp') {
|
|
27
|
+
const brand = head.subarray(8, 12).toString('ascii');
|
|
28
|
+
if (['heic', 'heix', 'hevc', 'hevx', 'mif1', 'msf1'].includes(brand)) {
|
|
29
|
+
return 'heic';
|
|
30
|
+
}
|
|
31
|
+
if (['avif', 'avis'].includes(brand)) {
|
|
32
|
+
return 'avif';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
async function fetchRemoteHead(url, bytes = 32, timeoutMs = 5000) {
|
|
38
|
+
try {
|
|
39
|
+
const res = await axios_1.default.get(url, {
|
|
40
|
+
headers: { Range: `bytes=0-${bytes - 1}` },
|
|
41
|
+
responseType: 'arraybuffer',
|
|
42
|
+
timeout: timeoutMs,
|
|
43
|
+
maxContentLength: 50 * 1024 * 1024,
|
|
44
|
+
});
|
|
45
|
+
return Buffer.from(res.data).subarray(0, bytes);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function replaceExt(fileName, ext) {
|
|
52
|
+
const dot = fileName.lastIndexOf('.');
|
|
53
|
+
const base = dot > 0 ? fileName.slice(0, dot) : fileName;
|
|
54
|
+
return `${base}.${ext}`;
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-type.spec.d.ts","sourceRoot":"","sources":["../../../../../src/matrix/utils/file-type.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env -S node -r ts-node/register
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tstest_1 = require("tstest");
|
|
5
|
+
const file_type_js_1 = require("./file-type.js");
|
|
6
|
+
const hex = (s) => Buffer.from(s, 'hex');
|
|
7
|
+
(0, tstest_1.test)('detectImageExt recognizes common image headers', async (t) => {
|
|
8
|
+
t.equal((0, file_type_js_1.detectImageExt)(hex('ffd8fffe00104c61766335392e33372e')), 'jpg', 'jpeg');
|
|
9
|
+
t.equal((0, file_type_js_1.detectImageExt)(hex('89504e470d0a1a0a0000000d49484452')), 'png', 'png');
|
|
10
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.from('GIF89a......')), 'gif', 'gif');
|
|
11
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.concat([Buffer.from('RIFF'), hex('00000000'), Buffer.from('WEBPVP8 ')])), 'webp', 'webp');
|
|
12
|
+
t.equal((0, file_type_js_1.detectImageExt)(hex('424d000000000000')), 'bmp', 'bmp');
|
|
13
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.concat([hex('00000018'), Buffer.from('ftypheic'), hex('00000000')])), 'heic', 'heic');
|
|
14
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.concat([hex('0000001c'), Buffer.from('ftypavif'), hex('00000000')])), 'avif', 'avif');
|
|
15
|
+
});
|
|
16
|
+
(0, tstest_1.test)('detectImageExt returns undefined for unknown or short data', async (t) => {
|
|
17
|
+
t.equal((0, file_type_js_1.detectImageExt)(hex('0000001c667479706d703432')), undefined, 'mp4 is not an image');
|
|
18
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.from('<html>')), undefined, 'html');
|
|
19
|
+
t.equal((0, file_type_js_1.detectImageExt)(Buffer.alloc(0)), undefined, 'empty');
|
|
20
|
+
});
|
|
21
|
+
(0, tstest_1.test)('replaceExt replaces or appends extension', async (t) => {
|
|
22
|
+
t.equal((0, file_type_js_1.replaceExt)('微信图片_20261105234022.png', 'jpg'), '微信图片_20261105234022.jpg', 'replace');
|
|
23
|
+
t.equal((0, file_type_js_1.replaceExt)('image', 'gif'), 'image.gif', 'append');
|
|
24
|
+
t.equal((0, file_type_js_1.replaceExt)('.hidden', 'jpg'), '.hidden.jpg', 'dotfile');
|
|
25
|
+
});
|
|
@@ -62,6 +62,7 @@ declare class PuppetMatrix extends PUPPET.Puppet {
|
|
|
62
62
|
private _friendshipSearch;
|
|
63
63
|
private _findRoomIdForWxid;
|
|
64
64
|
messageContact(messageId: string): Promise<string>;
|
|
65
|
+
private _findFriendByCard;
|
|
65
66
|
messageChannel(messageId: string): Promise<PUPPET.payloads.Channel>;
|
|
66
67
|
messageFile(messageId: string): Promise<FileBoxInterface>;
|
|
67
68
|
messageImage(messageId: string): Promise<FileBoxInterface>;
|
|
@@ -76,6 +77,7 @@ declare class PuppetMatrix extends PUPPET.Puppet {
|
|
|
76
77
|
messageSendText(conversationId: string, text: string, mentionIdList?: string[]): Promise<string | void>;
|
|
77
78
|
messageSendUrl(conversationId: string, urlLinkPayload: PUPPET.payloads.UrlLink): Promise<string | void>;
|
|
78
79
|
messageSendPost(conversationId: string, postPayload: PUPPET.payloads.Post): Promise<void>;
|
|
80
|
+
sendPat(conversationId: string, contactId?: string): Promise<boolean>;
|
|
79
81
|
messageRecall(messageId: string): Promise<boolean>;
|
|
80
82
|
messageForward(toUserName: string, messageId: string): Promise<void>;
|
|
81
83
|
roomAdd(roomId: string, contactId: string): Promise<void>;
|
|
@@ -126,6 +128,7 @@ declare class PuppetMatrix extends PUPPET.Puppet {
|
|
|
126
128
|
private _stopPuppetHeart;
|
|
127
129
|
private _fileBoxFromUrl;
|
|
128
130
|
private _getMessageImageFileBox;
|
|
131
|
+
private _imageNameByHead;
|
|
129
132
|
private _getMessageAudioFileBox;
|
|
130
133
|
private _getMessageVideoFileBox;
|
|
131
134
|
private _getMessageFileFileBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppet-matrix.d.ts","sourceRoot":"","sources":["../../../src/puppet-matrix.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAKhD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGxE,OAAO,MAAM,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"puppet-matrix.d.ts","sourceRoot":"","sources":["../../../src/puppet-matrix.ts"],"names":[],"mappings":"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"}
|