从Google Business Review导入数据到Python遇Error 400: redirect_uri_mismatch错误
解决Google商家评论API导入Python时的redirect_uri_mismatch错误
问题根源
你代码中调用flow.run_local_server(port=0)时,port=0会让系统随机分配可用端口,导致实际请求的redirect_uri端口(比如52271)和你设置的http://localhost:8080/不一致,触发Google OAuth的重定向URI不匹配错误。
解决方案
1. 修正代码中的端口配置
将flow.run_local_server(port=0)改为指定固定端口8080,和你定义的redirect_uri保持一致:
credentials = flow.run_local_server(port=8080)
2. 确认Google Cloud Console的重定向URI配置
在Google Cloud Console的OAuth 2.0客户端设置中,确保已添加http://localhost:8080/到授权重定向URI列表中:
- 进入Google Cloud Console → 你的项目 → API和服务 → 凭据 → 找到对应的OAuth 2.0客户端ID → 编辑 → 添加
http://localhost:8080/并保存。
3. 替代方案:使用服务账号认证(适合服务器端/无人值守场景)
如果你之前创建了服务账号,可直接用服务账号密钥认证,无需OAuth授权码流:
- 先在Google My Business后台将服务账号邮箱添加为商家管理员
- 使用
google.oauth2.service_account模块加载密钥:
import requests from google.oauth2 import service_account from loguru import logger as log my_business_account_id = "..." location_id = "..." SERVICE_ACCOUNT_KEY_PATH = "service-account-key.json" # 服务账号的JSON密钥文件 # 加载服务账号凭据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=["https://www.googleapis.com/auth/business.manage"] ) # 构建API请求 session = requests.Session() session.headers.update( {"Authorization": f"Bearer {credentials.token}", "Content-Type": "application/json"} ) url = f"https://mybusiness.googleapis.com/v4/accounts/{my_business_account_id}/locations/{location_id}/reviews" try: log.info(f"请求API地址: {url}") response = session.get(url) response.raise_for_status() reviews = response.json() log.success("评论获取成功") print(reviews) except requests.exceptions.HTTPError as http_err: log.error(f"HTTP错误: {http_err}") except Exception as err: log.error(f"未知错误: {err}")
修正后的原代码版本
import requests from google_auth_oauthlib.flow import InstalledAppFlow from loguru import logger as log # 替换为实际ID my_business_account_id = "..." location_id = "..." GCP_CREDENTIALS_PATH = "google_review_client.json" redirect_uri = "http://localhost:8080/" # 初始化OAuth流程 flow = InstalledAppFlow.from_client_secrets_file( GCP_CREDENTIALS_PATH, scopes=["https://www.googleapis.com/auth/business.manage"], redirect_uri=redirect_uri, ) # 指定固定端口8080,不再随机分配 credentials = flow.run_local_server(port=8080) log.debug(f"凭据信息: {credentials}") session = requests.Session() session.headers.update( {"Authorization": f"Bearer {credentials.token}", "Content-Type": "application/json"} ) url = f"https://mybusiness.googleapis.com/v4/accounts/{my_business_account_id}/locations/{location_id}/reviews" try: log.info(f"请求API地址: {url}") response = session.get(url) response.raise_for_status() reviews = response.json() log.success("评论获取成功") print(reviews) except requests.exceptions.HTTPError as http_err: log.error(f"HTTP错误: {http_err}") except Exception as err: log.error(f"未知错误: {err}")
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

