6

go-telegram-bot-api用于构建 Telegram Bot 并将其部署在Heroku上。

我需要像以前在 Python 中那样设置 Webhooks,就像在这个 Python 案例中一样。

go-telegram-bot-api在不提供证书文件的情况下无法理解如何设置 Webhook 。

主要示例包含这样的行:

如果您需要使用 webhook(如果您希望在 Google App Engine 上运行),您可以使用稍微不同的方法。

package main

import (
    "gopkg.in/telegram-bot-api.v4"
    "log"
    "net/http"
)

func main() {
    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.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem"))
    if err != nil {
        log.Fatal(err)
    }

    updates := bot.ListenForWebhook("/" + bot.Token)
    go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil)

    for update := range updates {
        log.Printf("%+v\n", update)
    }
}

但是使用 Heroku 进行部署pem我怎么能在不提供证书文件的情况下收听 Webhooks ?

4

2 回答 2

4

按照此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)
    }
}

祝好运并玩得开心点!

于 2017-11-17T23:00:38.657 回答
3

如果您将 Heroku 用于您的机器人,则不需要证书。Heroku 提供免费的 SSL 证书。因此,您将应用程序的 URL 放入方案中,并在heroku 为您的应用程序设置https的 HTTP 服务器上进行侦听。PORT请参阅下面的示例以更好地理解。

func main() {
    // Create bot instance
    u := fetchUpdates(bot)

    go http.ListenAndServe(":" + PORT, nil)
}

func fetchUpdates(bot *tgbotapi.BotAPI) tgbotapi.UpdatesChannel {
    _, err = bot.SetWebhook(tgbotapi.NewWebhook("https://dry-hamlet-60060.herokuapp.com/instagram_profile_bot/" + bot.Token))
    if err != nil {
        fmt.Fatalln("Problem in setting Webhook", err.Error())
    }

    updates := bot.ListenForWebhook("/instagram_profile_bot/" + bot.Token)

    return updates
}
于 2017-11-17T11:07:39.857 回答