Browse Source

feat: add image url in webhook (#51)

* feat: add image url in webhook

* feat: set webhook downloadable image
pull/52/head
Aldino Kemal 3 years ago
committed by GitHub
parent
commit
da063381f6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/config/settings.go
  2. 5
      src/go.mod
  3. 3
      src/go.sum
  4. 58
      src/pkg/whatsapp/whatsapp.go
  5. 2
      src/statics/media/.gitignore

3
src/config/settings.go

@ -6,7 +6,7 @@ import (
) )
var ( var (
AppVersion = "v4.4.0"
AppVersion = "v4.4.1"
AppPort = "3000" AppPort = "3000"
AppDebug = false AppDebug = false
AppOs = fmt.Sprintf("AldinoKemal") AppOs = fmt.Sprintf("AldinoKemal")
@ -15,6 +15,7 @@ var (
PathQrCode = "statics/qrcode" PathQrCode = "statics/qrcode"
PathSendItems = "statics/senditems" PathSendItems = "statics/senditems"
PathMedia = "statics/media"
PathStorages = "storages" PathStorages = "storages"
DBName = "whatsapp.db" DBName = "whatsapp.db"

5
src/go.mod

@ -11,10 +11,12 @@ require (
github.com/h2non/bimg v1.1.9 github.com/h2non/bimg v1.1.9
github.com/markbates/pkger v0.17.1 github.com/markbates/pkger v0.17.1
github.com/mattn/go-sqlite3 v1.14.16 github.com/mattn/go-sqlite3 v1.14.16
github.com/sirupsen/logrus v1.9.0
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/spf13/cobra v1.6.1 github.com/spf13/cobra v1.6.1
github.com/stretchr/testify v1.8.0 github.com/stretchr/testify v1.8.0
github.com/valyala/fasthttp v1.43.0 github.com/valyala/fasthttp v1.43.0
go.mau.fi/libsignal v0.0.0-20221015105917-d970e7c3c9cf
go.mau.fi/whatsmeow v0.0.0-20221213225758-70ef67df3c68 go.mau.fi/whatsmeow v0.0.0-20221213225758-70ef67df3c68
google.golang.org/protobuf v1.28.1 google.golang.org/protobuf v1.28.1
) )
@ -35,12 +37,11 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.3 // indirect github.com/rivo/uniseg v0.4.3 // indirect
github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/tcplisten v1.0.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect
go.mau.fi/libsignal v0.0.0-20221015105917-d970e7c3c9cf // indirect
golang.org/x/crypto v0.4.0 // indirect golang.org/x/crypto v0.4.0 // indirect
golang.org/x/sys v0.3.0 // indirect golang.org/x/sys v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )

3
src/go.sum

@ -696,8 +696,9 @@ golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=

58
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/config"
"github.com/aldinokemal/go-whatsapp-web-multidevice/internal/websocket" "github.com/aldinokemal/go-whatsapp-web-multidevice/internal/websocket"
pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error" pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error"
"github.com/sirupsen/logrus"
"go.mau.fi/whatsmeow" "go.mau.fi/whatsmeow"
"go.mau.fi/whatsmeow/appstate" "go.mau.fi/whatsmeow/appstate"
waProto "go.mau.fi/whatsmeow/binary/proto" waProto "go.mau.fi/whatsmeow/binary/proto"
@ -198,19 +199,12 @@ func handler(rawEvt interface{}) {
img := evt.Message.GetImageMessage() img := evt.Message.GetImageMessage()
if img != nil { if img != nil {
data, err := cli.Download(img)
path, err := DownloadImage(config.PathStorages, img)
if err != nil { if err != nil {
log.Errorf("Failed to download image: %v", err) log.Errorf("Failed to download image: %v", err)
return
}
exts, _ := mime.ExtensionsByType(img.GetMimetype())
path := fmt.Sprintf("%s/%s%s", config.PathStorages, evt.Info.ID, exts[0])
err = os.WriteFile(path, data, 0600)
if err != nil {
log.Errorf("Failed to save image: %v", err)
return
} else {
log.Infof("Image downloaded to %s", path)
} }
log.Infof("Saved image in message to %s", path)
} }
if config.WhatsappAutoReplyMessage != "" && !isGroupJid(evt.Info.Chat.String()) { if config.WhatsappAutoReplyMessage != "" && !isGroupJid(evt.Info.Chat.String()) {
@ -218,9 +212,9 @@ func handler(rawEvt interface{}) {
} }
if config.WhatsappAutoReplyWebhook != "" && !isGroupJid(evt.Info.Chat.String()) { if config.WhatsappAutoReplyWebhook != "" && !isGroupJid(evt.Info.Chat.String()) {
go func() {
_ = sendAutoReplyWebhook(evt)
}()
if err := sendAutoReplyWebhook(evt); err != nil {
logrus.Error("Failed to send webhoook", err)
}
} }
case *events.Receipt: case *events.Receipt:
if evt.Type == events.ReceiptTypeRead || evt.Type == events.ReceiptTypeReadSelf { if evt.Type == events.ReceiptTypeRead || evt.Type == events.ReceiptTypeReadSelf {
@ -261,11 +255,13 @@ func handler(rawEvt interface{}) {
} }
func sendAutoReplyWebhook(evt *events.Message) error { func sendAutoReplyWebhook(evt *events.Message) error {
logrus.Info("Sending webhook to", config.WhatsappAutoReplyWebhook)
client := &http.Client{Timeout: 10 * time.Second} client := &http.Client{Timeout: 10 * time.Second}
imageMedia := evt.Message.GetImageMessage()
body := map[string]any{ body := map[string]any{
"from": evt.Info.SourceString(), "from": evt.Info.SourceString(),
"message": evt.Message.GetConversation(), "message": evt.Message.GetConversation(),
"image": evt.Message.GetImageMessage(),
"image": imageMedia,
"video": evt.Message.GetVideoMessage(), "video": evt.Message.GetVideoMessage(),
"audio": evt.Message.GetAudioMessage(), "audio": evt.Message.GetAudioMessage(),
"document": evt.Message.GetDocumentMessage(), "document": evt.Message.GetDocumentMessage(),
@ -278,16 +274,27 @@ func sendAutoReplyWebhook(evt *events.Message) error {
"contact": evt.Message.GetContactMessage(), "contact": evt.Message.GetContactMessage(),
"forwarded": evt.Message.GetGroupInviteMessage(), "forwarded": evt.Message.GetGroupInviteMessage(),
} }
postBody, _ := json.Marshal(body)
req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, config.WhatsappAutoReplyWebhook, bytes.NewBuffer(postBody))
if imageMedia != nil {
path, err := DownloadImage(config.PathMedia, imageMedia)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to download image: %v", err))
}
body["image"] = path
}
postBody, err := json.Marshal(body)
if err != nil {
return pkgError.WebhookError(fmt.Sprintf("Failed to marshal body: %v", err))
}
req, err := http.NewRequest(http.MethodPost, config.WhatsappAutoReplyWebhook, bytes.NewBuffer(postBody))
if err != nil { if err != nil {
log.Errorf("error when create http object %v", err)
return pkgError.WebhookError(fmt.Sprintf("error when create http object %v", err)) return pkgError.WebhookError(fmt.Sprintf("error when create http object %v", err))
} }
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
log.Errorf("error when submit webhook %v", err)
return pkgError.WebhookError(fmt.Sprintf("error when submit webhook %v", err)) return pkgError.WebhookError(fmt.Sprintf("error when submit webhook %v", err))
} }
defer resp.Body.Close() defer resp.Body.Close()
@ -297,3 +304,18 @@ func sendAutoReplyWebhook(evt *events.Message) error {
func isGroupJid(jid string) bool { func isGroupJid(jid string) bool {
return strings.Contains(jid, "@g.us") return strings.Contains(jid, "@g.us")
} }
func DownloadImage(storageLocation string, image *waProto.ImageMessage) (path string, err error) {
data, err := cli.Download(image)
if err != nil {
return path, err
}
extensions, _ := mime.ExtensionsByType(image.GetMimetype())
path = fmt.Sprintf("%s/%d%s", storageLocation, time.Now().Unix(), extensions[0])
err = os.WriteFile(path, data, 0600)
if err != nil {
return path, err
}
return path, nil
}

2
src/statics/media/.gitignore

@ -0,0 +1,2 @@
*
!.gitignore
Loading…
Cancel
Save