Python调用Google My Business API报UnknownApiNameOrVersion错误
Google My Business封面图更新接口UnknownApiNameOrVersion报错修复方案
核心报错原因
这个报错不是单纯的版本号填写错误,是三个代码问题叠加导致的:
- 代码冗余且变量引用错误:重复定义了两次
SCOPES常量,服务初始化时传入的credentials变量未定义,实际凭证存储在gmb_app_verify_business_test.credentials属性中 - 多余参数触发接口校验异常:使用OAuth2.0用户凭证请求接口时,不需要传入
developerKey(API_KEY)参数,该参数和OAuth凭证同时传入会导致发现文档拉取失败 - 发现文档拉取逻辑问题:GMB接口不支持google-api-python-client默认的公开发现服务拉取,必须手动指定正确的v4版本发现文档地址,不存在公开可用的v1版本服务端接口
注意:不要反复切换v1/v4版本调试,GMB媒体上传类接口的公开稳定版本就是v4,v1版本无对外开放的服务端能力。
可直接运行的修正代码
SCOPES = ["https://www.googleapis.com/auth/business.manage"] API_SERVICE_NAME = "mybusiness" API_VERSION = "v4" CLIENT_SECRETS_FILE = "client_secret.json" # 加载会话中存储的凭证 gmb_app_verify_business_test.credentials = google.oauth2.credentials.Credentials( **flask.session["credentials"] ) # 回写更新后的凭证到会话 flask.session["credentials"] = modules.credentials_to_dict( gmb_app_verify_business_test.credentials ) # 初始化服务,移除多余的API_KEY参数,指定正确的发现文档拉取规则 service = googleapiclient.discovery.build( API_SERVICE_NAME, API_VERSION, credentials=gmb_app_verify_business_test.credentials, discoveryServiceUrl="https://mybusiness.googleapis.com/$discovery/rest?version=v4", static_discovery=False ) # 调用封面图上传接口 cover_update_status = ( service.accounts() .locations() .media() .create( parent='accounts/你的账户ID/locations/你的门店ID', body={ "name": "IFB Point Cover", "mediaFormat": "PHOTO", "locationAssociation": { "category": "COVER", }, "sourceUrl": "https://www.ifbappliances.com/media/ifb/ifb-point-cover.png", }, ) .execute() )
额外调试注意事项
- 初始化build方法时必须加上
static_discovery=False参数,强制客户端实时拉取最新的接口描述,避免本地缓存的旧发现文档导致解析失败 - 确保完成OAuth授权的账号对目标门店位置拥有所有者/管理员权限,否则服务初始化成功后调用上传接口也会返回403权限错误
- 传入的
sourceUrl必须是公网可直接访问、无访问鉴权限制的图片地址,否则接口会拉取图片失败返回上传错误
内容的提问来源于stack exchange,提问作者gm-123
相关产品推荐
相关产品推荐

