You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法为Telegram Bot设置Webhook(Google App Engine环境)

解决Google App Engine中Python脚本设置Telegram Webhook失败的问题

我之前在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

火山引擎 最新活动