【问题标题】:Telegram webhook seems not to work with python APIsTelegram webhook 似乎不适用于 python API
【发布时间】:2023-12-13 18:43:02
【问题描述】:

我在this API 的帮助下开发了一个电报机器人,我尝试用 webhook 方法来实现它,首先我用 getUpdated 方法尝试了我的机器人,它就像一个魅力,但是当我将它更新为 webhook ,它似乎不起作用。

我用flask实现了webhook,完全遵循this example,除了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)

【问题讨论】:

  • 是的,我知道,这并不能回答您的问题,但无论如何:也许您想考虑使用this python wrapper?它支持最新的 Telegram API(您的包装器不支持),并且有一个非常好的 Telegram 组,您可以在其中获得即时帮助,并且它的使用频率高于您使用的包装器。只是说...
  • @Endogen 我也会试试那个包装器,谢谢。能把你提到的电报群的链接给我吗?

标签: webhooks python-telegram-bot


【解决方案1】:

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

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

在某些 VPS 中,您可能需要在此处输入 IP 地址

如果你在 localhost 上开发,你可以使用像 ngrok.io 这样的 somesing

【讨论】:

  • 好吧,如果我没有提到,我不得不说我很抱歉,我正在从 digitalocean 在我的服务器上开发我的机器人,我有一个 VPS,我有一个 HTTPS 域,所以我将我的请求发送到我的域,我的烧瓶服务器接收它们
  • 您使用的是调试模式吗?如果没有,请尝试。 url和端口正确吗?例如,还尝试通过netstat 扫描连接。注意:您使用的是自签名 ssl 吗?
  • 我在 digitalocean 教程中使用letsEncrypt 创建了ssl 证书。我不确定它是哪种类型,
  • 是的 url 和端口设置正确,我已经使用 nmap 检查端口是否打开,但我稍后会尝试 netstat 进行连接,我应该如何在调试模式下运行我的机器人?跨度>
  • 那么,为什么要把它做成字符串呢? WEBHOOK_PORT = '8443' 将其更改为 WEBHOOK_PORT = 8443 和 URL_BASE 中的 WEBHOOK_URL_BASE = "https://%s:%d" % (WEBHOOK_HOST, WEBHOOK_PORT) 或使用 format() 函数。阅读docs