【发布时间】:2021-04-21 09:36:37
【问题描述】:
我正在尝试使用 webhook 运行 Telegram 机器人,并且在尝试执行任何请求时总是遇到相同的错误,例如https://api.telegram.org/botTOKEN/getWebhookInfo.
我的设置:
Kubernetes/Istio -> Istio 网关 -> nginx -> python-telegram-bot
-
我使用 LetsEncrypt 颁发了证书,并像往常一样为子域的 Istio 网关设置它。如果我去这里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()
- 我运行安装程序。一切正常,没有崩溃。尝试检查: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
-
我添加了带有标题的截图,不幸的是没有更新标题。
-
如果我设置
/checkurl,为什么我没有收到该错误?在机器人代码之前,它的处理方式相同。或者我什么都不明白。 -
您是否有一个 inginx 服务器块正在侦听端口 443?
-
我解决了!感谢您提及标题和问题的可能非 https 性质,这让我从不同的角度看待问题。我需要设置
proxy_http_version 1.1;,否则默认为1.0。
标签: python nginx kubernetes python-telegram-bot