【问题标题】:bind: The requested address is not valid in its contextbind:请求的地址在其上下文中无效
【发布时间】:2020-12-25 22:47:00
【问题描述】:

我在 golang 上开发了一个机器人。使用 ubuntu 20.01 OS 在 vds 上启动它,效果很好,但是当我开始调试我的代码时,这是一个问题。正因为如此,我决定将我的 PC 用作 VDS:我打开了一个 8443 端口等。但是当 ma​​in.go 启动时出现错误:

listen tcp [ip]:8443: bind: The requested address is not valid in its context.

我的代码:

package main

import (
    "./configuration"
    "./get_data"
    "encoding/json"
    "fmt"
    tgBotApi "github.com/go-telegram-bot-api/telegram-bot-api"
    "io/ioutil"
    "net/http"
    "strings"
    "time"
)

var (
    NewBot, BotErr = tgBotApi.NewBotAPI(configuration.BOT_TOKEN)
)
func setWebhook(bot *tgBotApi.BotAPI) {
    webHookInfo := tgBotApi.NewWebhookWithCert(fmt.Sprintf("https://%s:%s/%s",
        configuration.BOT_HOST, configuration.BOT_PORT, configuration.BOT_TOKEN), configuration.CERT_FILE)
    _, err := bot.SetWebhook(webHookInfo)
    if err != nil {
        fmt.Println(err)
    }
}
func main () {
    fmt.Println("OK", time.Now().Unix(), time.Now(), time.Now().Weekday())
    setWebhook(NewBot)

    message := func (w http.ResponseWriter, r *http.Request) {
        text, _ := ioutil.ReadAll(r.Body)
        var botText = get_data.BotMessage{}
        _ = json.Unmarshal(text, &botText)
        chatGroup := int64(botText.Message.Chat.Id)
        botCommand := strings.Split(botText.Message.Text, "@")[0]

        /*markup := tgBotApi.InlineKeyboardMarkup{
            InlineKeyboard: [][]tgBotApi.InlineKeyboardButton{
                []tgBotApi.InlineKeyboardButton{
                    tgBotApi.InlineKeyboardButton{Text: "start"},
                },
            },
        }*/
        //reply := tgBotApi.NewEditMessageReplyMarkup(chatGroup, messageId, markup)
        var msg tgBotApi.MessageConfig
        switch botCommand {
            case "/start":
                msg = tgBotApi.NewMessage(chatGroup, helloCommandMsg())
                msg.ReplyMarkup = tgBotApi.NewReplyKeyboard(
                    []tgBotApi.KeyboardButton{catalogBtn.Btn},
                    []tgBotApi.KeyboardButton{myProfileBtn.Btn, supportBtn.Btn},
                    []tgBotApi.KeyboardButton{getLuckyBtn.Btn, rulesBtn.Btn},
                    []tgBotApi.KeyboardButton{addFundsBtn.Btn},
                )
                break
            case getLuckyBtn.Btn.Text:
                getLuckyBtn.Action(botText, NewBot)
                break
            case myProfileBtn.Btn.Text:
                myProfileBtn.Action(botText, NewBot)
                break
            case addFundsBtn.Btn.Text:
                addFundsBtn.Action(botText, NewBot)
                break
            default:
                msg = tgBotApi.NewMessage(chatGroup, unknownCommandMsg())
        }
        NewBot.Send(msg)
    }
    http.HandleFunc("/", message)
    errListenTLS := http.ListenAndServeTLS(fmt.Sprintf("%s:%s", configuration.BOT_HOST, configuration.BOT_PORT), configuration.CERT_FILE, configuration.CERT_KEY, nil)
    if errListenTLS != nil {
        fmt.Println(errListenTLS)
    }
}

配置/main_config.go:

package configuration

const (
    TELEGRAM_URL = "https://api.telegram.org/bot"
    BOT_TOKEN = MYTOKEN
    BOT_HOST = "[ip]"
    BOT_PORT = "8443"
)

配置/cert_config.go:

package configuration

const (
    CERT_FILE = "C:\\Users\\USER\\Desktop\\GOlocal\\BOTlocal\\certificates\\mybot.pem"
    CERT_KEY = "C:\\Users\\USER\\Desktop\\GOlocal\\BOTlocal\\certificates\\mybot.key"
)

我已经生成了类似本主题的证书:What is easy way to create and use a Self-Signed Certification for a Telegram Webhook?

此外,我正在尝试设置 0.0.0.0 而不是我的公共 ip,然后出现此错误:

Bad Request: bad webhook: IP address 0.0.0.0 is reserved

【问题讨论】:

  • 您绑定的IP地址必须属于您机器上的网络接口(检查ifconfig)。如果不是,则需要指定两个地址:一个用于ListenAndServe(本地地址,或0.0.0.0),另一个用于 webhook(您的公共地址)。

标签: go tcp telegram webhooks telegram-bot


【解决方案1】:

错误bind: The requested address is not valid in its context. 表示该地址不属于您机器上的网络接口。很可能,有一个路由器/负载均衡器/等...具有实际的公共地址,它正在将流量转发到您的机器。

你需要拆分你使用的地址:

  • 您的本地地址(请参阅ifconfig)或0.0.0.0 作为传递给http.ListenAndServeTLS 的所有接口的地址
  • 作为回调地址传入NewWebhookWithCert的公共地址

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多