电报机器人:来自webhook的错误响应:需要426升级

2024-06-11 22:42:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用webhook运行Telegram bot,并且在尝试执行任何请求(例如https://api.telegram.org/botTOKEN/getWebhookInfo)时总是出现相同的错误

我的设置:

Kubernetes/Istio -> Istio Gateway -> 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
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
    }
}

没有可用的bot应用程序日志。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后面没有bot

所有这些都告诉我,机器人设置本身可能有问题,但根据python telegram机器人手册,一切看起来都是正确的

最后但并非最不重要的一点是,如果我使用getUpdates而不是webhook bot,那么它的工作效果非常好

因此,我不知道426错误在这种情况下意味着什么,以及如何使其工作

标题: enter image description here


Tags: httpsorgtokenurl网关bot错误nginx
2条回答

该问题是由nginx引起的。通过nginx传递到python telegram bot的每个请求都将返回HTTP状态“426需要升级”。默认情况下,nginx仍然使用HTTP/1.0进行上游连接,而通过特使代理的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';
        }
    }

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

相关问题 更多 >