Google文档翻译API非文件路径认证报错求助
Google文档翻译API认证问题:手动构建凭证后仍触发DefaultCredentialsError
对接Google文档翻译API时,因不想暴露本地JSON凭证文件,尝试从环境变量加载凭证字段构建字典,通过
service_account.Credentials.from_service_account_info生成credentials,但调用翻译函数时触发错误:google.auth.exceptions.DefaultCredentialsError: Your default credentials were not found.,无法将credentials直接赋值给GOOGLE_APPLICATION_CREDENTIALS(该变量仅接受文件路径),求解决方法。
核心问题
你已经成功生成了凭证对象,但没有将其传递给Google文档翻译API的客户端实例,导致API客户端仍在尝试加载默认凭证(即查找GOOGLE_APPLICATION_CREDENTIALS指向的文件),从而触发错误。
解决步骤
1. 修正凭证字典的错误
检查环境变量键名的大小写匹配,以及私钥的格式处理:
- 环境变量名需与JSON凭证中的key完全对应(通常为大写),比如
PRIVATE_KEY而非private_key,AUTH_PROVIDER_X509_CERT_URL而非AUTH_PROVIDER_x509_CERT_URL。 - 私钥在环境变量中存储时,换行符可能被转义为
\\n,需替换为真实的换行符\n,否则会导致凭证无效。
修正后的凭证字典代码:
my_google_credentials = { "type": os.environ.get('TYPE'), "project_id": os.environ.get('PROJECT_ID'), "private_key_id": os.environ.get('PRIVATE_KEY_ID'), "private_key": os.environ.get('PRIVATE_KEY').replace('\\n', '\n'), "universe_domain": os.environ.get('UNIVERSE_DOMAIN'), "token_uri": os.environ.get('TOKEN_URI'), "client_email": os.environ.get('CLIENT_EMAIL'), "client_id": os.environ.get('CLIENT_ID'), "auth_uri": os.environ.get('AUTH_URI'), "auth_provider_x509_cert_url": os.environ.get('AUTH_PROVIDER_X509_CERT_URL'), "client_x509_cert_url": os.environ.get('CLIENT_X509_CERT_URL') }
2. 将凭证传递给API客户端
生成凭证后,需要将其传入DocumentTranslationClient的构造函数,确保客户端使用你手动构建的凭证而非默认凭证。同时需为凭证添加翻译文档所需的权限范围:
完整修正代码:
from google.cloud import translate_v3 as translate from google.oauth2 import service_account import os project_id = "REDACTED" file_path = "REDACTED" # 格式应为gs://your-bucket/input/file.docx target_language = 'en' # 构建凭证字典 my_google_credentials = { "type": os.environ.get('TYPE'), "project_id": os.environ.get('PROJECT_ID'), "private_key_id": os.environ.get('PRIVATE_KEY_ID'), "private_key": os.environ.get('PRIVATE_KEY').replace('\\n', '\n'), "universe_domain": os.environ.get('UNIVERSE_DOMAIN'), "token_uri": os.environ.get('TOKEN_URI'), "client_email": os.environ.get('CLIENT_EMAIL'), "client_id": os.environ.get('CLIENT_ID'), "auth_uri": os.environ.get('AUTH_URI'), "auth_provider_x509_cert_url": os.environ.get('AUTH_PROVIDER_X509_CERT_URL'), "client_x509_cert_url": os.environ.get('CLIENT_X509_CERT_URL') } # 生成带权限范围的凭证 credentials = service_account.Credentials.from_service_account_info(my_google_credentials) scoped_credentials = credentials.with_scopes(['https://www.googleapis.com/auth/cloud-translation']) # 初始化客户端时传入凭证 client = translate.DocumentTranslationClient(credentials=scoped_credentials) def translate_document(project_id, file_path, target_language): parent = f"projects/{project_id}/locations/global" input_config = {"gcs_source": {"input_uri": file_path}} # 替换为你的GCS输出桶路径 output_config = {"gcs_destination": {"output_uri_prefix": "gs://your-output-bucket/path/"}} request = { "parent": parent, "target_language_code": target_language, "input_configs": [input_config], "output_config": output_config } # 执行翻译请求 operation = client.translate_document(request=request) response = operation.result(timeout=180) return response # 调用翻译函数 response = translate_document(project_id, file_path, target_language) print("Translation completed.")
3. 额外注意事项
- 确保你的服务账号拥有
Cloud Translation API User或相关权限,否则会触发权限错误。 - 输入文件路径需为GCS(Google Cloud Storage)路径(
gs://xxx),文档翻译API不支持本地文件直接上传。
内容的提问来源于stack exchange,提问作者Rasputin
相关产品推荐
相关产品推荐

