Browse Source

fix: set downloadable webhook media url

pull/54/head
Aldino Kemal 3 years ago
parent
commit
ab749b4793
  1. 1
      src/go.mod
  2. 1
      src/go.sum
  3. 81
      src/pkg/whatsapp/whatsapp.go

1
src/go.mod

@ -8,6 +8,7 @@ require (
github.com/gofiber/fiber/v2 v2.40.1
github.com/gofiber/template v1.7.3
github.com/gofiber/websocket/v2 v2.1.2
github.com/google/uuid v1.3.0
github.com/h2non/bimg v1.1.9
github.com/markbates/pkger v0.17.1
github.com/mattn/go-sqlite3 v1.14.16

1
src/go.sum

@ -218,6 +218,7 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=

81
src/pkg/whatsapp/whatsapp.go

@ -8,6 +8,7 @@ import (
"github.com/aldinokemal/go-whatsapp-web-multidevice/config"
"github.com/aldinokemal/go-whatsapp-web-multidevice/internal/websocket"
pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
"go.mau.fi/whatsmeow"
"go.mau.fi/whatsmeow/appstate"
@ -199,7 +200,7 @@ func handler(rawEvt interface{}) {
img := evt.Message.GetImageMessage()
if img != nil {
path, err := DownloadImage(config.PathStorages, img)
path, err := DownloadMedia(config.PathStorages, img)
if err != nil {
log.Errorf("Failed to download image: %v", err)
} else {
@ -211,7 +212,7 @@ func handler(rawEvt interface{}) {
_, _ = cli.SendMessage(context.Background(), evt.Info.Sender, "", &waProto.Message{Conversation: proto.String(config.WhatsappAutoReplyMessage)})
}
if config.WhatsappAutoReplyWebhook != "" && !isGroupJid(evt.Info.Chat.String()) {
if config.WhatsappAutoReplyWebhook != "" && !isGroupJid(evt.Info.Chat.String()) && !strings.Contains(evt.Info.SourceString(), "in") {
if err := sendAutoReplyWebhook(evt); err != nil {
logrus.Error("Failed to send webhoook", err)
}
@ -258,15 +259,20 @@ func sendAutoReplyWebhook(evt *events.Message) error {
logrus.Info("Sending webhook to", config.WhatsappAutoReplyWebhook)
client := &http.Client{Timeout: 10 * time.Second}
imageMedia := evt.Message.GetImageMessage()
stickerMedia := evt.Message.GetStickerMessage()
videoMedia := evt.Message.GetVideoMessage()
audioMedia := evt.Message.GetAudioMessage()
documentMedia := evt.Message.GetDocumentMessage()
body := map[string]any{
"from": evt.Info.SourceString(),
"message": evt.Message.GetConversation(),
"image": imageMedia,
"video": evt.Message.GetVideoMessage(),
"audio": evt.Message.GetAudioMessage(),
"document": evt.Message.GetDocumentMessage(),
"video": videoMedia,
"audio": audioMedia,
"document": documentMedia,
"location": evt.Message.GetLocationMessage(),
"sticker": evt.Message.GetStickerMessage(),
"sticker": stickerMedia,
"live_location": evt.Message.GetLiveLocationMessage(),
"view_once": evt.Message.GetViewOnceMessage(),
"list": evt.Message.GetListMessage(),
@ -276,13 +282,41 @@ func sendAutoReplyWebhook(evt *events.Message) error {
}
if imageMedia != nil {
path, err := DownloadImage(config.PathMedia, imageMedia)
path, err := DownloadMedia(config.PathMedia, imageMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download image: %v", err))
}
body["image"] = path
}
if stickerMedia != nil {
path, err := DownloadMedia(config.PathMedia, stickerMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download sticker: %v", err))
}
body["sticker"] = path
}
if videoMedia != nil {
path, err := DownloadMedia(config.PathMedia, videoMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download video: %v", err))
}
body["video"] = path
}
if audioMedia != nil {
path, err := DownloadMedia(config.PathMedia, audioMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download audio: %v", err))
}
body["audio"] = path
}
if documentMedia != nil {
path, err := DownloadMedia(config.PathMedia, documentMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download document: %v", err))
}
body["document"] = path
}
postBody, err := json.Marshal(body)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to marshal body: %v", err))
@ -293,11 +327,9 @@ func sendAutoReplyWebhook(evt *events.Message) error {
return pkgError.WebhookError(fmt.Sprintf("error when create http object %v", err))
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
if _, err = client.Do(req); err != nil {
return pkgError.WebhookError(fmt.Sprintf("error when submit webhook %v", err))
}
defer resp.Body.Close()
return nil
}
@ -305,14 +337,33 @@ func isGroupJid(jid string) bool {
return strings.Contains(jid, "@g.us")
}
func DownloadImage(storageLocation string, image *waProto.ImageMessage) (path string, err error) {
data, err := cli.Download(image)
func DownloadMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessage) (path string, err error) {
if mediaFile == nil {
logrus.Info("Skip download because data is nil")
return "", nil
}
data, err := cli.Download(mediaFile)
if err != nil {
return path, err
}
extensions, _ := mime.ExtensionsByType(image.GetMimetype())
path = fmt.Sprintf("%s/%d%s", storageLocation, time.Now().Unix(), extensions[0])
var mimeType string
switch media := mediaFile.(type) {
case *waProto.ImageMessage:
mimeType = media.GetMimetype()
case *waProto.AudioMessage:
mimeType = media.GetMimetype()
case *waProto.VideoMessage:
mimeType = media.GetMimetype()
case *waProto.StickerMessage:
mimeType = media.GetMimetype()
case *waProto.DocumentMessage:
mimeType = media.GetMimetype()
}
extensions, _ := mime.ExtensionsByType(mimeType)
path = fmt.Sprintf("%s/%d-%s%s", storageLocation, time.Now().Unix(), uuid.NewString(), extensions[0])
err = os.WriteFile(path, data, 0600)
if err != nil {
return path, err

Loading…
Cancel
Save