wechaty-puppet-matrix 0.0.55 → 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/service/request.d.ts +12 -0
- package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
- package/dist/cjs/src/matrix/service/request.js +138 -0
- package/dist/cjs/src/puppet-matrix.d.ts +2 -0
- package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
- package/dist/cjs/src/puppet-matrix.js +105 -32
- 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/service/request.d.ts +12 -0
- package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
- package/dist/esm/src/matrix/service/request.js +138 -0
- package/dist/esm/src/puppet-matrix.d.ts +2 -0
- package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
- package/dist/esm/src/puppet-matrix.js +105 -32
- 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/service/request.ts +189 -0
- package/src/puppet-matrix.ts +130 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppet-matrix.d.ts","sourceRoot":"","sources":["../../../src/puppet-matrix.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"puppet-matrix.d.ts","sourceRoot":"","sources":["../../../src/puppet-matrix.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { parseImageMessagePayload } from './matrix/messages/message-image.js';
|
|
|
17
17
|
import { parseAudioMessagePayload } from './matrix/messages/message-audio.js';
|
|
18
18
|
import { parseVideoMessagePayload } from './matrix/messages/message-video.js';
|
|
19
19
|
import { parseLocationMessagePayload } from './matrix/messages/message-location.js';
|
|
20
|
+
import { parseContactCardMessagePayload } from './matrix/messages/message-contact-card.js';
|
|
20
21
|
import { CachedPromiseFunc } from './matrix/utils/cached-promise.js';
|
|
21
22
|
import { engineMessageToWechaty } from './matrix/schema-mapper/message.js';
|
|
22
23
|
import { engineContactToWechaty } from './matrix/schema-mapper/contact.js';
|
|
@@ -24,7 +25,6 @@ import { chatRoomMemberToContact, engineRoomMemberToWechaty, engineRoomToWechaty
|
|
|
24
25
|
import { parseEvent, EventType } from './matrix/events/mod.js';
|
|
25
26
|
import { addRunningPuppet, removeRunningPuppet } from './cleanup.js';
|
|
26
27
|
import { packageJson } from './package-json.js';
|
|
27
|
-
import { JsonToXml } from './matrix/utils/xml-to-json.js';
|
|
28
28
|
const VERSION = packageJson.version || '0.0.0';
|
|
29
29
|
const PRE = '[PuppetMatrix]';
|
|
30
30
|
const SEARCH_CONTACT_PREFIX = '$search$-';
|
|
@@ -521,7 +521,7 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
521
521
|
hello = option.hello;
|
|
522
522
|
}
|
|
523
523
|
}
|
|
524
|
-
await this._client?.addFriendByWxid({ content: hello, ticket, scene: addContactScene, wxid: contactId });
|
|
524
|
+
await this._client?.addFriendByWxid({ content: hello, ticket, scene: addContactScene, wxid: cachedContactSearch?.wxid || contactId });
|
|
525
525
|
}
|
|
526
526
|
async friendshipSearchPhone(phone) {
|
|
527
527
|
return this._friendshipSearch(phone, '15');
|
|
@@ -558,7 +558,58 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
558
558
|
}
|
|
559
559
|
async messageContact(messageId) {
|
|
560
560
|
log.verbose('PuppetWeChat', 'messageContact(%s)', messageId);
|
|
561
|
-
|
|
561
|
+
const rawPayload = await this.messageRawPayload(messageId);
|
|
562
|
+
if (rawPayload.msgType !== WechatMessageType.ShareCard) {
|
|
563
|
+
throw new Error(`message ${messageId} is not a contact card`);
|
|
564
|
+
}
|
|
565
|
+
const card = await parseContactCardMessagePayload(rawPayload.msg);
|
|
566
|
+
if (!card) {
|
|
567
|
+
throw new Error(`can not parse contact card from message ${messageId}`);
|
|
568
|
+
}
|
|
569
|
+
if (!card.username.includes(STRANGER_SUFFIX)) {
|
|
570
|
+
return card.username;
|
|
571
|
+
}
|
|
572
|
+
const friendId = await this._findFriendByCard(card);
|
|
573
|
+
if (friendId) {
|
|
574
|
+
log.verbose(PRE, 'messageContact(%s) matched friend %s', messageId, friendId);
|
|
575
|
+
return friendId;
|
|
576
|
+
}
|
|
577
|
+
const searchId = `${SEARCH_CONTACT_PREFIX}${card.username}`;
|
|
578
|
+
await this._cacheMgr.setContactSearch(searchId, {
|
|
579
|
+
alias: '',
|
|
580
|
+
avatar: card.avatar,
|
|
581
|
+
city: card.city,
|
|
582
|
+
country: '',
|
|
583
|
+
isFriend: 0,
|
|
584
|
+
name: card.nickname,
|
|
585
|
+
province: card.province,
|
|
586
|
+
scene: card.scene,
|
|
587
|
+
sex: card.sex,
|
|
588
|
+
sign: card.sign,
|
|
589
|
+
ticket: card.antispamticket,
|
|
590
|
+
wxNum: card.alias,
|
|
591
|
+
wxid: card.username,
|
|
592
|
+
});
|
|
593
|
+
return searchId;
|
|
594
|
+
}
|
|
595
|
+
async _findFriendByCard(card) {
|
|
596
|
+
const avatarKey = (url) => (url || '').replace(/^https?:\/\//, '').replace(/\/\d+$/, '');
|
|
597
|
+
const cardAvatar = avatarKey(card.avatar);
|
|
598
|
+
const contacts = (await this._cacheMgr.getAllContacts())
|
|
599
|
+
.filter(c => c.wxid && !isRoomId(c.wxid) && !c.wxid.includes(STRANGER_SUFFIX) && c.isFriend !== 0);
|
|
600
|
+
if (cardAvatar) {
|
|
601
|
+
const byAvatar = contacts.find(c => avatarKey(c.avatar) === cardAvatar);
|
|
602
|
+
if (byAvatar) {
|
|
603
|
+
return byAvatar.wxid;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
if (card.nickname) {
|
|
607
|
+
const byName = contacts.filter(c => c.name === card.nickname);
|
|
608
|
+
if (byName.length === 1) {
|
|
609
|
+
return byName[0].wxid;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return undefined;
|
|
562
613
|
}
|
|
563
614
|
async messageChannel(messageId) {
|
|
564
615
|
log.verbose('PuppetService', 'messageChannel(%s)', messageId);
|
|
@@ -597,12 +648,20 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
597
648
|
return this._getMessageFileFileBox(messageId, messagePayload);
|
|
598
649
|
case PUPPET.types.Message.Emoticon: {
|
|
599
650
|
const emotionPayload = await parseEmotionMessagePayload(messagePayload);
|
|
600
|
-
const
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
651
|
+
const url = emotionPayload.is_ww
|
|
652
|
+
? (await this._client?.downloadWWMedia({
|
|
653
|
+
aes_key: emotionPayload.aeskey || '',
|
|
654
|
+
auth_key: emotionPayload.authkey || '',
|
|
655
|
+
file_id: emotionPayload.cdnurl || '',
|
|
656
|
+
file_name: `message-${messageId}-emoticon.gif`,
|
|
657
|
+
}, 3)) || ''
|
|
658
|
+
: emotionPayload.cdnurl;
|
|
659
|
+
if (!url) {
|
|
660
|
+
throw new Error(`Can not get emoticon url for message: ${messageId}`);
|
|
661
|
+
}
|
|
662
|
+
const head = await fetchRemoteHead(url);
|
|
663
|
+
const ext = (head && detectImageExt(head)) || (emotionPayload.type === 2 && !emotionPayload.game ? 'gif' : 'png');
|
|
664
|
+
const emoticonBox = FileBox.fromUrl(url, { name: `message-${messageId}-emoticon.${ext}` });
|
|
606
665
|
emoticonBox.metadata = {
|
|
607
666
|
payload: emotionPayload,
|
|
608
667
|
type: 'emoticon',
|
|
@@ -737,28 +796,14 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
737
796
|
}
|
|
738
797
|
}
|
|
739
798
|
async messageSendContact(toUserId, contactId) {
|
|
740
|
-
log.verbose('PuppetWeChat', '
|
|
799
|
+
log.verbose('PuppetWeChat', 'messageSendContact("%s", %s)', toUserId, contactId);
|
|
741
800
|
const contactPayload = await this.contactRawPayload(contactId);
|
|
742
|
-
const
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
city: contactPayload?.city,
|
|
749
|
-
fullpy: contactPayload?.name,
|
|
750
|
-
imagestatus: '3',
|
|
751
|
-
nickname: contactPayload?.name,
|
|
752
|
-
province: contactPayload?.province,
|
|
753
|
-
regionCode: 'CN_Shanghai',
|
|
754
|
-
scene: '17',
|
|
755
|
-
sex: contactPayload?.sex,
|
|
756
|
-
smallheadimgurl: contactPayload?.avatar,
|
|
757
|
-
username: contactPayload?.ticket,
|
|
758
|
-
},
|
|
759
|
-
};
|
|
760
|
-
const xml = JsonToXml(xmlObj);
|
|
761
|
-
const res = await this._client?.sendContactCard(toUserId, xml, this._self?.wxid);
|
|
801
|
+
const res = await this._client?.sendContact({
|
|
802
|
+
shareHeadImg: contactPayload?.avatar,
|
|
803
|
+
shareId: contactPayload?.wxid || contactId,
|
|
804
|
+
shareNickname: contactPayload?.name,
|
|
805
|
+
toId: toUserId,
|
|
806
|
+
}, this._self?.wxid);
|
|
762
807
|
if (res) {
|
|
763
808
|
await this._cacheMgr?.setMessage(res.id, res);
|
|
764
809
|
return res.id;
|
|
@@ -771,7 +816,16 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
771
816
|
: path.extname(fileBox.name);
|
|
772
817
|
const fileUrl = fileBox.remoteUrl || '';
|
|
773
818
|
if (metadata.type === 'emoticon') {
|
|
774
|
-
|
|
819
|
+
const emoji = metadata.payload;
|
|
820
|
+
const byMd5 = emoji?.md5 && emoji.len
|
|
821
|
+
? await this._client?.sendEmojiMd5(conversationId, emoji.md5, emoji.len, this._self?.wxid)
|
|
822
|
+
: undefined;
|
|
823
|
+
const msgInfo = byMd5 || (fileUrl ? await this._client?.sendEmojiUrl(conversationId, fileUrl, this._self?.wxid) : undefined);
|
|
824
|
+
if (!msgInfo) {
|
|
825
|
+
throw new Error(`send emoticon failed: ${fileBox.name}`);
|
|
826
|
+
}
|
|
827
|
+
await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
|
|
828
|
+
return msgInfo.id;
|
|
775
829
|
}
|
|
776
830
|
else if (fileBox.mediaType.startsWith('image/')) {
|
|
777
831
|
if (fileUrl) {
|
|
@@ -876,8 +930,27 @@ class PuppetMatrix extends PUPPET.Puppet {
|
|
|
876
930
|
throw new Error(`Wrong Post!!! please check your Post payload to make sure it right ${conversationId}`);
|
|
877
931
|
}
|
|
878
932
|
}
|
|
933
|
+
async sendPat(conversationId, contactId) {
|
|
934
|
+
log.verbose(PRE, 'sendPat(%s, %s)', conversationId, contactId);
|
|
935
|
+
const patted = contactId || conversationId;
|
|
936
|
+
if (isRoomId(patted)) {
|
|
937
|
+
throw new Error('sendPat: contactId is required in room');
|
|
938
|
+
}
|
|
939
|
+
return (await this._client?.sendPat(conversationId, patted)) || false;
|
|
940
|
+
}
|
|
879
941
|
async messageRecall(messageId) {
|
|
880
|
-
|
|
942
|
+
log.verbose(PRE, 'messageRecall(%s)', messageId);
|
|
943
|
+
const payload = await this._cacheMgr?.getMessage(messageId);
|
|
944
|
+
if (!payload) {
|
|
945
|
+
log.warn(PRE, 'messageRecall(%s): message not found in cache', messageId);
|
|
946
|
+
return false;
|
|
947
|
+
}
|
|
948
|
+
const toId = payload.listenerId || payload.fromWxid || '';
|
|
949
|
+
if (!toId) {
|
|
950
|
+
log.warn(PRE, 'messageRecall(%s): can not find conversation id', messageId);
|
|
951
|
+
return false;
|
|
952
|
+
}
|
|
953
|
+
return (await this._client?.revokeMsg(toId, messageId, payload.clientMsgId)) || false;
|
|
881
954
|
}
|
|
882
955
|
async messageForward(toUserName, messageId) {
|
|
883
956
|
const messagePayload = await this.messageRawPayload(messageId);
|
package/package.json
CHANGED
package/src/engine-schema.ts
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { xmlToJson } from '../utils/xml-to-json.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 名片消息(msgType 42)
|
|
5
|
+
*
|
|
6
|
+
* <msg username="wxid_xxx | v3_xxx@stranger" nickname="" alias="" bigheadimgurl="" smallheadimgurl=""
|
|
7
|
+
* province="" city="" sex="1" sign="" scene="17" antispamticket="v4_xxx@stranger" ... />
|
|
8
|
+
*/
|
|
9
|
+
export interface ContactCardPayload {
|
|
10
|
+
/** 好友为 wxid,非好友为 v3_xxx@stranger 加密用户名 */
|
|
11
|
+
username: string
|
|
12
|
+
nickname: string
|
|
13
|
+
/** 微信号 */
|
|
14
|
+
alias: string
|
|
15
|
+
avatar: string
|
|
16
|
+
province: string
|
|
17
|
+
city: string
|
|
18
|
+
sex: number
|
|
19
|
+
sign: string
|
|
20
|
+
scene: string
|
|
21
|
+
/** 添加好友用的 v4 票据 */
|
|
22
|
+
antispamticket: string
|
|
23
|
+
/** 公众号名片 brandType/certflag 非 0 */
|
|
24
|
+
brandType: number
|
|
25
|
+
certflag: number
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function parseContactCardMessagePayload (content: string): Promise<ContactCardPayload | undefined> {
|
|
29
|
+
const json = await xmlToJson(content)
|
|
30
|
+
const attrs = json?.msg?.$
|
|
31
|
+
if (!attrs?.username) {
|
|
32
|
+
return undefined
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
alias: attrs.alias || '',
|
|
36
|
+
antispamticket: attrs.antispamticket || '',
|
|
37
|
+
avatar: attrs.bigheadimgurl || attrs.smallheadimgurl || '',
|
|
38
|
+
brandType: parseInt(attrs.brandType, 10) || 0,
|
|
39
|
+
certflag: parseInt(attrs.certflag, 10) || 0,
|
|
40
|
+
city: attrs.city || '',
|
|
41
|
+
nickname: attrs.nickname || '',
|
|
42
|
+
province: attrs.province || '',
|
|
43
|
+
scene: attrs.scene || '17',
|
|
44
|
+
sex: parseInt(attrs.sex, 10) || 0,
|
|
45
|
+
sign: attrs.sign || '',
|
|
46
|
+
username: attrs.username,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -26,6 +26,37 @@ interface EmotionXmlSchema {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/**
|
|
30
|
+
* 表情小游戏结果
|
|
31
|
+
* gameext type=1 猜拳: content 1=剪刀 2=石头 3=布
|
|
32
|
+
* gameext type=2 骰子: content 4~9 对应 1~6 点
|
|
33
|
+
*/
|
|
34
|
+
export interface EmojiGamePayload {
|
|
35
|
+
kind: 'rps' | 'dice';
|
|
36
|
+
/** 猜拳: scissors | rock | paper;骰子: 1~6 */
|
|
37
|
+
value: string | number;
|
|
38
|
+
/** 中文描述,如 "石头"、"6点" */
|
|
39
|
+
text: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const RPS: Record<number, [string, string]> = {
|
|
43
|
+
1: [ 'scissors', '剪刀' ],
|
|
44
|
+
2: [ 'rock', '石头' ],
|
|
45
|
+
3: [ 'paper', '布' ],
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function parseEmojiGame (type: number, content: number): EmojiGamePayload | undefined {
|
|
49
|
+
if (type === 1 && RPS[content]) {
|
|
50
|
+
const [ value, text ] = RPS[content]!
|
|
51
|
+
return { kind: 'rps', text, value }
|
|
52
|
+
}
|
|
53
|
+
if (type === 2 && content >= 4 && content <= 9) {
|
|
54
|
+
const point = content - 3
|
|
55
|
+
return { kind: 'dice', text: `${point}点`, value: point }
|
|
56
|
+
}
|
|
57
|
+
return undefined
|
|
58
|
+
}
|
|
59
|
+
|
|
29
60
|
export interface EmojiMessagePayload {
|
|
30
61
|
type: number;
|
|
31
62
|
len: number;
|
|
@@ -34,6 +65,8 @@ export interface EmojiMessagePayload {
|
|
|
34
65
|
width: number;
|
|
35
66
|
height: number;
|
|
36
67
|
gameext?: string;
|
|
68
|
+
/** 骰子 / 猜拳的可读结果,普通表情为 undefined */
|
|
69
|
+
game?: EmojiGamePayload;
|
|
37
70
|
aeskey?: string;
|
|
38
71
|
authkey?: string;
|
|
39
72
|
is_ww: boolean;
|
|
@@ -50,10 +83,12 @@ export async function parseEmotionMessagePayload (message: MessagePayload): Prom
|
|
|
50
83
|
const md5 = jsonPayload.msg.emoji.$.md5
|
|
51
84
|
|
|
52
85
|
let gameext
|
|
86
|
+
let game: EmojiGamePayload | undefined
|
|
53
87
|
if (jsonPayload.msg.gameext) {
|
|
54
88
|
const gameextType = parseInt(jsonPayload.msg.gameext.$.type, 10) || 0
|
|
55
89
|
const gameextContent = parseInt(jsonPayload.msg.gameext.$.content, 10) || 0
|
|
56
90
|
gameext = `<gameext type="${gameextType}" content="${gameextContent}" ></gameext>`
|
|
91
|
+
game = parseEmojiGame(gameextType, gameextContent)
|
|
57
92
|
}
|
|
58
93
|
|
|
59
94
|
return {
|
|
@@ -61,6 +96,7 @@ export async function parseEmotionMessagePayload (message: MessagePayload): Prom
|
|
|
61
96
|
aeskey: jsonPayload.msg.emoji.$?.aeskey,
|
|
62
97
|
is_ww: !!jsonPayload.msg.emoji.$?.tpurl,
|
|
63
98
|
cdnurl,
|
|
99
|
+
game,
|
|
64
100
|
gameext,
|
|
65
101
|
height,
|
|
66
102
|
len,
|
|
@@ -275,6 +275,7 @@ export interface MessagePayload {
|
|
|
275
275
|
atWxidList?: string[]; // 消息中艾特人wxid列表
|
|
276
276
|
msg: string; // 消息内容
|
|
277
277
|
listenerId: string; //
|
|
278
|
+
clientMsgId?: number; // 发送接口返回的 client_msg_id,撤回时需要
|
|
278
279
|
}
|
|
279
280
|
|
|
280
281
|
export interface BaseEvent {
|
|
@@ -687,6 +688,14 @@ export interface MomentInfo {
|
|
|
687
688
|
parentId: string
|
|
688
689
|
}
|
|
689
690
|
|
|
691
|
+
/** 从发送接口响应中取 client_msg_id(撤回消息需要) */
|
|
692
|
+
function pickClientMsgId (res: any): number | undefined {
|
|
693
|
+
const item = res?.list?.[0] || res
|
|
694
|
+
const v = item?.clientMsgId ?? item?.client_msg_id ?? item?.clientMsgid
|
|
695
|
+
const n = typeof v === 'string' ? parseInt(v, 10) : v
|
|
696
|
+
return typeof n === 'number' && !isNaN(n) ? n : undefined
|
|
697
|
+
}
|
|
698
|
+
|
|
690
699
|
class Client extends EventEmitter {
|
|
691
700
|
|
|
692
701
|
private readonly options: PuppetMatrixOptions
|
|
@@ -1867,6 +1876,7 @@ class Client extends EventEmitter {
|
|
|
1867
1876
|
|
|
1868
1877
|
return {
|
|
1869
1878
|
id: res?.list?.[0].newMsgId || '',
|
|
1879
|
+
clientMsgId: pickClientMsgId(res),
|
|
1870
1880
|
timeStamp: res?.list?.[0].createTime || '',
|
|
1871
1881
|
msgType: res?.list?.[0].type || '',
|
|
1872
1882
|
talkerId: selfId || '',
|
|
@@ -1907,6 +1917,7 @@ class Client extends EventEmitter {
|
|
|
1907
1917
|
|
|
1908
1918
|
return {
|
|
1909
1919
|
id: res?.list?.[0].newMsgId || '',
|
|
1920
|
+
clientMsgId: pickClientMsgId(res),
|
|
1910
1921
|
timeStamp: res?.list?.[0].createTime || '',
|
|
1911
1922
|
msgType: res?.list?.[0].type || '',
|
|
1912
1923
|
talkerId: selfId || '',
|
|
@@ -2197,6 +2208,7 @@ class Client extends EventEmitter {
|
|
|
2197
2208
|
})
|
|
2198
2209
|
return {
|
|
2199
2210
|
id: res?.newMsgId || '',
|
|
2211
|
+
clientMsgId: pickClientMsgId(res),
|
|
2200
2212
|
timeStamp: res?.createTime || '',
|
|
2201
2213
|
msgType: WechatMessageType.Image,
|
|
2202
2214
|
talkerId: selfId || '',
|
|
@@ -2240,6 +2252,7 @@ class Client extends EventEmitter {
|
|
|
2240
2252
|
|
|
2241
2253
|
return {
|
|
2242
2254
|
id: res?.newMsgId || '',
|
|
2255
|
+
clientMsgId: pickClientMsgId(res),
|
|
2243
2256
|
timeStamp: res?.createTime || getUnixTime(new Date()),
|
|
2244
2257
|
msgType: WechatMessageType.Video,
|
|
2245
2258
|
talkerId: selfId || '',
|
|
@@ -2280,6 +2293,7 @@ class Client extends EventEmitter {
|
|
|
2280
2293
|
})
|
|
2281
2294
|
return {
|
|
2282
2295
|
id: res?.newMsgId || '',
|
|
2296
|
+
clientMsgId: pickClientMsgId(res),
|
|
2283
2297
|
timeStamp: res?.createTime || '',
|
|
2284
2298
|
msgType: WechatMessageType.File,
|
|
2285
2299
|
talkerId: selfId || '',
|
|
@@ -2330,6 +2344,7 @@ class Client extends EventEmitter {
|
|
|
2330
2344
|
})
|
|
2331
2345
|
return {
|
|
2332
2346
|
id: res?.newMsgId || '',
|
|
2347
|
+
clientMsgId: pickClientMsgId(res),
|
|
2333
2348
|
timeStamp: res?.createTime || '',
|
|
2334
2349
|
msgType: WechatMessageType.Text,
|
|
2335
2350
|
talkerId: selfId || '',
|
|
@@ -2389,6 +2404,7 @@ class Client extends EventEmitter {
|
|
|
2389
2404
|
|
|
2390
2405
|
return {
|
|
2391
2406
|
id: res?.newMsgId || '',
|
|
2407
|
+
clientMsgId: pickClientMsgId(res),
|
|
2392
2408
|
timeStamp: res?.createTime || '',
|
|
2393
2409
|
msgType: WechatMessageType.MiniProgram,
|
|
2394
2410
|
talkerId: selfId || '',
|
|
@@ -2428,6 +2444,7 @@ class Client extends EventEmitter {
|
|
|
2428
2444
|
|
|
2429
2445
|
return {
|
|
2430
2446
|
id: res?.newMsgId || '',
|
|
2447
|
+
clientMsgId: pickClientMsgId(res),
|
|
2431
2448
|
timeStamp: res?.createTime || '',
|
|
2432
2449
|
msgType: WechatMessageType.App,
|
|
2433
2450
|
talkerId: selfId || '',
|
|
@@ -2669,6 +2686,7 @@ class Client extends EventEmitter {
|
|
|
2669
2686
|
})
|
|
2670
2687
|
return {
|
|
2671
2688
|
id: res?.newMsgId || '',
|
|
2689
|
+
clientMsgId: pickClientMsgId(res),
|
|
2672
2690
|
timeStamp: res?.createTime || '',
|
|
2673
2691
|
msgType: WechatMessageType.App,
|
|
2674
2692
|
talkerId: selfId || '',
|
|
@@ -2682,6 +2700,177 @@ class Client extends EventEmitter {
|
|
|
2682
2700
|
}
|
|
2683
2701
|
}
|
|
2684
2702
|
|
|
2703
|
+
/**
|
|
2704
|
+
* 发送名片(无需 xml)
|
|
2705
|
+
* @param toId 接收人/群 id
|
|
2706
|
+
* @param shareId 被分享的联系人 wxid
|
|
2707
|
+
* @param shareNickname 被分享人昵称
|
|
2708
|
+
* @param shareHeadImg 被分享人头像
|
|
2709
|
+
*/
|
|
2710
|
+
public async sendContact (
|
|
2711
|
+
{
|
|
2712
|
+
toId,
|
|
2713
|
+
shareId,
|
|
2714
|
+
shareNickname,
|
|
2715
|
+
shareHeadImg,
|
|
2716
|
+
}: {
|
|
2717
|
+
toId: string;
|
|
2718
|
+
shareId: string;
|
|
2719
|
+
shareNickname?: string;
|
|
2720
|
+
shareHeadImg?: string;
|
|
2721
|
+
},
|
|
2722
|
+
selfId: string | undefined,
|
|
2723
|
+
): Promise<MessagePayload | void> {
|
|
2724
|
+
try {
|
|
2725
|
+
const res = await this.postData({
|
|
2726
|
+
path: '/msg/send_share_card',
|
|
2727
|
+
data: {
|
|
2728
|
+
to_username: toId,
|
|
2729
|
+
share_username: shareId,
|
|
2730
|
+
share_nickname: shareNickname || '',
|
|
2731
|
+
share_head_img: shareHeadImg || '',
|
|
2732
|
+
},
|
|
2733
|
+
})
|
|
2734
|
+
return {
|
|
2735
|
+
id: res?.newMsgId || '',
|
|
2736
|
+
clientMsgId: pickClientMsgId(res),
|
|
2737
|
+
timeStamp: res?.createTime || '',
|
|
2738
|
+
msgType: WechatMessageType.ShareCard,
|
|
2739
|
+
talkerId: selfId || '',
|
|
2740
|
+
text: shareId,
|
|
2741
|
+
msg: shareId,
|
|
2742
|
+
fromWxid: isRoomId(toId) ? toId : '',
|
|
2743
|
+
listenerId: toId,
|
|
2744
|
+
}
|
|
2745
|
+
} catch (error) {
|
|
2746
|
+
log.error(PRE, 'sendContact(%s, %s): %s', toId, shareId, error)
|
|
2747
|
+
}
|
|
2748
|
+
}
|
|
2749
|
+
|
|
2750
|
+
/**
|
|
2751
|
+
* 通过 md5 发送表情(微信服务器已有该表情时可直接发送)
|
|
2752
|
+
*/
|
|
2753
|
+
public async sendEmojiMd5 (
|
|
2754
|
+
toId: string,
|
|
2755
|
+
md5: string,
|
|
2756
|
+
size: number,
|
|
2757
|
+
selfId: string | undefined,
|
|
2758
|
+
): Promise<MessagePayload | void> {
|
|
2759
|
+
try {
|
|
2760
|
+
const res = await this.postData({
|
|
2761
|
+
path: '/msg/send_emoji_md5',
|
|
2762
|
+
data: {
|
|
2763
|
+
to_username: toId,
|
|
2764
|
+
file_md5: md5,
|
|
2765
|
+
file_size: size,
|
|
2766
|
+
},
|
|
2767
|
+
})
|
|
2768
|
+
log.verbose(PRE, 'sendEmojiMd5 res: %s', JSON.stringify(res))
|
|
2769
|
+
return this.emojiResult(res, toId, md5, selfId)
|
|
2770
|
+
} catch (error) {
|
|
2771
|
+
log.error(PRE, 'sendEmojiMd5(%s, %s): %s', toId, md5, error)
|
|
2772
|
+
}
|
|
2773
|
+
}
|
|
2774
|
+
|
|
2775
|
+
/**
|
|
2776
|
+
* 通过图片 url 发送表情
|
|
2777
|
+
*/
|
|
2778
|
+
public async sendEmojiUrl (
|
|
2779
|
+
toId: string,
|
|
2780
|
+
url: string,
|
|
2781
|
+
selfId: string | undefined,
|
|
2782
|
+
): Promise<MessagePayload | void> {
|
|
2783
|
+
try {
|
|
2784
|
+
const res = await this.postData({
|
|
2785
|
+
path: '/msg/send_emoji_url',
|
|
2786
|
+
data: {
|
|
2787
|
+
to_username: toId,
|
|
2788
|
+
url,
|
|
2789
|
+
},
|
|
2790
|
+
})
|
|
2791
|
+
log.verbose(PRE, 'sendEmojiUrl res: %s', JSON.stringify(res))
|
|
2792
|
+
return this.emojiResult(res, toId, url, selfId)
|
|
2793
|
+
} catch (error) {
|
|
2794
|
+
log.error(PRE, 'sendEmojiUrl(%s, %s): %s', toId, url, error)
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
|
|
2798
|
+
private emojiResult (res: any, toId: string, text: string, selfId: string | undefined): MessagePayload | void {
|
|
2799
|
+
// 返回格式: { baseResponse, emojiItem: [{ ret, msgId, newMsgId, md5, totalLen }] }
|
|
2800
|
+
const item = res?.emojiItem?.[0] || res?.list?.[0] || res
|
|
2801
|
+
const id = item?.newMsgId || item?.msgId
|
|
2802
|
+
if (!id || (item?.ret !== undefined && item.ret !== 0)) {
|
|
2803
|
+
log.warn(PRE, 'send emoji failed: %s', JSON.stringify(res))
|
|
2804
|
+
return
|
|
2805
|
+
}
|
|
2806
|
+
return {
|
|
2807
|
+
clientMsgId: pickClientMsgId(item),
|
|
2808
|
+
fromWxid: isRoomId(toId) ? toId : '',
|
|
2809
|
+
id: String(id),
|
|
2810
|
+
listenerId: toId,
|
|
2811
|
+
msg: text,
|
|
2812
|
+
msgType: WechatMessageType.Emoticon,
|
|
2813
|
+
talkerId: selfId || '',
|
|
2814
|
+
text,
|
|
2815
|
+
timeStamp: item?.createTime || '',
|
|
2816
|
+
}
|
|
2817
|
+
}
|
|
2818
|
+
|
|
2819
|
+
/**
|
|
2820
|
+
* 拍一拍
|
|
2821
|
+
* @param toId 会话 id(私聊为好友 wxid,群聊为群 id)
|
|
2822
|
+
* @param pattedId 被拍的人 wxid
|
|
2823
|
+
*/
|
|
2824
|
+
public async sendPat (toId: string, pattedId: string): Promise<boolean> {
|
|
2825
|
+
try {
|
|
2826
|
+
const res = await this.postData({
|
|
2827
|
+
path: '/msg/send_pat',
|
|
2828
|
+
data: {
|
|
2829
|
+
to_username: toId,
|
|
2830
|
+
patted_username: pattedId,
|
|
2831
|
+
},
|
|
2832
|
+
})
|
|
2833
|
+
log.verbose(PRE, 'sendPat res: %s', JSON.stringify(res))
|
|
2834
|
+
if (!res || res.errcode || (res.baseResponse?.ret !== undefined && res.baseResponse.ret !== 0)) {
|
|
2835
|
+
log.warn(PRE, 'sendPat(%s, %s) failed: %s', toId, pattedId, JSON.stringify(res))
|
|
2836
|
+
return false
|
|
2837
|
+
}
|
|
2838
|
+
return true
|
|
2839
|
+
} catch (error) {
|
|
2840
|
+
log.error(PRE, 'sendPat(%s, %s): %s', toId, pattedId, error)
|
|
2841
|
+
return false
|
|
2842
|
+
}
|
|
2843
|
+
}
|
|
2844
|
+
|
|
2845
|
+
/**
|
|
2846
|
+
* 撤回消息
|
|
2847
|
+
* @param toId 消息所在会话(好友 wxid / 群 id)
|
|
2848
|
+
* @param msgId 发送返回的 newMsgId
|
|
2849
|
+
* @param clientMsgId 发送返回的 client_msg_id
|
|
2850
|
+
*/
|
|
2851
|
+
public async revokeMsg (toId: string, msgId: string, clientMsgId: number | undefined): Promise<boolean> {
|
|
2852
|
+
try {
|
|
2853
|
+
const res = await this.postData({
|
|
2854
|
+
path: '/msg/revoke_msg',
|
|
2855
|
+
data: {
|
|
2856
|
+
to_username: toId,
|
|
2857
|
+
msg_id: msgId,
|
|
2858
|
+
client_msg_id: clientMsgId || 0,
|
|
2859
|
+
},
|
|
2860
|
+
})
|
|
2861
|
+
log.verbose(PRE, 'revokeMsg res: %s', JSON.stringify(res))
|
|
2862
|
+
const ret = res?.baseResponse?.ret
|
|
2863
|
+
if (ret !== undefined && ret !== 0) {
|
|
2864
|
+
log.warn(PRE, 'revokeMsg(%s, %s) failed: %s', toId, msgId, JSON.stringify(res?.baseResponse))
|
|
2865
|
+
return false
|
|
2866
|
+
}
|
|
2867
|
+
return !!res
|
|
2868
|
+
} catch (error) {
|
|
2869
|
+
log.error(PRE, 'revokeMsg(%s, %s): %s', toId, msgId, error)
|
|
2870
|
+
return false
|
|
2871
|
+
}
|
|
2872
|
+
}
|
|
2873
|
+
|
|
2685
2874
|
/**
|
|
2686
2875
|
* 发送群公告
|
|
2687
2876
|
* @param roomId 群id
|