Я пытаюсь создать клиент tui для WhatsApp , используя whatsmeow.
После полдня поиска и чтения документов я все еще не могу найти способ получить данные разговоров отдельных контактов. Любая помощь приветствуется.
Я нашел ParseWebMessage, но не очень понимаю, как им пользоваться.
chatJID, err := types.ParseJID(conv.GetId())
for _, historyMsg := range conv.GetMessages() {
evt, err := cli.ParseWebMessage(chatJID, historyMsg.GetMessage())
yourNormalEventHandler(evt)
}
На самом деле я даже не уверен, что это то, что я ищу
Ну, вы в основном ссылаетесь на ту часть документов, которая содержит информацию, которую вы ищете. Тип возврата вызова ParseWebMessage
— events.Message
, задокументировано здесь . Он содержит поле Info
типа MessageInfo
(опять же, задокументировано здесь ). В свою очередь, этот тип MessageInfo
включает в себя тип MessageSource
см. документацию здесь, который выглядит следующим образом:
type MessageSource struct {
Chat JID // The chat where the message was sent.
Sender JID // The user who sent the message.
IsFromMe bool // Whether the message was sent by the current user instead of someone else.
IsGroup bool // Whether the chat is a group chat or broadcast list.
// When sending a read receipt to a broadcast list message, the Chat is the broadcast list
// and Sender is you, so this field contains the recipient of the read receipt.
BroadcastListOwner JID
}
Итак, чтобы получить контакт, который отправил данное сообщение, учитывая ваш код evt, err := cli.ParseWebMessage()
, вам нужно проверить:
evt, err := cli.ParseWebMessage(chatJID, historyMsg.GetMessage())
if err != nil {
// handle error, of course
}
fmt.Printf("Sender ID: %s\nSent in Chat: %s\n", evt.Info.Sender, evt.Info.Chat)
if evt.Info.IsGroup {
fmt.Printf("%s is a group chat\n", evt.Info.Chat)
}
Вы также можете пропустить отправленные вами сообщения, просто выполнив следующие действия:
if evt.Info.IsFromMe {
continue
}
Поля evt.Info.Chat
и evt.Info.Sender
относятся к типу JID
, задокументировано здесь. По сути, существует 2 варианта этого типа идентификатора: JID пользователя и сервера и AD-JID (пользователь, агент и устройство). Вы можете различить их, отметив флаг JID.AD
.
Я вообще не использовал этот модуль, я только бегло просмотрел документы, но насколько я понял, этот модуль позволяет вам написать обработчик, который будет получать тип events.Message
для всего, что вы получаете. Проверяя evt.Info.IsGroup
, вы можете определить, было ли сообщение отправлено в групповом чате или в вашем личном разговоре. На основе evt.Info.Sender
и evt.Info.Chat
вы можете определить, кто отправил сообщение. evt.Info.Sender
, являющийся JID, в свою очередь, позволяет вам вызывать метод GetUserInfo , передавая JID, который возвращает вам UserInfo
объект , как описано здесь, показывая имя, изображение, статус и т. д.
Итак, я думаю, вы ищете что-то в этом роде:
// some map of all messages from a given person, sent directly to you
contacts := cli.GetAllContacts() // returns map[JID]ContactInfo
personMsg := map[string][]*events.Message
evt, err := cli.ParseWebMessage(chatJID, historyMsg.GetMessage())
if err != nil {
// handle
}
if !evt.Info.IsFromMe && !evt.Info.IsGroup {// not a group, not sent by me
info, _ := cli.GetUserInfo([]types.JID{evt.Info.Sender})
if contact, ok := contacts[info[evt.Info.Sender]; ok {
msgs, ok := personMsg[contact.PushName]
if !ok {
msgs := []*events.Message{}
}
personMsg[contact.PushName] = append(msgs, evt)
}
}
Обратите внимание, что тип ContatInfo
не сразу появился в документах, но я наткнулся на него в репозитории.
В любом случае, я не совсем уверен, что вы пытаетесь сделать, и как/почему вы застряли. Все, что потребовалось, чтобы найти эту информацию, — это проверить тип возвращаемого значения метода ParseWebMessage
, который вы упомянули, проверить пару типов и просмотреть некоторые из перечисленных/задокументированных методов, чтобы получить общее представление о том, как вы можете получить все данные, которые вы может быть нужно...
Спасибо за подробное объяснение. мне очень нужно было это