Telegram Webhook参数丢失,如何附加完整参数触发指定POST请求?
解决Telegram Webhook附加固定参数的问题
你遇到的问题是因为在setWebhook的URL参数中,&会被Telegram API解析为自身接口的参数分隔符,导致channel=X之后的参数被当成setWebhook的额外参数,而非目标URL的一部分,所以实际转发时只保留了第一个参数。
下面是几种可行的解决方法:
方法1:对目标URL的查询参数进行URL编码
把目标URL中的&替换为URL编码后的%26,这样Telegram会将整个字符串视为url参数的完整值,不会拆分参数。
修改后的setWebhook请求URL应该是:
https://api.telegram.org/bot<telegram_token>/setWebhook?url=https://example.com/control?channel=X%26turn=XXX%26id=XXXXXX%26auth_key=XXXXX
你也可以用在线工具对整个目标URL进行编码,再填入setWebhook的url参数中,确保所有特殊字符都被正确转义。
方法2:搭建中间转发服务
如果需要更灵活的处理(比如根据Telegram消息内容动态调整参数),可以自己写一个简单的中间服务,接收Telegram的Webhook请求,再手动带上固定参数转发到目标端点。
以Python Flask为例,示例代码如下:
from flask import Flask, request import requests app = Flask(__name__) TARGET_URL = "https://example.com/control" FIXED_PARAMS = { "channel": "X", "turn": "XXX", "id": "XXXXXX", "auth_key": "XXXXX" } @app.route('/telegram-webhook', methods=['POST']) def handle_webhook(): # 这里可以按需处理Telegram传来的消息内容,比如提取用户ID等 # 发送POST请求到目标端点,带上固定参数 requests.post(TARGET_URL, data=FIXED_PARAMS) return "OK", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
部署这个服务后,将setWebhook的url设为中间服务的地址(比如https://your-server.com/telegram-webhook)即可。
方法3:将固定参数嵌入URL路径
如果目标端点支持,可以把参数放到URL路径中,比如将端点改为https://example.com/control/X/XXX/XXXXXX/XXXXX,后端通过解析路径来获取参数。这种方式不需要处理查询参数的编码问题,直接将该URL作为setWebhook的url参数即可。
内容的提问来源于stack exchange,提问作者vtable
相关产品推荐
相关产品推荐

