Fix bug with update channel closing, add ListenForWebhookRespReqFormat method, for using in serverless apps, add example to README.md, add exaple pf a published bot on AWS Lambda

bot-api-6.1
farit2000 2020-11-27 11:24:41 +03:00
parent 54104a08f9
commit 18031c85e5
2 changed files with 90 additions and 0 deletions

View File

@ -110,6 +110,74 @@ func main() {
} }
``` ```
If you need to publish your bot on AWS Lambda(or something like it) and AWS API Gateway,
you can use such example:
In this code used AWS Lambda Go net/http server adapter [algnhsa](https://github.com/akrylysov/algnhsa)
```go
package main
import (
"github.com/akrylysov/algnhsa"
"github.com/go-telegram-bot-api/telegram-bot-api"
"log"
"net/http"
)
func answer(w http.ResponseWriter, r *http.Request) {
bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
if err != nil {
log.Fatal(err)
}
bot.Debug = true
updates := bot.ListenForWebhookRespReqFormat(w, r)
for update := range updates {
if update.Message == nil {
continue
}
log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
msg.ReplyToMessageID = update.Message.MessageID
_, err := bot.Send(msg)
if err != nil {
log.Printf("Error send message: %s | Error: %s", msg.Text, err.Error())
}
}
}
func setWebhook(_ http.ResponseWriter, _ *http.Request) {
bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
if err != nil {
log.Fatal(err)
}
bot.Debug = true
log.Printf("Authorized on account %s", bot.Self.UserName)
_, err = bot.SetWebhook(tgbotapi.NewWebhook("https://your_api_gateway_address.com/"+bot.Token))
if err != nil {
log.Fatal(err)
}
info, err := bot.GetWebhookInfo()
if err != nil {
log.Fatal(err)
}
if info.LastErrorDate != 0 {
log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
}
}
func main() {
http.HandleFunc("/set_webhook", setWebhook)
http.HandleFunc("/MyAwesomeBotToken", answer)
algnhsa.ListenAndServe(http.DefaultServeMux, nil)
}
```
If you need, you may generate a self signed certficate, as this requires If you need, you may generate a self signed certficate, as this requires
HTTPS / TLS. The above example tells Telegram that this is your HTTPS / TLS. The above example tells Telegram that this is your
certificate and that it should be trusted, even though it is not certificate and that it should be trusted, even though it is not

22
bot.go
View File

@ -567,11 +567,33 @@ func (bot *BotAPI) ListenForWebhook(pattern string) UpdatesChannel {
} }
ch <- *update ch <- *update
close(ch)
}) })
return ch return ch
} }
// ListenForWebhookRespReqFormat registers a http handler for a webhook.
func (bot *BotAPI) ListenForWebhookRespReqFormat(w http.ResponseWriter, r *http.Request) UpdatesChannel {
ch := make(chan Update, bot.Buffer)
func(w http.ResponseWriter, r *http.Request) {
update, err := bot.HandleUpdate(r)
if err != nil {
errMsg, _ := json.Marshal(map[string]string{"error": err.Error()})
w.WriteHeader(http.StatusBadRequest)
w.Header().Set("Content-Type", "application/json")
_, _ = w.Write(errMsg)
return
}
ch <- *update
close(ch)
}(w, r)
return ch
}
// HandleUpdate parses and returns update received via webhook // HandleUpdate parses and returns update received via webhook
func (bot *BotAPI) HandleUpdate(r *http.Request) (*Update, error) { func (bot *BotAPI) HandleUpdate(r *http.Request) (*Update, error) {
if r.Method != http.MethodPost { if r.Method != http.MethodPost {