如何在代码中正确读取JSON格式的谷歌表格服务账号凭据
解决Service Account凭据字符串解析的KeyError问题
嘿,这个问题我之前也碰到过!问题出在你处理JSON字符串的方式上,尤其是私钥的格式被错误修改了,导致oauth2client库无法正确解析凭据,进而抛出_private_key_pkcs8_pem的KeyError。
错误原因分析
你手动执行的replace("'",'"').replace('\r\n', '\\r\\n')操作完全没必要,反而破坏了私钥的格式:
- 原始JSON本身就是双引号,不需要替换单引号(你的字符串用的是三重单引号,内部的双引号不会冲突)
- 私钥里的换行是格式要求的,你替换成转义的
\\r\\n会让库无法正确识别私钥结构,导致内部无法生成需要的_private_key_pkcs8_pem字段
正确的实现代码
直接保留JSON的原始格式,用Python三重引号包裹字符串,然后正常解析即可:
import json from oauth2client.service_account import ServiceAccountCredentials import gspread # 用三重单引号直接保留JSON的原始结构,注意私钥的换行要完整保留 json_string = ''' { "type": "service_account", "project_id": "你的项目ID", "private_key_id": "你的私钥ID", "private_key": "-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxxxxxx (这里是你的完整私钥内容,保留原始换行) -----END PRIVATE KEY-----", "client_email": "你的服务账号邮箱@xxx.iam.gserviceaccount.com", "client_id": "你的客户端ID", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/你的服务账号邮箱%40xxx.iam.gserviceaccount.com" } ''' # 直接解析JSON字符串,不需要额外替换操作 info = json.loads(json_string) # 指定需要的API权限范围(必须包含谷歌表格和驱动器的权限) scope = [ "https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive" ] # 从解析后的字典创建凭据 credentials = ServiceAccountCredentials.from_json_keyfile_dict(info, scope) # 授权并访问表格 client = gspread.authorize(credentials) sheet = client.open("Responses").sheet1 # 测试读取数据,验证是否成功 print(sheet.get_all_records())
关键注意事项
- 私钥格式要完整:确保
private_key字段包含完整的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,中间的私钥内容保留原始换行(可以直接在三重引号里换行,Python会自动处理) - 不要手动修改JSON格式:三重引号可以完美保留JSON的原始结构,不需要做任何引号或换行的替换
- 导入必要模块:别忘了导入
json模块,否则json.loads会报错 - 权限范围要正确:必须包含谷歌表格和驱动器的权限,否则无法访问目标表格
内容的提问来源于stack exchange,提问作者Omri
相关产品推荐
相关产品推荐

