我正在尝试使用webhook运行Telegram bot,并且在尝试执行任何请求(例如https://api.telegram.org/botTOKEN/getWebhookInfo)时总是出现相同的错误
我的设置:
Kubernetes/Istio -> Istio Gateway -> 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
设置一个botbot = 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
}
}
没有可用的bot应用程序日志。Nginx日志只显示一般的一行错误:"POST /TOKEN HTTP/1.1" 426 0 "-" "-" "10.244.1.13"
我尝试的是:
set_webhook
中使用它。但情况不应该是这样,因为它不是自签名证书,看起来SSL部分工作正常(可能不是)李>127.0.0.1
代替0.0.0.0
updater.idle()
/check
,它实际上返回正确的响应(可能是因为该端点仅返回200),但显然在该url后面没有bot李>所有这些都告诉我,机器人设置本身可能有问题,但根据python telegram机器人手册,一切看起来都是正确的
最后但并非最不重要的一点是,如果我使用getUpdates
而不是webhook bot,那么它的工作效果非常好
因此,我不知道426错误在这种情况下意味着什么,以及如何使其工作
该问题是由nginx引起的。通过nginx传递到python telegram bot的每个请求都将返回HTTP状态“426需要升级”。默认情况下,nginx仍然使用HTTP/1.0进行上游连接,而通过特使代理的istio不支持HTTP/1.0 因此,您需要强制Nginx对上游连接使用HTTP/1.1
必须将
proxy_http_version
显式设置为1.1才能使其工作,否则默认情况下它使用1.0相关问题 更多 >
编程相关推荐