我不想使用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"
}
我也有类似的情况。我在localhost上开发bot(但没有SSL ),并通过ngrok将它传输到web。开始的时候一切都很好,但是有一次我发现没有邮件请求。原来挖隧道的时间到了。我笑着重新开始挖隧道。但是请求没有来。结果是,我忘了更改webhook的地址(它会在每个ngrok会话中切换)。不要重复我的错误。
电报机器人仅适用于全链证书。以及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应用程序
我不久前部署了一个没有Flask的Telegram聊天机器人。我记得POST和GET请求需要将/getUpdate
和/sendMessage
添加到bot url。也许会有所帮助。
我是用Python编写机器人程序的新手。我创建了一个简单的bot@kawaikx_bot,它有一个/start命令,可以回复任何文本输入。 我还启用了内联模式。我试图通过呼叫bot name和一些文字@kawaikx\u bot hello,从一个bot不是成员的群聊中向这个bot传递一条消息。但它没有发送回复。 我期待着回复“今天是工作日” 你能帮我找出我的代码有什么问题吗? 提前感谢
在向用户发送sendInvoice后(用户正确获取此支付表单),我的bot无法接收用于付款确认的preCheckoutQuery。我试图通过webhook接收来自Telegram Bot的更新(特别是preCheckoutQuery),但这里: dev.botframework.com- 另外,当我尝试在我自己的机器人 dev.botframework.com 上设置网络钩子并检查获取Webhoo
我正在写一个微信小程序,使用flask作为后端,ide使用pycharm社区版,目前完成了登录功能并在微信开发者工具模拟器中实现了该功能,但在进行真机调试时出现了问题 在连接同一个wifi的情况下,在真机调试过程中当我发送一个request时,对应的login函数并没有执行,也没有发送response和错误信息! 我在使用模拟器发送post请求时(本机测试,ip地址192.168.0.107),可
这不是重复的:| 我添加了一个用于管理goup的新机器人。通过此信息: 我的机器人是管理员 我的机器人隐私被禁用 “启用”-您的机器人只会接收以“/”符号开头或通过用户名提及机器人的消息。“禁用”-您的机器人将接收人们发送到组的所有消息。当前状态是:禁用成功!新状态是:禁用 bot可以读取除其他bot消息外的所有成员!但可以在回复中看到信息。 我的tg api是:https://github.co
创建电报机器人并获得机器人令牌后,我想向机器人应用编程接口发送请求。 这个链接说我们必须像这样发送HTTP请求:
我只想让我的机器人接收特定频道的消息,比如当电报用户加入电报频道时。1.我不是频道创建者或管理员。2.我不想让我的机器人成为频道管理员。3.我不想要求每个频道管理员将我的机器人添加到频道成员中。 你知道通过电报客户端UI或API制作机器人、加入频道的方法吗? 有没有另一种方法可以让机器人接收频道的更新?