wechaty / puppet-whatsapp

Wechaty Puppet for Whatsapp
https://npmjs.com/package/wechaty-puppet-whatsapp
Apache License 2.0
24 stars 17 forks source link

无法识别图片+文本的混合消息类型 #390

Closed su-chang closed 1 year ago

su-chang commented 1 year ago

_data 中为图片信息,需要对其body进行图片的解析。

消息数据

{
  "_data": {
    "id": {
      "fromMe": false,
      "remote": "120363041857314029@g.us",
      "id": "3EB0EC5D51D1E713834B",
      "participant": "84942442333@c.us",
      "_serialized": "false_120363041857314029@g.us_3EB0EC5D51D1E713834B_84942442333@c.us"
    },
    "body": "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",
    "type": "image",
    "t": 1660729065,
    "notifyName": "Anh Vu Do",
    "from": "120363041857314029@g.us",
    "to": "8613391097127@c.us",
    "author": "84942442333@c.us",
    "self": "in",
    "ack": 1,
    "isNewMsg": true,
    "star": false,
    "kicNotified": false,
    "recvFresh": true,
    "caption": "please swap from 1B from 1A",
    "interactiveAnnotations": [],
    "deprecatedMms3Url": "https://mmg.whatsapp.net/d/f/Aue3rWo80BZGYrVQ5F-qDfeUsoGYlBhBHm8unQ7veli6.enc",
    "directPath": "/v/t62.7118-24/32345672_1100126314260477_8472027333779875043_n.enc?ccb=11-4&oh=01_AVxPIBqSBBeK7xl2zS2O2TmkLSbcyjVaSTTMbULAJEkpyw&oe=6320ABEE",
    "mimetype": "image/jpeg",
    "filehash": "BcIf6ylv5hNuahPl6mtfYrDCtpTmooC9zdcaCEE4lZk=",
    "encFilehash": "l87L+v1yMOp9Znlpo6Ondk7Igi0juLYvvpwQr6jKkEk=",
    "size": 27172,
    "mediaKey": "OByOc0YMILVS7Q30LOw/Li45B1keRZZkXCuZcwjv/Y0=",
    "mediaKeyTimestamp": 1660729063,
    "isViewOnce": false,
    "width": 413,
    "height": 286,
    "staticUrl": "",
    "scanLengths": [],
    "isFromTemplate": false,
    "pollInvalidated": false,
    "broadcast": false,
    "mentionedJidList": [],
    "isVcardOverMmsDocument": false,
    "isForwarded": false,
    "hasReaction": false,
    "productHeaderImageRejected": false,
    "lastPlaybackProgress": 0,
    "isDynamicReplyButtonsMsg": false,
    "isMdHistoryMsg": false,
    "requiresDirectConnection": false,
    "pttForwardedFeaturesEnabled": true,
    "isEphemeral": false,
    "isStatusV3": false,
    "links": []
  },
  "mediaKey": "OByOc0YMILVS7Q30LOw/Li45B1keRZZkXCuZcwjv/Y0=",
  "id": {
    "fromMe": false,
    "remote": "120363041857314029@g.us",
    "id": "3EB0EC5D51D1E713834B",
    "participant": "84942442333@c.us",
    "_serialized": "false_120363041857314029@g.us_3EB0EC5D51D1E713834B_84942442333@c.us"
  },
  "ack": 1,
  "hasMedia": true,
  "body": "please swap from 1B from 1A",
  "type": "image",
  "timestamp": 1660729065,
  "from": "120363041857314029@g.us",
  "to": "8613391097127@c.us",
  "author": "84942442333@c.us",
  "deviceType": "web",
  "isForwarded": false,
  "forwardingScore": 0,
  "isStatus": false,
  "isStarred": false,
  "broadcast": false,
  "fromMe": false,
  "hasQuotedMsg": false,
  "vCards": [],
  "mentionedIds": [],
  "isGif": false,
  "isEphemeral": false,
  "links": []
}
su-chang commented 1 year ago

原始数据

{
  "_data": {
    "id": {
      "fromMe": false,
      "remote": "8613811623084@c.us",
      "id": "CB967BC9F74066A4E91E5B8FE7F73A01",
      "_serialized": "false_8613811623084@c.us_CB967BC9F74066A4E91E5B8FE7F73A01"
    },
    "body": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABsbGxscGx4hIR4qLSgtKj04MzM4PV1CR0JHQl2NWGdYWGdYjX2Xe3N7l33gsJycsOD/2c7Z//////////////8BGxsbGxwbHiEhHiotKC0qPTgzMzg9XUJHQkdCXY1YZ1hYZ1iNfZd7c3uXfeCwnJyw4P/Zztn////////////////CABEIADwAIQMBIgACEQEDEQH/xAAtAAACAwEBAAAAAAAAAAAAAAAAAwECBAUGAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAATMWiIZUaUBdqNpU2g0CQdo8+yO3nwtNIkORDwo1cGgyB/8QAJRAAAgIBAwMEAwAAAAAAAAAAAQIAAxIEESETMUEQFDJRIiNS/9oACAEBAAE/ALGrs1AC8LL1rULhyzGPViOpl8RMXtrWZWxundqsV4QTU1JUEKnkniNU/TO7cbSpmxGw4n7JrKq6ccCcjDpbiinLtzEtvsRl24ldopCownuUj6bUDA7ZbQ33BGR1M01qVIFIljrZqkPjaHGJrEPmC2tx4Maulu6iNpa991JE9qf7gwPZoMx2aLdav3Bqvue4ENZn5CLc6+YLgfkszo+vUgQqPT//xAAUEQEAAAAAAAAAAAAAAAAAAAAw/9oACAECAQE/AE//xAAUEQEAAAAAAAAAAAAAAAAAAAAw/9oACAEDAQE/AE//2Q==",
    "type": "image",
    "t": 1662711884,
    "notifyName": "test12",
    "from": "8613811623084@c.us",
    "to": "8613126768525@c.us",
    "self": "in",
    "ack": 1,
    "isNewMsg": true,
    "star": false,
    "kicNotified": false,
    "recvFresh": true,
    "caption": "滚滚滚滚滚",
    "interactiveAnnotations": [],
    "deprecatedMms3Url": "https://mmg.whatsapp.net/d/f/Aj6uqYntkY3WTDQsqbqHLKJygEHqGtdyEcsSBgDYCxzD.enc",
    "directPath": "/v/t62.7118-24/25227508_914719489485247_1733599887089246971_n.enc?ccb=11-4&oh=01_AVxwUO0Ib6Ez-KDwmUVLpBpam-wlBYqCWFWIKrqp8VrR-g&oe=63419FA2",
    "mimetype": "image/jpeg",
    "filehash": "QJU6qRhaRI3pg87bdV9n9IsxCZlpQ5bh4AIJrvHSRx8=",
    "encFilehash": "jvKJ4p0pTxSKS6s/tfOq/xPLzNfq2nU6pu528kryPXY=",
    "size": 33674,
    "mediaKey": "KRf0pBkHZ2Bl+bdqs67OH9Sw+1SMnyJuUWWofEQAZ4w=",
    "mediaKeyTimestamp": 1662711743,
    "isViewOnce": false,
    "width": 540,
    "height": 960,
    "staticUrl": "",
    "scanLengths": [4812, 7901, 5988, 14973],
    "scansSidecar": {},
    "isFromTemplate": false,
    "pollInvalidated": false,
    "broadcast": false,
    "mentionedJidList": [],
    "isVcardOverMmsDocument": false,
    "isForwarded": false,
    "hasReaction": false,
    "ephemeralOutOfSync": false,
    "productHeaderImageRejected": false,
    "lastPlaybackProgress": 0,
    "isDynamicReplyButtonsMsg": false,
    "isMdHistoryMsg": false,
    "requiresDirectConnection": false,
    "pttForwardedFeaturesEnabled": true,
    "isEphemeral": false,
    "isStatusV3": false,
    "links": []
  },
  "mediaKey": "KRf0pBkHZ2Bl+bdqs67OH9Sw+1SMnyJuUWWofEQAZ4w=",
  "id": {
    "fromMe": false,
    "remote": "8613811623084@c.us",
    "id": "CB967BC9F74066A4E91E5B8FE7F73A01",
    "_serialized": "false_8613811623084@c.us_CB967BC9F74066A4E91E5B8FE7F73A01"
  },
  "ack": 1,
  "hasMedia": true,
  "body": "滚滚滚滚滚",
  "type": "image",
  "timestamp": 1662711884,
  "from": "8613811623084@c.us",
  "to": "8613126768525@c.us",
  "deviceType": "android",
  "isForwarded": false,
  "forwardingScore": 0,
  "isStatus": false,
  "isStarred": false,
  "broadcast": false,
  "fromMe": false,
  "hasQuotedMsg": false,
  "vCards": [],
  "mentionedIds": [],
  "isGif": false,
  "isEphemeral": false,
  "links": []
}

转换后的数据

{
  "fromId": "8613811623084@c.us",
  "talkerId": "8613811623084@c.us",
  "id": "CB967BC9F74066A4E91E5B8FE7F73A01",
  "mentionIdList": [],
  "text": "滚滚滚滚滚",
  "timestamp": 1662711884,
  "toId": "8613126768525@c.us",
  "listenerId": "8613126768525@c.us",
  "type": 6
}
su-chang commented 1 year ago

目前的做法

可以通过将图片+文字的混合消息拆分为两条消息

不利于引用和撤回

更好的做法

秒回侧适配接收到图片消息时,text字段存在的情况,并将二者一并显示,更符合逻辑一些。

hcfw007 commented 1 year ago

根据Post类型的特点(适用于包含多个sayable的消息),似乎作为一个Post消息很合适。(不过puppet-service的Post模块还没实现)。

su-chang commented 1 year ago

后续完善Post后再以此方案替代当前方案。