我正在尝试使用web钩子运行Telegram bot,并且在执行任何请求时总是有相同的错误,例如https://api.telegram.org/botTOKEN/getWebhookInfo。
我的设置:
Kubernetes/Istio -> Istio网关-> nginx -> python-电报-bot
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(){
"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"。
我试过的是:
set_webhook中使用。但是不应该是这样,因为它不是自签名的证书,看起来SSL部件工作正常(可能不是)。0.0.0.0updater.idle()127.0.0.1而不是terminal127.0.0.1钩子,这个手册多次尝试将web钩子url设置为/check以便进行电报,并且它实际上会返回正确的响应(可能是因为这个端点只返回200个),但是很明显,在这个URL.后面没有机器人。
所有这些都告诉我,机器人设置本身可能有问题,但是根据python-电报- bot手册,一切看起来都是正确的。
最后但并非最不重要的一点是,如果我使用getUpdates而不是webhook,工作非常好。
因此,我不知道这个426错误在这种情况下意味着什么,也不知道如何使它工作。
标题:

发布于 2021-01-16 16:39:59
您必须显式地将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}/;
}
}发布于 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。
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';
}
}https://stackoverflow.com/questions/65751645
复制相似问题