按照此https://devcenter.heroku.com/articles/getting-started-with-go获取入门代码。
initTelegram()
并且webhookHandler()
是要研究的功能。
将代码部署到Heroku后,运行:
heroku logs --tail -a <YOUR-APP-NAME>
向机器人发送一些消息,您应该会看到记录的消息。
更新 1
检查您的应用程序 URL 是否与代码中的baseURL变量相同-- 运行heroku info -a <YOUR-APP-NAME>
-- 您的 URL 应该与 Web URL 相同。
更新 2
为了检查您的 Telegram API Webhooks 响应,请在您的浏览器中 ping 此地址:https://api.telegram.org/bot<YOUR BOT TOKEN GOES HERE>/getWebhookInfo
您应该bot
在该地址字符串中连接字符串和您的实际 Telegram Bot Token。
或者,如果您不在 Heroku 上运行代码,curl
则可以根据Official Telegram API Reference选择从终端运行:
$ curl -F "url=https://your.domain.or.ip.com" -F "certificate=@/etc/ssl/certs/bot.pem" https://api.telegram.org/bot<YOUR BOT TOKEN GOES HERE>/setWebhook
编码:
package main
import (
"encoding/json"
"io"
"io/ioutil"
"log"
"os"
"github.com/gin-gonic/gin"
"gopkg.in/telegram-bot-api.v4"
_ "github.com/heroku/x/hmetrics/onload"
_ "github.com/lib/pq"
)
var (
bot *tgbotapi.BotAPI
botToken = "<YOUR BOT TOKEN GOES HERE>"
baseURL = "https://<YOUR-APP-NAME>.herokuapp.com/"
)
func initTelegram() {
var err error
bot, err = tgbotapi.NewBotAPI(botToken)
if err != nil {
log.Println(err)
return
}
// this perhaps should be conditional on GetWebhookInfo()
// only set webhook if it is not set properly
url := baseURL + bot.Token
_, err = bot.SetWebhook(tgbotapi.NewWebhook(url))
if err != nil {
log.Println(err)
}
}
func webhookHandler(c *gin.Context) {
defer c.Request.Body.Close()
bytes, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
log.Println(err)
return
}
var update tgbotapi.Update
err = json.Unmarshal(bytes, &update)
if err != nil {
log.Println(err)
return
}
// to monitor changes run: heroku logs --tail
log.Printf("From: %+v Text: %+v\n", update.Message.From, update.Message.Text)
}
func main() {
port := os.Getenv("PORT")
if port == "" {
log.Fatal("$PORT must be set")
}
// gin router
router := gin.New()
router.Use(gin.Logger())
// telegram
initTelegram()
router.POST("/" + bot.Token, webhookHandler)
err := router.Run(":" + port)
if err != nil {
log.Println(err)
}
}
祝好运并玩得开心点!