wechaty / puppet-whatsapp

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

下载图片/文件消息失败 #165

Closed su-chang closed 2 years ago

su-chang commented 2 years ago

onMessageCreate 阶段就将message emit出去了,ack: 0 的情况下 hasMedia: false 导致无法下载文件。

21:43:05 SILL PuppetWhatsApp onMessageCreate({"id":{"fromMe":true,"remote":"120363021318182885@g.us","id":"3A282E455C28971DBBAB","_serialized":"true_120363021318182885@g.us_3A282E455C28971DBBAB"},"ack":0,"hasMedia":false,"body":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBCYFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2wBDARweHigjKE4rK06kbl1upKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wgARCAAhAEgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBAgQF/8QAGAEBAQEBAQAAAAAAAAAAAAAAAAECAwT/2gAMAwEAAhADEAAAAFtm/L0JrGvXPMyHaxRetaINgZ8b4z05DOnG+fInqhzd+qyUKBFglpUAYAyArOAn/8QAGxEBAAEFAQAAAAAAAAAAAAAAAREAAhIgMDH/2gAIAQIBAT8AyuoV9NIZ5f/EAB0RAAIBBAMAAAAAAAAAAAAAAAECAAMQERIwMlH/2gAIAQMBAT8A0p+xlUdTDcsMcX//xAAlEAACAwACAgIBBQEAAAAAAAABAgADEQQhEjEiQRMFFDJRYXH/2gAIAQEAAT8AP7Vm3WU/8grV8VbwV/poeFYulCp/wGeNyj5rgmE9bApwD7ngR9iP5D+PcOga04/FSwN5HMOSzi1VLpbD9R+Tx68+Z/2NzeM9NYsHWbsPM4PRr0knqPzuOlfa/L+jE5tL8byasZvZj8rjJeEA7PYEZK7qkcDCZXeqM/5GA07P1PmhkAq0tDTY4HxPke4lHIYez8fQgSym1X8DgOzkm2+0uAe/qcdeQqhcbN0iXq1l4sCZi5OGLEpCM+Symt38j7n40X0omCEzAR3FRR6EqADbkfPcd8g9xoYYIsEeWezP//4AAwD/2Q==","type":"image","timestamp":1644500585,"from":"8613126768525@c.us","to":"120363021318182885@g.us","deviceType":"ios","isForwarded":false,"forwardingScore":0,"isStatus":false,"isStarred":false,"fromMe":true,"hasQuotedMsg":false,"vCards":[],"mentionedIds":[],"isGif":false,"isEphemeral":false,"links":[]})
21:43:05 VERB FlashStore get(3A282E455C28971DBBAB)
21:43:05 VERB FlashStore set(3A282E455C28971DBBAB, [object Object]) value type: object
21:43:05 INFO PuppetWhatsApp onMessage({"messageId":"3A282E455C28971DBBAB"})
21:43:05 VERB Puppet messagePayload(3A282E455C28971DBBAB)
21:43:05 SILL Puppet messagePayloadCache(3A282E455C28971DBBAB) cache MISS
21:43:05 INFO PuppetWhatsApp messageRawPayload(3A282E455C28971DBBAB)
21:43:05 VERB FlashStore get(3A282E455C28971DBBAB)
21:43:05 SILL Puppet messagePayload(3A282E455C28971DBBAB) cache SET

  =========================================
  Message type: 6
  text: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBCYFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2wBDARweHigjKE4rK06kbl1upKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wgARCAAhAEgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBAgQF/8QAGAEBAQEBAQAAAAAAAAAAAAAAAAECAwT/2gAMAwEAAhADEAAAAFtm/L0JrGvXPMyHaxRetaINgZ8b4z05DOnG+fInqhzd+qyUKBFglpUAYAyArOAn/8QAGxEBAAEFAQAAAAAAAAAAAAAAAREAAhIgMDH/2gAIAQIBAT8AyuoV9NIZ5f/EAB0RAAIBBAMAAAAAAAAAAAAAAAECAAMQERIwMlH/2gAIAQMBAT8A0p+xlUdTDcsMcX//xAAlEAACAwACAgIBBQEAAAAAAAABAgADEQQhEjEiQRMFFDJRYXH/2gAIAQEAAT8AP7Vm3WU/8grV8VbwV/poeFYulCp/wGeNyj5rgmE9bApwD7ngR9iP5D+PcOga04/FSwN5HMOSzi1VLpbD9R+Tx68+Z/2NzeM9NYsHWbsPM4PRr0knqPzuOlfa/L+jE5tL8byasZvZj8rjJeEA7PYEZK7qkcDCZXeqM/5GA07P1PmhkAq0tDTY4HxPke4lHIYez8fQgSym1X8DgOzkm2+0uAe/qcdeQqhcbN0iXq1l4sCZi5OGLEpCM+Symt38j7n40X0omCEzAR3FRR6EqADbkfPcd8g9xoYYIsEeWezP//4AAwD/2Q==
  from: 8613126768525@c.us
  to: undefined
  room: 120363021318182885@g.us
  =========================================

21:43:05 INFO PuppetWhatsApp messageImage(3A282E455C28971DBBAB, 1[Thumbnail])
21:43:05 VERB FlashStore get(3A282E455C28971DBBAB)
21:43:05 ERR PuppetWhatsApp Message 3A282E455C28971DBBAB does not contain any media
21:43:06 SILL PuppetWhatsApp onMessageAck({"mediaKey":"9LWjoAaUMQ8Q8gLAUYdrVB71nQfersstLMdfTwtnQ44=","id":{"fromMe":true,"remote":"120363021318182885@g.us","id":"3A282E455C28971DBBAB","_serialized":"true_120363021318182885@g.us_3A282E455C28971DBBAB"},"ack":1,"hasMedia":true,"body":"","type":"image","timestamp":1644500585,"from":"8613126768525@c.us","to":"120363021318182885@g.us","deviceType":"ios","isForwarded":false,"forwardingScore":0,"isStatus":false,"isStarred":false,"fromMe":true,"hasQuotedMsg":false,"vCards":[],"mentionedIds":[],"isGif":false,"isEphemeral":false,"links":[]})
su-chang commented 2 years ago

初步定位问题 convertMessagePayloadToClass 函数将 msg 对象转换为class时,部分属性发生了变化。

const msgObj = convertMessagePayloadToClass(this.manager.getWhatsApp(), msg)
logger.info(`
msg.hasMedia: ${msg.hasMedia} ${JSON.stringify(msg)}
msgObj.hasMedia: ${msgObj.hasMedia} ${JSON.stringify(msgObj)}
`)
const media = await msgObj.downloadMedia()
export function convertMessagePayloadToClass (client: WhatsAppClientType, payload: WhatsAppMessagePayload): WhatsAppMessage {
  return new MessageClass(client, payload)
}

Source Code in whatsapp-web.js

/**
 * Indicates if the message has media available for download
 * @type {boolean}
 */
  this.hasMedia = Boolean(data.mediaKey && data.directPath);

结论 目前缓存的消息中没有 directPath 字段,导致重新构造 Message 类时,hasMedia 被置为false

需要找到从哪里获取 directPath

日志

# 文件消息
  msg.hasMedia: true {
    "mediaKey": "L3uLfIy5S7bW5dp7v+9o30/VJKDzlt0YTgy+ltn3YYE=",
    "id": {
      "fromMe": true,
      "remote": "120363039010379837@g.us",
      "id": "3EB0254155E9E75AE95F",
      "_serialized": "true_120363039010379837@g.us_3EB0254155E9E75AE95F"
    },
    "ack": 1,
    "hasMedia": true,
    "body": "中心主题.xmind",
    "type": "document",
    "timestamp": 1644580242,
    "from": "8613126768525@c.us",
    "to": "120363039010379837@g.us",
    "deviceType": "web",
    "forwardingScore": 0,
    "isStatus": false,
    "isStarred": false,
    "fromMe": true,
    "hasQuotedMsg": false,
    "vCards": [],
    "mentionedIds": [],
    "isGif": false,
    "isEphemeral": false,
    "links": []
  }
  msgObj.hasMedia: false {
    "mediaKey": "L3uLfIy5S7bW5dp7v+9o30/VJKDzlt0YTgy+ltn3YYE=",
    "id": {
      "fromMe": true,
      "remote": "120363039010379837@g.us",
      "id": "3EB0254155E9E75AE95F",
      "_serialized": "true_120363039010379837@g.us_3EB0254155E9E75AE95F"
    },
    "ack": 1,
    "hasMedia": false,
    "body": "中心主题.xmind",
    "type": "document",
    "from": "8613126768525@c.us",
    "to": "120363039010379837@g.us",
    "deviceType": "web",
    "forwardingScore": 0,
    "fromMe": true,
    "hasQuotedMsg": false,
    "vCards": [],
    "mentionedIds": [],
    "isGif": false,
    "isEphemeral": false,
    "links": []
  }

# 图片消息
  msg.hasMedia: true {
    "mediaKey": "ubCGN0sq2CATcpauCTdgcxoegvyw3nHivBtQ9eyBjlk=",
    "id": {
      "fromMe": true,
      "remote": "120363039010379837@g.us",
      "id": "3EB09175781FD3911E22",
      "_serialized": "true_120363039010379837@g.us_3EB09175781FD3911E22"
    },
    "ack": 1,
    "hasMedia": true,
    "body": "",
    "type": "image",
    "timestamp": 1644583735,
    "from": "8613126768525@c.us",
    "to": "120363039010379837@g.us",
    "deviceType": "web",
    "forwardingScore": 0,
    "isStatus": false,
    "isStarred": false,
    "fromMe": true,
    "hasQuotedMsg": false,
    "vCards": [],
    "mentionedIds": [],
    "isGif": false,
    "isEphemeral": false,
    "links": []
  }
  msgObj.hasMedia: false {
    "mediaKey": "ubCGN0sq2CATcpauCTdgcxoegvyw3nHivBtQ9eyBjlk=",
    "id": {
      "fromMe": true,
      "remote": "120363039010379837@g.us",
      "id": "3EB09175781FD3911E22",
      "_serialized": "true_120363039010379837@g.us_3EB09175781FD3911E22"
    },
    "ack": 1,
    "hasMedia": false,
    "body": "",
    "type": "image",
    "from": "8613126768525@c.us",
    "to": "120363039010379837@g.us",
    "deviceType": "web",
    "forwardingScore": 0,
    "fromMe": true,
    "hasQuotedMsg": false,
    "vCards": [],
    "mentionedIds": [],
    "isGif": false,
    "isEphemeral": false,
    "links": []
  }
su-chang commented 2 years ago

需要找到从哪里获取 directPath

@guo40020 你有什么建议么?

kellyiscute commented 2 years ago

直接在Message类里添加 directPath 字段来使 payload 也能正常保 directPath

kellyiscute commented 2 years ago
# WhatsApp-web.js/src/Message.js:342
const msg = window.Store.Msg.get(msgId);

From here we can have the directPath for the Message

su-chang commented 2 years ago

From here we can have the directPath for the Message

我们能从 whatsapp-web.js api 层面获取到 directPath 这个字段么? 这是核心问题。 @guo40020

kellyiscute commented 2 years ago

From here we can have the directPath for the Message

我们能从 whatsapp-web.js api 层面获取到 directPath 这个字段么? 这是核心问题。 @guo40020

不能

su-chang commented 2 years ago

Related issue: https://github.com/wechaty/puppet-whatsapp/issues/171