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.
Files changed (34) hide show
  1. package/dist/cjs/src/engine-schema.d.ts +1 -0
  2. package/dist/cjs/src/engine-schema.d.ts.map +1 -1
  3. package/dist/cjs/src/matrix/messages/message-contact-card.d.ts +16 -0
  4. package/dist/cjs/src/matrix/messages/message-contact-card.d.ts.map +1 -0
  5. package/dist/cjs/src/matrix/messages/message-contact-card.js +25 -0
  6. package/dist/cjs/src/matrix/messages/message-emotion.d.ts +7 -0
  7. package/dist/cjs/src/matrix/messages/message-emotion.d.ts.map +1 -1
  8. package/dist/cjs/src/matrix/messages/message-emotion.js +20 -0
  9. package/dist/cjs/src/matrix/service/request.d.ts +12 -0
  10. package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
  11. package/dist/cjs/src/matrix/service/request.js +138 -0
  12. package/dist/cjs/src/puppet-matrix.d.ts +2 -0
  13. package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
  14. package/dist/cjs/src/puppet-matrix.js +105 -32
  15. package/dist/esm/src/engine-schema.d.ts +1 -0
  16. package/dist/esm/src/engine-schema.d.ts.map +1 -1
  17. package/dist/esm/src/matrix/messages/message-contact-card.d.ts +16 -0
  18. package/dist/esm/src/matrix/messages/message-contact-card.d.ts.map +1 -0
  19. package/dist/esm/src/matrix/messages/message-contact-card.js +22 -0
  20. package/dist/esm/src/matrix/messages/message-emotion.d.ts +7 -0
  21. package/dist/esm/src/matrix/messages/message-emotion.d.ts.map +1 -1
  22. package/dist/esm/src/matrix/messages/message-emotion.js +19 -0
  23. package/dist/esm/src/matrix/service/request.d.ts +12 -0
  24. package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
  25. package/dist/esm/src/matrix/service/request.js +138 -0
  26. package/dist/esm/src/puppet-matrix.d.ts +2 -0
  27. package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
  28. package/dist/esm/src/puppet-matrix.js +105 -32
  29. package/package.json +1 -1
  30. package/src/engine-schema.ts +1 -0
  31. package/src/matrix/messages/message-contact-card.ts +48 -0
  32. package/src/matrix/messages/message-emotion.ts +36 -0
  33. package/src/matrix/service/request.ts +189 -0
  34. 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
- return PUPPET.throwUnsupportedError(messageId);
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 emoticonBox = emotionPayload.is_ww ? await this._client?.downloadWWMedia({
601
- aes_key: emotionPayload.aeskey || '',
602
- auth_key: emotionPayload.authkey || '',
603
- file_id: emotionPayload.cdnurl || '',
604
- file_name: `message-${messageId}-emoticon.jpg`,
605
- }, 3) : FileBox.fromUrl(emotionPayload.cdnurl, { name: `message-${messageId}-emoticon.jpg` });
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', 'messageSend("%s", %s)', toUserId, contactId);
799
+ log.verbose('PuppetWeChat', 'messageSendContact("%s", %s)', toUserId, contactId);
741
800
  const contactPayload = await this.contactRawPayload(contactId);
742
- const xmlObj = {
743
- msg: {
744
- antispamticket: '',
745
- bigheadimgurl: contactPayload?.avatar,
746
- brandFlags: '0',
747
- certflag: '0',
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
- PUPPET.throwUnsupportedError(conversationId, fileBox);
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
- return PUPPET.throwUnsupportedError(messageId);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wechaty-puppet-matrix",
3
- "version": "0.0.55",
3
+ "version": "0.0.56",
4
4
  "description": "Puppet matrix for Wechaty",
5
5
  "type": "module",
6
6
  "typings": "./dist/esm/src/mod.d.ts",
@@ -29,6 +29,7 @@ export interface MessagePayload {
29
29
  msg: string, // 消息内容
30
30
  listenerId: string,
31
31
  voiceText?: string, // 语音消息转出的文字
32
+ clientMsgId?: number, // 发送接口返回的 client_msg_id,撤回时需要
32
33
  }
33
34
  export interface ChatRoomMember {
34
35
  wxid: string,
@@ -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