diff --git a/readme.md b/readme.md index a49c4e0..c96c326 100644 --- a/readme.md +++ b/readme.md @@ -13,6 +13,8 @@ - `--debug true` - Auto reply message - `--autoreply="Don't reply this message"` +- Weebhook for receive message + - --webhook="http://yourwebhook.site/handler" ### Required (without docker) diff --git a/src/cmd/root.go b/src/cmd/root.go index d66b01d..87f4d02 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -37,6 +37,7 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&config.AppDebug, "debug", "d", config.AppDebug, "hide or displaying log with --debug | example: --debug=true") rootCmd.PersistentFlags().StringVarP(&config.AppBasicAuthCredential, "basic-auth", "b", config.AppBasicAuthCredential, "basic auth credential | yourUsername:yourPassword") rootCmd.PersistentFlags().StringVarP(&config.WhatsappAutoReplyMessage, "autoreply", "", config.WhatsappAutoReplyMessage, `auto reply when received message --autoreply | example: --autoreply="Don't reply this message"`) + rootCmd.PersistentFlags().StringVarP(&config.WhatsappAutoReplyWebhook, "webhook", "w", config.WhatsappAutoReplyMessage, `auto reply when received message --webhook | example: --webhook="https://yourcallback.com/callback"`) } func runRest(cmd *cobra.Command, args []string) { diff --git a/src/config/settings.go b/src/config/settings.go index af23098..0de12b2 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -8,7 +8,7 @@ import ( type Browser string var ( - AppVersion string = "v3.5.1" + AppVersion string = "v3.6.0" AppPort string = "3000" AppDebug bool = false AppOs string = fmt.Sprintf("AldinoKemal") @@ -22,6 +22,7 @@ var ( WhatsappLogLevel string = "ERROR" WhatsappAutoReplyMessage string + WhatsappAutoReplyWebhook string WhatsappSettingMaxFileSize int64 = 30000000 // 10MB WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB ) diff --git a/src/utils/whatsapp.go b/src/utils/whatsapp.go index 3b7d363..a2be5b4 100644 --- a/src/utils/whatsapp.go +++ b/src/utils/whatsapp.go @@ -1,6 +1,7 @@ package utils import ( + "bytes" "context" "encoding/json" "fmt" @@ -15,6 +16,7 @@ import ( waLog "go.mau.fi/whatsmeow/util/log" "google.golang.org/protobuf/proto" "mime" + "net/http" "os" "strings" "sync/atomic" @@ -181,6 +183,12 @@ func handler(rawEvt interface{}) { if config.WhatsappAutoReplyMessage != "" { _, _ = cli.SendMessage(context.Background(), evt.Info.Sender, "", &waProto.Message{Conversation: proto.String(config.WhatsappAutoReplyMessage)}) } + + if config.WhatsappAutoReplyWebhook != "" { + go func() { + _ = sendAutoReplyWebhook(evt) + }() + } case *events.Receipt: if evt.Type == events.ReceiptTypeRead || evt.Type == events.ReceiptTypeReadSelf { log.Infof("%v was read by %s at %s", evt.MessageIDs, evt.SourceString(), evt.Timestamp) @@ -218,3 +226,37 @@ func handler(rawEvt interface{}) { log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue) } } + +func sendAutoReplyWebhook(evt *events.Message) error { + client := &http.Client{Timeout: 10 * time.Second} + body := map[string]interface{}{ + "from": evt.Info.SourceString(), + "message": evt.Message.GetConversation(), + "image": evt.Message.GetImageMessage(), + "video": evt.Message.GetVideoMessage(), + "audio": evt.Message.GetAudioMessage(), + "document": evt.Message.GetDocumentMessage(), + "location": evt.Message.GetLocationMessage(), + "sticker": evt.Message.GetStickerMessage(), + "live_location": evt.Message.GetLiveLocationMessage(), + "view_once": evt.Message.GetViewOnceMessage(), + "list": evt.Message.GetListMessage(), + "order": evt.Message.GetOrderMessage(), + "contact": evt.Message.GetContactMessage(), + "forwarded": evt.Message.GetGroupInviteMessage(), + } + postBody, _ := json.Marshal(body) + req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, config.WhatsappAutoReplyWebhook, bytes.NewBuffer(postBody)) + if err != nil { + log.Errorf("error when create http object %v", err) + return err + } + req.Header.Set("Content-Type", "application/json") + resp, err := client.Do(req) + if err != nil { + log.Errorf("error when submit webhook %v", err) + return err + } + defer resp.Body.Close() + return nil +}