绑定:请求的地址在其上下文中无效
bind: The requested address is not valid in its context
我在 golang 上开发了一个机器人。使用 ubuntu 20.01 OS 在 vds 上启动它,它运行良好,但是当我开始调试我的代码时,这是一个问题。因此,我决定将我的 PC 用作 VDS:我已经打开了 8443 端口等。但是当 main.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)
}
}
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"
)
我已经生成了本主题中的证书:
此外,我试图设置 0.0.0.0 而不是我的 public ip 然后出现此错误:
Bad Request: bad webhook: IP address 0.0.0.0 is reserved
错误bind: The requested address is not valid in its context.
表示该地址不属于您机器上的网络接口。可能有一个 router/load balancer/etc... 具有实际的 public 地址,它正在将流量转发到您的计算机。
您需要拆分您使用的地址:
- 您的本地地址(参见
ifconfig
)或 0.0.0.0
所有接口作为传递给 http.ListenAndServeTLS
的地址
- public地址作为回调地址传入
NewWebhookWithCert
我在 golang 上开发了一个机器人。使用 ubuntu 20.01 OS 在 vds 上启动它,它运行良好,但是当我开始调试我的代码时,这是一个问题。因此,我决定将我的 PC 用作 VDS:我已经打开了 8443 端口等。但是当 main.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)
}
}
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"
)
我已经生成了本主题中的证书:
此外,我试图设置 0.0.0.0 而不是我的 public ip 然后出现此错误:
Bad Request: bad webhook: IP address 0.0.0.0 is reserved
错误bind: The requested address is not valid in its context.
表示该地址不属于您机器上的网络接口。可能有一个 router/load balancer/etc... 具有实际的 public 地址,它正在将流量转发到您的计算机。
您需要拆分您使用的地址:
- 您的本地地址(参见
ifconfig
)或0.0.0.0
所有接口作为传递给http.ListenAndServeTLS
的地址
- public地址作为回调地址传入
NewWebhookWithCert