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.). 所以我提出了上面的修改腳本。
添加回答
舉報