Telegram webhook 似乎无法与 python API 一起使用

问题描述 投票:0回答:2

我正在借助this API开发一个电报机器人,我尝试使用webhook方法来实现它,首先我使用getUpdated方法尝试了我的机器人,它的工作原理就像一个魅力,但是当我将其更新为webhook时,好像没用。

我用flask实现了webhook,完全按照这个例子,除了ssl证书和IP,因为我有一个https域,所以我没有使用IP和自签名证书,而是使用了我的域。

然后我用邮递员测试了我的 webhook 并使用从 api.telegram.org 获得的数据发送请求,并且它再次起作用,但是当我在 Telegram 应用程序中向我的机器人发送消息时,我在服务器中似乎没有收到任何消息就像电报没有按预期发送消息一样。

编辑:在这里我放置了我的代码以供更多说明

WEBHOOK_HOST = 'mywebsite.com'
WEBHOOK_PORT = '8443'
WEBHOOK_LISTEN = '0.0.0.0'

WEBHOOK_SSL_CERT = "/etc/letsencrypt/live/mywebsite.com/cert.pem"
WEBHOOK_PRIV_CERT = "/etc/letsencrypt/live/mywebsite.com/privkey.pem"

WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (TOKEN.get_token())

router = flask.Flask(__name__)

@router.route('/', methods=['GET', 'HEAD'])
def index():
    return 'OK'

@router.route(WEBHOOK_URL_PATH, methods=['POST'])
def webhook():
    if flask.request.headers.get('content-type') == 'application/json':
        json_string = flask.request.json
        print json_string["message"]["text"] # here I should get the text of message
        return ''
    else:
        flask.abort(403)


bot.remove_webhook()
time.sleep(3)

bot.set_webhook(url=WEBHOOK_URL_BASE+WEBHOOK_URL_PATH,certificate=open(WEBHOOK_SSL_CERT, 'r'))

router.run(host=WEBHOOK_LISTEN, port=int(WEBHOOK_PORT), ssl_context=(WEBHOOK_SSL_CERT, WEBHOOK_PRIV_CERT), debug=True)
webhooks python-telegram-bot
2个回答
0
投票

我认为你应该使用域名或真实IP地址。

来自示例链接的一点评论:

在某些 VPS 中,您可能需要将 IP 地址放在这里

如果你在本地主机上开发,你可以使用像ngrok.io这样的东西


0
投票

我注意到这里有几个问题。

  1. 虽然这不应该是一个问题,但我不知道为什么要在主机名上使用端口号。为什么不简单地使用
WEBHOOK_URL_BASE = "https://%s" % WEBHOOK_HOST
  1. 您的路由器端点不应包含令牌,您的令牌应该是设置 Webhook 时的有效负载。它不应该是你的起源。所以,
@router.route(WEBHOOK_URL_PATH, methods=['POST'])

更改为

@router.route(WEBHOOK_URL_BASE + '/myWebhookEntry', methods=['POST'])

我不确定你的

bot.set_webhook
是做什么的,但是有效负载
url
应该是
https://mywebsite.com/myWebhookEntry
并且 POST 调用应该对 URL
WEBHOOK_URL_PATH + '/setWebhook'
进行 - 我认为这就是你的
bot.set_webhook
所做的事情,但是 url有效负载中绝对不是电报想要的。

  1. 您的证书应以字节模式打开。
    rb
    而不是
    r
    我花了一整天的时间试图解决这个问题,使用 python 的
    requests
    模块进行 POST 调用。

我开始为此目的编写一个 POC,同时使用

ngrok
和其他隧道替代方案以及外部 SSL 证书。

您不妨看一下实现,该解决方案已经过尝试和测试。

https://github.com/thevickypedia/telegram-webhook

这与您所做的类似,使用在

FastAPI
服务器上运行的
uvicorn
支持的多个隧道应用程序来实现。

更多参考: https://github.com/thevickypedia/telegram-webhook#references

您随时可以发出 GET 请求或使用浏览器点击

https://api.telegram.org/bot{BOT_TOKEN}/getWebhookInfo
来查看您设置的 Webhook 出了什么问题。

© www.soinside.com 2019 - 2024. All rights reserved.