Ich habe versucht, Dateien von Google Drive herunterzuladen. Wenn dies funktioniert, denke ich darüber nach, ein System zu erstellen, das nur durch Ablegen der Datei verarbeitet werden kann.
Es gibt offiziell etwas Einfacheres als diesen Artikel. Offizieller Schnellstart (Java, Node, Python) https://developers.google.com/drive/api/v3/quickstart/python
Führen Sie den folgenden Python aus. Der erste Lauf erfordert client_secret.json. Bei Erfolg wird token.pickle erstellt. Bei der Ausführung wird jpg, png direkt unter dem Ordner AAA in Google Drive heruntergeladen.
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()
https://console.developers.google.com/apis/credentials Melden Sie sich mit Ihrem Google-Konto an. Da die Projekterstellung zum ersten Mal aufgerufen wird, fügen Sie bitte Mein Projekt usw. hinzu.
Wählen Sie GoogleDriveAPI aus der Bibliothek aus und aktivieren Sie die API.
Erstellen Sie einen Zustimmungsbildschirm. UserType = Extern Anwendungsname = Geeigneter Name (kann später geändert werden) Andere sind leer und in Ordnung. Der hier angegebene Name wird auf dem Authentifizierungsbildschirm angezeigt.
Erstellen Sie eine OAuth-Client-ID. Wählen Sie unter Anmeldeinformationen erstellen die Option OAuth-Client-ID aus und erstellen Sie sie mit Anwendungstyp = Desktop-App. Klicken Sie nach dem Erstellen auf die Schaltfläche Client-ID herunterladen. Client_secret-xxx.json wird heruntergeladen.
Führen Sie den obigen Python-Code aus.
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
python main.py
Der Browser wird gestartet. Melden Sie sich daher mit Ihrem Google-Konto an. Wählen Sie unter "Diese App wurde nicht bestätigt" die Option "Details anzeigen" und "Zur unsicheren Seite wechseln". Wenn die Authentifizierung erfolgreich ist, wird token.pickle erstellt. Dies ist erfolgreich, wenn die Datei jpg, png direkt unter dem AAA-Ordner von Google Drive heruntergeladen wird.
Ich habe die Datei wie folgt auf Google Drive abgelegt. Laden Sie direkt unter dem Ordner AAA herunter. Beachten Sie, dass Google Drive denselben Ordnernamen und denselben Dateinamen erstellen kann.
Ordner | Datei | Ergebnis |
---|---|---|
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 |
SCOPES = ['https://www.googleapis.com/auth/drive']
#Wenn Sie bereits einen Token haben
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'):
#Es wird eine Authentifizierungs-URL ausgegeben. Melden Sie sich an und lassen Sie zu
flow = InstalledAppFlow.from_client_secrets_file(
'client_secret.json', SCOPES)
creds = flow.run_local_server(port=0)
#Mit Gurke speichern
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
SCOPES = ['https://www.googleapis.com/auth/drive'] verfügt über alle Berechtigungen, daher sollten Sie es meiner Meinung nach eingrenzen.
Anfangs habe ich es mit Node geschafft. In diesem Fall URL → Anmelden und Zulassen → Der Code wird angezeigt. Kopieren Sie ihn in die App → Token abrufen. Python ist einfacher. Zum ersten Mal habe ich eine Gurke benutzt. Es scheint, dass Sie das gesamte Objekt (z. B. eine greifbare Klasse) binär speichern können. Ist es Serialisierung in anderen Sprachen? Es scheint bequem.
results = drive.files().list(
#Maximale Anzahl
pageSize=100,
#Parameter, die Sie erhalten möchten
fields='nextPageToken, files(id, name, parents)',
#Abfrage (alle abrufen, wenn nicht angegeben)
q='name contains ".jpg " or name contains ".png "'
).execute()
files = results.get('files', [])
for file in files:
print(file['name'] +' '+ file['parents'][0])
Eltern ist die ID des übergeordneten Ordners. Wir kennen den Namen des Ordners hier nicht, daher müssen wir die ID separat nachschlagen. Der obige main.py-Code ruft die Datei ab, indem die ID aus dem Ordnernamen abgerufen wird.
Das obige Beispiel wird nach .jpg .png gesucht. Wenn Sie nicht suchen, wird json aufgrund zusätzlicher Dateien groß. Sie können auch nur Ordner durchsuchen, indem Sie mimeType = "application / vnd.google-apps.folder" schreiben.
Diesmal habe ich dies nicht getan, aber wenn pageSize = 100 überschritten wird, muss es mit nextPageToken erneut erfasst werden.
Sie können Eltern erhalten, indem Sie fields = 'files (id, name, parent)' in den Code schreiben. Zuerst war ich besorgt, weil ich nicht wusste, was ich spezifizieren sollte. Infolgedessen können Sie alles erhalten, indem Sie mit fields = 'files' ausführen. Wenn Sie alle erhalten, ist Json lang, daher ist es besser, es anzugeben. Ich werde die erhaltenen Ergebnisse veröffentlichen.
{"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}
Ich habe versucht, Dateien von Google Drive herunterzuladen. Als ich es tatsächlich versuchte, bemerkte ich verschiedene Dinge. Google Drive befindet sich wie AWS S3 in der Cloud. Es ist nicht so, als würde man nach lokalen Dateien suchen, es hat eine Eigenart. Im Fall von AWS stellen wir Kunden die hier vorbereiteten Artikel zur Verfügung, im Fall von Google Drive übernehmen wir jedoch die Artikel auf Kundenseite. Es scheint also, dass etwas mehr Arbeit erforderlich sein wird. Mit AWS Lambda können Sie etwas persönlich machen.
Recommended Posts