无法为Telegram Bot设置Webhook(Google App Engine环境)
我之前在GAE上开发Telegram Bot时也碰到过一模一样的问题!curl能成功但Python脚本不行,大概率是请求格式或者环境适配的问题,给你几个排查和解决的方向:
确认Python请求的格式是否匹配curl的表单提交
你用curl的-F参数是提交multipart/form-data格式的数据,而很多人用Python的requests库时会习惯性用json参数传数据,这就会导致请求格式不匹配。Telegram的setWebhook接口在上传证书时必须用multipart/form-data,正确的Python写法应该是这样:import requests import os BOT_TOKEN = "你的实际Bot Token" # 注意:GAE的HTTPS默认用443端口,不需要加:8443 WEBHOOK_URL = f"https://example.appspot.com/{BOT_TOKEN}" CERT_FILE_PATH = os.path.join(os.getcwd(), "certificate.pem") try: with open(CERT_FILE_PATH, 'rb') as cert_file: # 用data传url参数,files传证书文件 response = requests.post( f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook", data={"url": WEBHOOK_URL}, files={"certificate": cert_file} ) # 打印响应信息,方便排查错误 print("Telegram API响应:", response.json()) except Exception as e: print("请求出错:", str(e))检查GAE环境中证书文件的路径
本地测试时相对路径可能没问题,但部署到GAE后,文件的工作目录可能和本地不一样。用os.path.join(os.getcwd(), "certificate.pem")来构建绝对路径,确保脚本能找到证书文件。另外还要确认证书文件已经被正确部署到GAE上了——检查你的app.yaml里有没有排除这个文件,比如有没有用skip_files规则不小心忽略了它。查看Telegram API返回的具体错误信息
一定要打印请求的响应内容!Telegram的API会返回非常明确的错误描述,比如证书无效、URL格式错误、端口不允许等。比如如果返回{"ok":false,"error_code":400,"description":"Bad Request: wrong url host"},那就是你的Webhook URL有问题。确认Webhook URL的端口是否正确
你curl命令里写了:8443,但GAE的HTTPS服务默认使用443端口,不需要额外指定。实际部署后,正确的Webhook URL应该是https://example.appspot.com/<token>,去掉端口号试试——这很可能是个容易忽略的小错误。排查GAE的出站网络权限
虽然GAE标准环境默认允许访问外部API,但如果是自定义运行时或者配置了严格的网络规则,可能会阻止对api.telegram.org的请求。可以在GAE控制台的日志里查看是否有出站请求被拒绝的记录,或者在脚本里加异常捕获,看看是不是网络连接的问题。
内容的提问来源于stack exchange,提问作者Trafalgar Law




