Téléchargez des fichiers Google Drive en Python

J'ai essayé de télécharger des fichiers depuis Google Drive. Si cela fonctionne, je pense créer un système qui peut traiter simplement en mettant le fichier.

Il y a officiellement quelque chose de plus simple que cet article. Démarrage rapide officiel (Java, Node, Python) https://developers.google.com/drive/api/v3/quickstart/python

La source

Exécutez le Python suivant. La première exécution nécessite client_secret.json. En cas de succès, token.pickle sera créé. Une fois exécuté, il téléchargera jpg, png directement dans le dossier appelé AAA sur Google Drive.

main.py


# -*- coding: utf-8 -*-
from __future__ import print_function
import pickle
import os.path
import io
import sys

# pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload

SCOPES = ['https://www.googleapis.com/auth/drive']
FOLDER_NAME = 'AAA'

def main():
    # OAuth
    drive = None
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        elif os.path.exists('client_secret.json'):
            flow = InstalledAppFlow.from_client_secrets_file(
                'client_secret.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    
    if creds and creds.valid:
        drive = build('drive', 'v3', credentials=creds)
    if not drive: print('Drive auth failed.')

    # Folfer list
    folders = None
    if drive: 
        results = drive.files().list(
            pageSize=100, 
            fields='nextPageToken, files(id, name)',
            q='name="' + FOLDER_NAME + '" and mimeType="application/vnd.google-apps.folder"'
            ).execute()
        folders = results.get('files', [])
        if not folders: print('No folders found.')

    # File list
    files = None
    if folders:
        query = ''
        for folder in folders:
            if query != '' : query += ' or '
            query += '"' + folder['id'] + '" in parents'
        query = '(' + query + ')'
        query += ' and (name contains ".jpg " or name contains ".png ")'

        results = drive.files().list(
            pageSize=100, 
            fields='nextPageToken, files(id, name)',
            q=query
            ).execute()
        files = results.get('files', [])
        if not files: print('No files found.')

    # Download
    if files:
        for file in files:
            request = drive.files().get_media(fileId=file['id'])
            fh = io.FileIO(file['name'], mode='wb')
            downloader = MediaIoBaseDownload(fh, request)
            done = False
            while not done:
                _, done = downloader.next_chunk()

if __name__ == '__main__':
    main()

De la préparation à l'exécution

1. Accéder aux API Google

https://console.developers.google.com/apis/credentials Connectez-vous avec votre compte Google. La première fois, la création de projet est appelée, veuillez donc ajouter Mon projet, etc.

2. Activez l'API Google Drive

Sélectionnez GoogleDriveAPI dans la bibliothèque et activez l'API.

3. Création d'un écran de consentement OAuth

Créez un écran de consentement. UserType = Externe Nom de l'application = Nom approprié (peut être modifié ultérieurement) D'autres sont vierges et OK. Le nom que vous donnez ici sera affiché sur l'écran d'authentification.

4. Téléchargez client_secret.json

Créez un ID client OAuth. Sélectionnez OAuth Client ID dans Create Credentials et créez-le avec Application Type = Desktop App. Une fois créé, appuyez sur le bouton Télécharger l'ID client et client_secret-xxx.json sera téléchargé.

5. Exécutez l'application

Exécutez le code python ci-dessus.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
python main.py

Le navigateur sera lancé, alors connectez-vous avec votre compte Google. Dans "Cette application n'a pas été confirmée", sélectionnez "Afficher les détails" et "Accéder à la page non sécurisée". Si l'authentification réussit, token.pickle sera créé. Il réussit lorsque le fichier jpg, png directement sous le dossier AAA de Google Drive est téléchargé.

Résultat d'exécution

J'ai mis le fichier sur Google Drive comme suit. Téléchargez directement sous le dossier nommé AAA. Notez que Google Drive peut créer le même nom de dossier et le même nom de fichier.

dossier Fichier résultat
AAA img1.jpg OK
AAA img1.jpg OK
AAA/AAA img2.jpg OK
AAA/BBB img3.jpg NG
AAA img4.jpg OK
BBB img5.jpg NG
BBB/AAA img6.jpg OK
/ img7.jpg NG

Commentaire

Authentification OAuth

SCOPES = ['https://www.googleapis.com/auth/drive']
#Lorsque vous avez déjà un jeton
creds = None
if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    elif os.path.exists('client_secret.json'):
        
        #Une URL d'authentification sera émise, alors connectez-vous et autorisez
        flow = InstalledAppFlow.from_client_secrets_file(
            'client_secret.json', SCOPES)
        creds = flow.run_local_server(port=0)
    
    #Économisez avec cornichon
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

SCOPES = ['https://www.googleapis.com/auth/drive'] a tous les privilèges, donc je pense que vous devriez en fait le restreindre.

Au départ, je l'ai fait avec Node. Dans ce cas, URL → Se connecter et autoriser → Le code sera affiché, alors copiez-le dans l'application → Obtenir des jetons. python est plus facile. Pour la première fois, j'ai utilisé un cornichon. Il semble que vous puissiez enregistrer l'objet entier (comme une classe tangible) en binaire. S'agit-il d'une sérialisation dans d'autres langues? Cela semble pratique.

Obtenir la liste de Google Drive

results = drive.files().list(
    #Nombre maximum
    pageSize=100, 
    
    #Paramètres que vous souhaitez obtenir
    fields='nextPageToken, files(id, name, parents)',
    
    #Requête (obtenir tout si non spécifié)
    q='name contains ".jpg " or name contains ".png "'
    ).execute()

files = results.get('files', [])
for file in files:
    print(file['name'] +' '+ file['parents'][0])

parents est l'ID du dossier parent. Nous ne connaissons pas le nom du dossier ici, nous devons donc rechercher l'ID séparément. Le code main.py ci-dessus récupère le fichier en obtenant l'ID du nom du dossier.

L'exemple ci-dessus est recherché pour .jpg .png. Si vous ne recherchez pas, json deviendra volumineux en raison de fichiers supplémentaires. Vous pouvez également rechercher uniquement des dossiers en écrivant mimeType = "application / vnd.google-apps.folder".

Je ne l'ai pas fait cette fois, mais si pageSize = 100 est dépassé, il est nécessaire de le réacquérir en utilisant nextPageToken.

Liste des paramètres des fichiers de champs ()

Vous pouvez obtenir les parents en écrivant fields = 'files (id, name, parents)' dans le code. Au début, j'étais inquiète car je ne savais pas quoi préciser. En conséquence, vous pouvez tout obtenir en exécutant avec fields = 'files'. Si vous les obtenez tous, Json sera long, il vaut donc mieux le spécifier. Je publierai les résultats obtenus.

{"kind":"drive#file",
"id":"1PTrhGA14N-xxxx",
"name":"img1.jpg ",
"mimeType":"image/jpeg",
"starred":false,
"trashed":false,
"explicitlyTrashed":false,
"parents":["1Jigt87nbz-xxxx"],
"spaces":["drive"],
"version":"1",
"webContentLink":"https://drive.google.com/xxxx",
"webViewLink":"https://drive.google.com/file/xxxx",
"iconLink":"https://drive-thirdparty.xxxx",
"hasThumbnail":true,
"thumbnailVersion":"1",
"viewedByMe":true,
"viewedByMeTime":"2020-05-23T19:13:29.882Z",
"createdTime":"2020-05-23T19:13:29.882Z",
"modifiedTime":"2013-08-13T23:05:18.000Z",
"modifiedByMeTime":"2013-08-13T23:05:18.000Z",
"modifiedByMe":true,
"owners":[{xxxx}],
"lastModifyingUser":{xxxx},
"shared":false,
"ownedByMe":true,
"capabilities":{xx,xx,xx},
"viewersCanCopyContent":true,
"copyRequiresWriterPermission":false,
"writersCanShare":true,
"permissions":[{xxxx}],
"permissionIds":["1485xxxx"],
"originalFilename":"img1.jpg ",
"fullFileExtension":"jpg",
"fileExtension":"jpg",
"md5Checksum":"95c10exxxx",
"size":"492642",
"quotaBytesUsed":"492642",
"headRevisionId":"0BzjG8APx-xxxx",
"imageMediaMetadata":{"width":1920, "height":1200, xx},
"isAppAuthorized":false}

Résumé

J'ai essayé de télécharger des fichiers depuis Google Drive. Quand je l'ai essayé, j'ai remarqué diverses choses. Comme AWS S3, Google Drive est dans le cloud. Ce n'est pas comme rechercher des fichiers locaux, cela a une bizarrerie. Dans le cas d'AWS, nous fournissons aux clients les articles préparés ici, mais dans le cas de Google Drive, nous assumons les articles du côté du client. Il semble donc qu'un peu plus de travail sera nécessaire. Vous pouvez faire quelque chose personnellement avec AWS Lambda.

Recommended Posts

Téléchargez des fichiers Google Drive en Python
Téléchargez des fichiers dans n'importe quel format en utilisant Python
Téléchargement parallèle avec Python
Télécharger des fichiers directement sur Google Drive (à l'aide de Google Colaboratory)
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Accédez à Google Drive avec Python
Conseils relatifs aux API Google Drive (Python)
Importez un fichier JPG à l'aide de l'API Google Drive en Python
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Translocation de fichiers CSV avec Python Partie 1
Manipuler des fichiers et des dossiers en Python
Gestion des fichiers JSON en Python
Trier les gros fichiers texte en Python
Télécharger Python
Lire des fichiers en parallèle avec Python
Exporter et exporter des fichiers en Python
Extraire des chaînes de fichiers avec Python
Arborescence de sortie des fichiers en Python
Tapez les annotations pour Python2 dans les fichiers stub!
Obtenez les données de l'API Google Fit en Python
Référence du fichier INI en Python ou Ruby
Automatisez les tâches en manipulant des fichiers en Python
Télécharger des fichiers sur le Web avec Python
Télécharger des images à partir de la liste d'URL en Python
Lire et écrire des fichiers JSON avec Python
Exemple de gestion des fichiers eml en Python
Télécharger des images sur Google Drive avec Python
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3