簡體   English   中英

Telegram bot:來自 webhook 的錯誤響應:426 需要升級

[英]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

  1. 我使用 LetsEncrypt 頒發了證書,並像往常一樣為子域的 Istio 網關設置它。 如果我在這里go https://www.ssllabs.com/ssltest/analyze.html檢查我的證書,它會返回一切都已正確設置的證書信息。

  2. 我在 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端點發出請求來檢查此設置是否與證書一起正常工作 - 一切正常。

  1. 接下來我用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()
  1. 我運行設置。 一切正常,沒有崩潰。 嘗試檢查: https://api.telegram.org/botTOKEN/getWebhookInfo並得到以下響應:
{
    "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"

我嘗試了什么:

  • 將證書從 k8s 導出到 pem 文件並在set_webhook中使用。 但事實並非如此,因為它不是自簽名證書,並且看起來 SSL 部分工作正常(也許不是)。
  • 使用127.0.0.1而不是0.0.0.0
  • 刪除updater.idle()
  • 從終端自己設置 webhook
  • 多次重讀本手冊https://core.telegram.org/bots/webhooks
  • 我什至嘗試將 webhook url 設置為/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM