pygsheets - 从字典而不是文件加载凭据
pygsheets - Load credentials from dict instead of file
是否可以从字典而不是文件加载凭据?这将使在云功能中使用短脚本变得更加容易,因为这样就不需要上传文件了。通常授权是这样的:
import pygsheets
gc = pygsheets.authorize(service_file='client_secret.json')
如果凭据像这样存储在 a 变量中:
secret = {
"type": "service_account",
"project_id": "XXXXXXXXXX",
"private_key_id": "XXXXXXXXXX",
"private_key": "XXXXXXXXXX"
"client_email": "XXXXXXXXXX",
"client_id": "XXXXXXXXXX",
"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": "XXXXXXXXXX"
}
是否可以使用 custom_credentials
而不是 service_file
加载它们? docs 除了 "this option will ignore any other parameters" 之外没有给出任何关于如何使用它的说明。以下代码:
import pygsheets
gc = pygsheets.authorize(custom_credentials=secret)
抛出以下错误:
AttributeError: 'dict' object has no attribute 'before_request'
还有其他方法吗?例如在gspread
中,有如下选项:
ServiceAccountCredentials.from_json_keyfile_dict(keyfile_dict, scope)
有什么建议吗?谢谢!!!
刚刚做到了!所以我们最终做的是写一个 tempfile 然后加载它进行授权。下面的工作示例:
import tempfile
def _google_creds_as_file():
temp = tempfile.NamedTemporaryFile()
temp.write(json.dumps({
"type": "service_account",
"project_id": "xxxx-yyy",
"private_key_id": "xxxxxxx",
"private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
"client_email": "xxx@yyyy.iam.gserviceaccount.com",
"client_id": "xxxxx",
"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/xxxxx%40xxxx.iam.gserviceaccount.com"
}))
temp.flush()
return temp
creds_file = _google_creds_as_file()
gc = pygsheets.authorize(service_account_file=creds_file.name)
感谢@kontinuity 的建议。经过一番挖掘后,我发现实际上已经有一个拉取请求:
https://github.com/nithinmurali/pygsheets/pull/345
在 authorization.py 中有一个名为 service_account_env_var
的新选项。刚试过,效果很好。
custom_credentials 应该是提到的凭证对象 here。如果不想创建tmp文件,可以直接从json.
创建对象
SCOPES = ('https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive')
service_account_info = json.loads(secret)
my_credentials = service_account.Credentials.from_service_account_info(service_account_info, scopes=SCOPES)
是否可以从字典而不是文件加载凭据?这将使在云功能中使用短脚本变得更加容易,因为这样就不需要上传文件了。通常授权是这样的:
import pygsheets
gc = pygsheets.authorize(service_file='client_secret.json')
如果凭据像这样存储在 a 变量中:
secret = {
"type": "service_account",
"project_id": "XXXXXXXXXX",
"private_key_id": "XXXXXXXXXX",
"private_key": "XXXXXXXXXX"
"client_email": "XXXXXXXXXX",
"client_id": "XXXXXXXXXX",
"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": "XXXXXXXXXX"
}
是否可以使用 custom_credentials
而不是 service_file
加载它们? docs 除了 "this option will ignore any other parameters" 之外没有给出任何关于如何使用它的说明。以下代码:
import pygsheets
gc = pygsheets.authorize(custom_credentials=secret)
抛出以下错误:
AttributeError: 'dict' object has no attribute 'before_request'
还有其他方法吗?例如在gspread
中,有如下选项:
ServiceAccountCredentials.from_json_keyfile_dict(keyfile_dict, scope)
有什么建议吗?谢谢!!!
刚刚做到了!所以我们最终做的是写一个 tempfile 然后加载它进行授权。下面的工作示例:
import tempfile
def _google_creds_as_file():
temp = tempfile.NamedTemporaryFile()
temp.write(json.dumps({
"type": "service_account",
"project_id": "xxxx-yyy",
"private_key_id": "xxxxxxx",
"private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
"client_email": "xxx@yyyy.iam.gserviceaccount.com",
"client_id": "xxxxx",
"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/xxxxx%40xxxx.iam.gserviceaccount.com"
}))
temp.flush()
return temp
creds_file = _google_creds_as_file()
gc = pygsheets.authorize(service_account_file=creds_file.name)
感谢@kontinuity 的建议。经过一番挖掘后,我发现实际上已经有一个拉取请求: https://github.com/nithinmurali/pygsheets/pull/345
在 authorization.py 中有一个名为 service_account_env_var
的新选项。刚试过,效果很好。
custom_credentials 应该是提到的凭证对象 here。如果不想创建tmp文件,可以直接从json.
创建对象SCOPES = ('https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive')
service_account_info = json.loads(secret)
my_credentials = service_account.Credentials.from_service_account_info(service_account_info, scopes=SCOPES)