我正在借助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)
我认为你应该使用域名或真实IP地址。
来自示例链接的一点评论:
在某些 VPS 中,您可能需要将 IP 地址放在这里
如果你在本地主机上开发,你可以使用像ngrok.io这样的东西
我注意到这里有几个问题。
WEBHOOK_URL_BASE = "https://%s" % WEBHOOK_HOST
@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有效负载中绝对不是电报想要的。
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 出了什么问题。