当前位置: 首页 > 知识库问答 >
问题:

为什么我无法在用Flask(Python)编写的电报机器人上收到任何POST请求?

拓拔麒
2023-03-14

我不想使用getUpdate方法从Telegram检索更新,而是使用网络钩子。

getWebhookInfo的错误是:

has_custom_certificate: false,
pending_update_count: 20,
last_error_date: 1591888018,
last_error_message: "SSL error {error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed}"

我的代码是:

from flask import Flask
from flask import request
from flask import Response

app = Flask(__name__)

@app.route('/', methods=['POST', 'GET']) 
def bot():
    if request.method == 'POST':
        return Response('Ok', status=200)
    else:
        return f'--- GET request ----'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port='8443', debug=True, ssl_context=('./contract.crt', '.private.key'))

当我点击https://www.mydomain.ext:8443/时,当我在telegram-bot chat上写东西时,我可以看到收到请求,但不能发布请求,这也是我如何为telegram设置webhook的原因,如下所示:

https://api.telegram.org/botNUMBER:TELEGRAM_KEY/setWebhook?url=https://www.mydomain.ext:8443

结果:

{
  ok: true,
  result: true,
  description: "Webhook was set"
}

有什么建议或我做错了什么事吗?

https://core.telegram.org/bots/api#setwebhook

我想知道这个问题是否是因为我使用的是0.0.0.0,原因是如果我使用127.0.0.0,则无法访问url / www.mydomain.ext

更新

ca_certitificate = {'certificate': open('./folder/ca.ca-bundle', 'rb')}
r = requests.post(url, files=ca_certitificate)
print(r.text)

那张照片给了我:

{
  "ok": false,
  "error_code": 400,
  "description": "Bad Request: bad webhook: Failed to set custom certificate file"
 }

共有3个答案

淳于慎之
2023-03-14

我也有类似的情况。我在localhost上开发bot(但没有SSL ),并通过ngrok将它传输到web。开始的时候一切都很好,但是有一次我发现没有邮件请求。原来挖隧道的时间到了。我笑着重新开始挖隧道。但是请求没有来。结果是,我忘了更改webhook的地址(它会在每个ngrok会话中切换)。不要重复我的错误。

濮阳宏硕
2023-03-14

电报机器人仅适用于全链证书。以及getWebHookInfo中的错误:

"last_error_message":"SSL error {337047686, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed}"

Telegram是否说它需要整个证书链(也称为CA Bundle或全链证书)。正如问题中的回答。

如果您使用SSLlabs验证您的证书,您会发现您的域存在链问题:

https://www.ssllabs.com/ssltest/analyze.html?d=www.vallotta-party-bot.com

要解决此需求,您需要设置CA证书。这样,您需要通过 CA 提供程序查找 CA 证书文件。

此外,最好的选择是在生产现场使用枪械而不是烧瓶。

如果您正在使用gunicorn,您可以使用命令行参数来完成此操作:

$ gunicorn --certfile cert.pem --keyfile key.pem --ca_certs cert.ca-bundle -b 0.0.0.0:443 hello:app

或者创建一个包含以下内容的< code>gunicorn.py:

import multiprocessing

bind = "0.0.0.0:443"

workers = multiprocessing.cpu_count() * 2 + 1

timeout = 120

certfile = "cert/certfile.crt"

keyfile = "cert/service-key.pem"

ca_certs = "cert/cert.ca-bundle"

loglevel = 'info'

并按如下方式运行:

gunicorn --config=gunicorn.py hello:app

如果您使用Nginx作为反向代理,那么您可以使用Nginx配置证书,然后Nginx可以“终止”加密连接,这意味着它将接受来自外部的加密连接,但随后使用常规的未加密连接与Flask后端通信。这是一个非常有用的设置,因为它使您的应用程序不必处理证书和加密。Nginx的配置项如下:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    # ...
}

您需要考虑的另一个重要问题是如何处理通过常规HTTP连接的客户端。在我看来,最好的解决方案是通过重定向到相同的URL(但在HTTPS上)来响应未加密的请求。对于Flask应用程序,您可以使用Flask-SSLify扩展来实现这一点。使用Nginx,您可以在配置中包含另一个服务器块:

server {
    listen 80;
    server_name example.com;
    location / {
        return 301 https://$host$request_uri;
    }
}

关于如何使用https设置应用程序的一个很好的教程可以在这里找到:通过https运行Flask应用程序

堵才哲
2023-03-14

我不久前部署了一个没有Flask的Telegram聊天机器人。我记得POST和GET请求需要将/getUpdate/sendMessage添加到bot url。也许会有所帮助。

 类似资料:
  • 我是用Python编写机器人程序的新手。我创建了一个简单的bot@kawaikx_bot,它有一个/start命令,可以回复任何文本输入。 我还启用了内联模式。我试图通过呼叫bot name和一些文字@kawaikx\u bot hello,从一个bot不是成员的群聊中向这个bot传递一条消息。但它没有发送回复。 我期待着回复“今天是工作日” 你能帮我找出我的代码有什么问题吗? 提前感谢

  • 我正在写一个微信小程序,使用flask作为后端,ide使用pycharm社区版,目前完成了登录功能并在微信开发者工具模拟器中实现了该功能,但在进行真机调试时出现了问题 在连接同一个wifi的情况下,在真机调试过程中当我发送一个request时,对应的login函数并没有执行,也没有发送response和错误信息! 我在使用模拟器发送post请求时(本机测试,ip地址192.168.0.107),可

  • 在向用户发送sendInvoice后(用户正确获取此支付表单),我的bot无法接收用于付款确认的preCheckoutQuery。我试图通过webhook接收来自Telegram Bot的更新(特别是preCheckoutQuery),但这里: dev.botframework.com- 另外,当我尝试在我自己的机器人 dev.botframework.com 上设置网络钩子并检查获取Webhoo

  • 这不是重复的:| 我添加了一个用于管理goup的新机器人。通过此信息: 我的机器人是管理员 我的机器人隐私被禁用 “启用”-您的机器人只会接收以“/”符号开头或通过用户名提及机器人的消息。“禁用”-您的机器人将接收人们发送到组的所有消息。当前状态是:禁用成功!新状态是:禁用 bot可以读取除其他bot消息外的所有成员!但可以在回复中看到信息。 我的tg api是:https://github.co

  • 创建电报机器人并获得机器人令牌后,我想向机器人应用编程接口发送请求。 这个链接说我们必须像这样发送HTTP请求:

  • 我只想让我的机器人接收特定频道的消息,比如当电报用户加入电报频道时。1.我不是频道创建者或管理员。2.我不想让我的机器人成为频道管理员。3.我不想要求每个频道管理员将我的机器人添加到频道成员中。 你知道通过电报客户端UI或API制作机器人、加入频道的方法吗? 有没有另一种方法可以让机器人接收频道的更新?