J'ai besoin de sauvegarder divers types de fichiers sur GDrive (pas seulement ceux convertibles aux formats GDocs) à partir d'un serveur Linux.
Quelle serait la façon la plus simple et la plus élégante de le faire avec un script python? Est-ce que l'une des solutions relatives aux GDocs serait applicable?
Vous pouvez utiliser l'API Documents List pour écrire un script qui écrit sur Drive:
https://developers.google.com/google-apps/documents-list/
L'API Liste de documents et l'API Drive interagissent avec les mêmes ressources (c'est-à-dire les mêmes documents et fichiers).
Cet exemple dans la bibliothèque cliente Python montre comment télécharger un fichier non converti sur Drive:
http://code.google.com/p/gdata-python-client/source/browse/samples/docs/docs_v3_example.py#18
La documentation actuelle pour enregistrer un fichier sur Google Drive en utilisant python peut être trouvée ici: https://developers.google.com/drive/v3/web/manage-uploads
Cependant, la façon dont l'API Google Drive gère le stockage et la récupération des documents ne suit pas la même architecture que les systèmes de fichiers POSIX. Par conséquent, si vous souhaitez conserver l'architecture hiérarchique des fichiers imbriqués sur votre système de fichiers linux, vous devrez écrire beaucoup de code personnalisé afin que les répertoires parents soient conservés sur google drive.
En plus de cela, Google rend difficile l'accès en écriture à un compte de lecteur normal. L'étendue de votre autorisation doit inclure le lien suivant: https://www.googleapis.com/auth/drive et pour obtenir un jeton pour accéder au compte normal d'un utilisateur, cet utilisateur doit d'abord rejoindre un groupe pour donner accès à des applications non vérifiées. Et tout jeton oauth créé) a une durée de conservation limitée.
Cependant, si vous obtenez un jeton d'accès, le script suivant devrait vous permettre d'enregistrer n'importe quel fichier sur votre machine locale sur le même chemin (relatif) sur Google Drive.
def migrate(file_path, access_token, drive_space='drive'):
'''
a method to save a posix file architecture to google drive
NOTE: to write to a google drive account using a non-approved app,
the oauth2 grantee account must also join this google group
https://groups.google.com/forum/#!forum/risky-access-by-unreviewed-apps
:param file_path: string with path to local file
:param access_token: string with oauth2 access token grant to write to google drive
:param drive_space: string with name of space to write to (drive, appDataFolder, photos)
:return: string with id of file on google drive
'''
# construct drive client
import httplib2
from googleapiclient import discovery
from oauth2client.client import AccessTokenCredentials
google_credentials = AccessTokenCredentials(access_token, 'my-user-agent/1.0')
google_http = httplib2.Http()
google_http = google_credentials.authorize(google_http)
google_drive = discovery.build('drive', 'v3', http=google_http)
drive_client = google_drive.files()
# prepare file body
from googleapiclient.http import MediaFileUpload
media_body = MediaFileUpload(filename=file_path, resumable=True)
# determine file modified time
import os
from datetime import datetime
modified_Epoch = os.path.getmtime(file_path)
modified_time = datetime.utcfromtimestamp(modified_Epoch).isoformat()
# determine path segments
path_segments = file_path.split(os.sep)
# construct upload kwargs
create_kwargs = {
'body': {
'name': path_segments.pop(),
'modifiedTime': modified_time
},
'media_body': media_body,
'fields': 'id'
}
# walk through parent directories
parent_id = ''
if path_segments:
# construct query and creation arguments
walk_folders = True
folder_kwargs = {
'body': {
'name': '',
'mimeType' : 'application/vnd.google-apps.folder'
},
'fields': 'id'
}
query_kwargs = {
'spaces': drive_space,
'fields': 'files(id, parents)'
}
while path_segments:
folder_name = path_segments.pop(0)
folder_kwargs['body']['name'] = folder_name
# search for folder id in existing hierarchy
if walk_folders:
walk_query = "name = '%s'" % folder_name
if parent_id:
walk_query += "and '%s' in parents" % parent_id
query_kwargs['q'] = walk_query
response = drive_client.list(**query_kwargs).execute()
file_list = response.get('files', [])
else:
file_list = []
if file_list:
parent_id = file_list[0].get('id')
# or create folder
# https://developers.google.com/drive/v3/web/folder
else:
if not parent_id:
if drive_space == 'appDataFolder':
folder_kwargs['body']['parents'] = [ drive_space ]
else:
del folder_kwargs['body']['parents']
else:
folder_kwargs['body']['parents'] = [parent_id]
response = drive_client.create(**folder_kwargs).execute()
parent_id = response.get('id')
walk_folders = False
# add parent id to file creation kwargs
if parent_id:
create_kwargs['body']['parents'] = [parent_id]
Elif drive_space == 'appDataFolder':
create_kwargs['body']['parents'] = [drive_space]
# send create request
file = drive_client.create(**create_kwargs).execute()
file_id = file.get('id')
return file_id
PS. J'ai modifié ce script à partir du module labpack
python. Il y a une classe appelée driveClient dans ce module écrit par rcj1492 qui gère l'enregistrement, le chargement, la recherche et supprimer des fichiers sur Google Drive d'une manière qui préserve le système de fichiers POSIX.
from labpack.storage.google.drive import driveClient
J'ai trouvé que PyDrive gère l'API Drive avec élégance, et il a également une grande documentation (en particulier en guidant l'utilisateur à travers la partie d'authentification).
EDIT: Combinez cela avec le matériel sur Automatisation du processus de vérification pydrive et Authentification Pydrive google drive automate , et cela donne une excellente documentation pour faire avancer les choses. J'espère que cela aide ceux qui ne savent pas par où commencer.