Search code examples
gotcptelegramwebhookstelegram-bot

bind: The requested address is not valid in its context


I develop a bot on golang. Started it on vds with ubuntu 20.01 OS and it works great, but it's a problem when I'm starting to debug my code. Because of it I decide to use my PC as a VDS: I have opened a 8443 port and etc. But when main.go is started I get an error:

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

My code:

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)
    }
}

configuration/main_config.go:

package configuration

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

configuration/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"
)

I have generated the certificate like in this topic: What is easy way to create and use a Self-Signed Certification for a Telegram Webhook?

Moreover, I'm trying to set 0.0.0.0 instead my public ip and then this error comes out:

Bad Request: bad webhook: IP address 0.0.0.0 is reserved

Solution

  • The error bind: The requested address is not valid in its context. indicates that the address does not belong to a network interface on your machine. Likely, there is a router/load balancer/etc... with the actual public address and it is forwarding traffic to your machine.

    You need to split the addresses you use:

    • your local address (see ifconfig) or 0.0.0.0 for all interface as the address passed to http.ListenAndServeTLS
    • the public address as the callback address passed in NewWebhookWithCert