首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >电报机器人:来自web钩子的错误响应:需要426次升级

电报机器人:来自web钩子的错误响应:需要426次升级
EN

Stack Overflow用户
提问于 2021-01-16 16:06:23
回答 2查看 633关注 0票数 0

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

我的设置:

Kubernetes/Istio -> Istio网关-> nginx -> python-电报-bot

  1. ,我与LetsEncrypt一起颁发了一个证书,并将它设置为Istio网关的子域,就像往常一样。如果我到这里https://www.ssllabs.com/ssltest/analyze.html检查我的证书,它会返回所有设置都是正确的,并且我可以看到证书信息。

  1. ,我在istio网关后面安装了nginx (它已经用于其他端点,所以我只需添加以下规则)。网关将443端口转发给nginx 80:

代码语言:javascript
运行
复制
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安装了一个机器人

代码语言:javascript
运行
复制
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并得到以下响应:

代码语言:javascript
运行
复制
{
    "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部件工作正常(可能不是)。0.0.0.0
  • remove updater.idle()
  • Setting
  • 使用127.0.0.1而不是terminal
  • Reread中的127.0.0.1钩子,这个手册多次尝试将web钩子url设置为/check以便进行电报,并且它实际上会返回正确的响应(可能是因为这个端点只返回200个),但是很明显,在这个URL.

后面没有机器人。

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

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

因此,我不知道这个426错误在这种情况下意味着什么,也不知道如何使它工作。

标题:

EN

回答 2

Stack Overflow用户

发布于 2021-01-16 16:39:59

您必须显式地将proxy_http_version设置为1.1才能使其工作,否则默认使用1.0。

代码语言:javascript
运行
复制
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}/;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-16 17:08:40

这个问题是由nginx .Every请求引起的,这些请求通过nginx传递给您的python-电-bot将返回HTTP状态"426升级所需“。默认情况下, Nginx 仍然对上游连接使用HTTP/1.0,而通过特使代理的istio不支持HTTP/1.0,因此您需要强制Nginx对上游连接使用HTTP/1.1。

代码语言:javascript
运行
复制
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';
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65751645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档