[英]Telegram bot: Wrong response from the webhook: 426 Upgrade Required
我正在嘗試使用 webhook 運行 Telegram bot,並且在嘗試執行任何請求時總是遇到相同的錯誤,例如https://api.telegram.org/botTOKEN/getWebhookInfo 。
我的設置:
Kubernetes/Istio -> Istio 網關 -> nginx -> python-telegram-bot
我使用 LetsEncrypt 頒發了證書,並像往常一樣為子域的 Istio 網關設置它。 如果我在這里go https://www.ssllabs.com/ssltest/analyze.html檢查我的證書,它會返回一切都已正確設置的證書信息。
我在 istio 網關后面設置了 nginx(它已經用於其他端點,所以我只需添加以下規則)。 網關轉發443端口到nginx 80:
server {
listen 80;
server_name DOMAIN;
location /${TG_BOT_TOKEN} {
proxy_pass http://pp-telegram-bot.default.svc.cluster.local:8000/${TG_BOT_TOKEN}/;
}
location /check {
return 200 'true';
}
}
我通過使用 https 向/check
端點發出請求來檢查此設置是否與證書一起正常工作 - 一切正常。
python-telegram-bot
設置一個機器人bot = telegram.Bot(token=TG_BOT_TOKEN)
def main():
updater = Updater(bot=bot, use_context=True)
dispatcher = updater.dispatcher
# add handlers
updater.start_webhook(listen='0.0.0.0', port=8000, url_path=TG_BOT_TOKEN)
updater.bot.set_webhook(f'https://{DOMAIN}/{TG_BOT_TOKEN}')
updater.idle()
if __name__ == '__main__':
main()
{
"ok": true,
"result": {
"url": "https://DOMAIN/TOKEN",
"has_custom_certificate": false,
"pending_update_count": 1,
"last_error_date": 1610810736,
"last_error_message": "Wrong response from the webhook: 426 Upgrade Required",
"max_connections": 40,
"ip_address": IP_ADDRESS
}
}
沒有可用的機器人應用程序日志。 Nginx 日志僅顯示一般的一行錯誤: "POST /TOKEN HTTP/1.1" 426 0 "-" "-" "10.244.1.13"
我嘗試了什么:
set_webhook
中使用。 但事實並非如此,因為它不是自簽名證書,並且看起來 SSL 部分工作正常(也許不是)。127.0.0.1
而不是0.0.0.0
updater.idle()
/check
for Telegram,它實際上統計返回正確的響應(可能是因為該端點僅返回 200)但顯然 URL 后面沒有機器人。以上所有內容都告訴我,機器人設置本身可能有問題,但根據 python-telegram-bot 手冊,一切看起來都是正確的。
最后但並非最不重要的一點是,如果我使用getUpdates
而不是 webhook bot 工作得很好。
所以我不知道這個 426 錯誤在這種情況下意味着什么以及如何使它工作。
您必須將proxy_http_version
顯式設置為 1.1 才能使其工作,否則默認使用 1.0。
server {
listen 80;
server_name DOMAIN;
location /${TG_BOT_TOKEN} {
proxy_http_version 1.1;
proxy_pass http://pp-telegram-bot.default.svc.cluster.local:8000/${TG_BOT_TOKEN}/;
}
}
問題是由 nginx 引起的。通過 nginx 傳遞到您的 python-telegram-bot 的每個請求都將返回 HTTP 狀態“426 需要升級”。 默認情況下, nginx仍然使用 HTTP/1.0 進行上游連接,而通過 envoy 代理的istio不支持 HTTP/1.0,因此您需要強制 Nginx 使用 HTTP/1.1 進行上游連接。
server {
listen 80;
server_name DOMAIN;
location /${TG_BOT_TOKEN} {
proxy_pass http://pp-telegram-bot:8000/${TG_BOT_TOKEN}/;
proxy_http_version 1.1; # there is will force 1.1
}
location /check {
return 200 'true';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.