1 回答
TA贡献1757条经验 获得超7个赞
这个改装怎么样?
修改点:
我认为在您的脚本中,
service
ofservice = build('drive', 'v3', credentials=credentials)
可用于上传文件。在我的环境中,我可以确认可以使用您的脚本上传文件。
从
my file would not upload to my drive.
,我认为您可能对服务帐户有误解。使用服务帐户上传的文件将创建到服务帐户的驱动器中。此云端硬盘与您帐户的 Google 云端硬盘不同。我认为这可能是 的原因my file would not upload to my drive.
。如果您想在您的 Google Drive 中查看使用服务帐户上传的文件,则需要将上传的文件与您的 Google 帐户共享。或者,需要将文件上传到您的 Google Drive 中与服务帐户共享的文件夹中。
而且,在您的脚本中,
file_back.get('WebContentLink')
使用了。在这种情况下,None
总是返回,因为WebContentLink
需要是WebContentLink
。而且,在 Drive API v3 中,默认返回值不包括webContentLink
. 所以需要设置fields
。
当以上几点反映到您的脚本中时,您的脚本将如下所示。
修改脚本:
from google.oauth2 import service_account
import googleapiclient as google
from googleapiclient.http import MediaFileUpload, HttpRequest
from googleapiclient.discovery import build
SCOPES = ['https://www.googleapis.com/auth/drive']
credentials = service_account.Credentials.from_service_account_file('./service-credentials.json', scopes=SCOPES)
service = build('drive', 'v3', credentials=credentials)
file_metadata = {'name': 'python.png'}
media = MediaFileUpload('./python.png', mimetype='image/png')
file_up = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
# Create a permission. Here, your Google account is shared with the uploaded file.
yourEmailOfGoogleAccount = '###' # <--- Please set your Email address of Google account.
permission = {
'type': 'user',
'role': 'writer',
'emailAddress': yourEmailOfGoogleAccount,
}
service.permissions().create(fileId=file_up['id'], body=permission).execute()
file_back = service.files().get(fileId=file_up['id'], fields='webContentLink').execute() # or fields='*'
print(file_back.get('webContentLink'))
当您运行上述脚本时,上传的文件可以在您的 Google 云端硬盘中的“与我共享”中看到。
如果您想放置 Google Drive 的特定文件夹,请使用以下脚本。在这种情况下,在运行脚本之前,请将文件夹与服务帐户的电子邮件共享。请注意这一点。
from google.oauth2 import service_account
import googleapiclient as google
from googleapiclient.http import MediaFileUpload, HttpRequest
from googleapiclient.discovery import build
SCOPES = ['https://www.googleapis.com/auth/drive']
credentials = service_account.Credentials.from_service_account_file('./service-credentials.json', scopes=SCOPES)
service = build('drive', 'v3', credentials=credentials)
file_metadata = {'name': 'python.png', 'parents': ['###']} # <--- Please set the folder ID shared with the service account.
media = MediaFileUpload('./python.png', mimetype='image/png')
file_up = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
file_back = service.files().get(fileId=file_up['id'], fields='webContentLink').execute() # or fields='*'
print(file_back.get('webContentLink'))
笔记:
现阶段服务账号上传文件的属主发生变更时,会出现类似You can't yet change the owner of this item. (We're working on it.). 所以我提出了上面的修改脚本。
添加回答
举报