如何使用服务账户访问Google的Python API和Drive?
我正在尝试写一个 Python 2.7 的脚本,把一个文件上传到我的个人 Google Drive 文件夹里。
经过几次尝试,我现在遇到了一个问题。我的错误信息是:
NotImplementedError: PyCrpto 库不支持 PKCS12 格式。请尝试转换为 "PEM" 格式(可以用 openssl 命令:openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem),或者如果可以使用本地代码的话,可以试试 PyOpenSSL。
我已经尝试运行这些命令,正如在这个 问题 和 回答 中提到的那样。
openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem
openssl pkcs8 -nocrypt -in privatekey.pem -passin pass:notasecret -topk8 -out pk.pem
我下载的 privatekey.p12 文件来自新的现代化 Google 开发者控制台,原名是 something-0123eed.json
,看起来是这样的1:
{
"private_key_id": "9ced108fe72345373b75b03d7e967a3f8c0084ca",
"private_key": "-----BEGIN PRIVATE KEY-----\nxe91Tr6RHs57LKX2HivFmOQwcFoJkUPrbB6Gwy8prE...Pc9jNExo5Krp1kLrkJYxAOmUWxWwPJ4pCx7Lxc6uQQnAlKyRmnfVpdS2I0\n-----END PRIVATE KEY-----\n",
"client_email": "0KsVeSAa91UtEGvY9lil@developer.gserviceaccount.com",
"client_id": "0KsVeSAa91UtEGvY9lil.apps.googleusercontent.com",
"type": "service_account"
}
我的 Python 代码如下:
#!/bin/env python2.7
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
import httplib2
from oauth2client.client import SignedJwtAssertionCredentials
credentials = SignedJwtAssertionCredentials(
service_account_name='0KsVeSAa91UtEGvY9lil@developer.gserviceaccount.com',
private_key=key,
scope = [
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.appdata',
'https://www.googleapis.com/auth/drive.apps.readonly'
]
)
http = httplib2.Http()
http = credentials.authorize(http)
drive_folder_id = 'jhIKHOG6supMhpjPJFHffZarwxP6'
service = build('drive', 'v2', http=http)
media_body = MediaFileUpload('/path/to/superfile.gpg'), mimetype='application/pgp-encrypted')
body = {
'title': 'superfile.gpg',
'description': '',
'mimeType': 'application/pgp-encrypted',
'parents': [{'id': drive_folder_id}]
}
file = service.files().insert(
body=body,
media_body=media_body).execute()
1: (当然,我把值换成了无意义的内容)
1 个回答
4
我在这个链接里找到了答案:
openssl pkcs12 -passin pass:notasecret -in privatekey.p12 -nocerts -passout pass:notasecret -out key.pem
openssl pkcs8 -nocrypt -in key.pem -passin pass:notasecret -topk8 -out privatekey.pem
rm key.pem
不过在这之前,我需要重新生成一个新的私钥,格式要是P12。