【问题标题】:Telegram bot: Wrong response from the webhook: 426 Upgrade RequiredTelegram bot:来自 webhook 的错误响应:426 需要升级
【发布时间】:2021-04-21 09:36:37
【问题描述】:

我正在尝试使用 webhook 运行 Telegram 机器人,并且在尝试执行任何请求时总是遇到相同的错误,例如https://api.telegram.org/botTOKEN/getWebhookInfo.

我的设置:

Kubernetes/Istio -> Istio 网关 -> nginx -> python-telegram-bot

  1. 我使用 LetsEncrypt 颁发了证书,并像往常一样为子域的 Istio 网关设置它。如果我去这里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
  • 我什至尝试将 Telegram 的 webhook url 设置为 /check,它实际上返回了正确的响应(可能是因为该端点仅返回 200),但显然该 URL 后面没有机器人。

以上所有内容都告诉我,机器人设置本身可能有问题,但根据 python-telegram-bot 手册,一切看起来都是正确的。

最后但并非最不重要的一点是,如果我使用 getUpdates 而不是 webhook 机器人,则效果非常好。

所以我不知道这个 426 错误在这种情况下意味着什么以及如何使它工作。

标题:

【问题讨论】:

  • 426 的响应标头是什么?您可能需要升级 http -> https 以外的东西,比如可能是 http 版本。请参考:developer.mozilla.org/en-US/docs/Web/HTTP/Status/426
  • 我添加了带有标题的截图,不幸的是没有更新标题。
  • 如果我设置/check url,为什么我没有收到该错误?在机器人代码之前,它的处理方式相同。或者我什么都不明白。
  • 您是否有一个 inginx 服务器块正在侦听端口 443?
  • 我解决了!感谢您提及标题和问题的可能非 https 性质,这让我从不同的角度看待问题。我需要设置proxy_http_version 1.1;,否则默认为1.0。

标签: python nginx kubernetes python-telegram-bot


【解决方案1】:

您必须将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}/;
    }
}

【讨论】:

    【解决方案2】:

    问题是由 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';
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2019-07-29
      • 2021-11-03
      • 2016-07-15
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多