In diesem Artikel werde ich PyDrive2 (GitHub) aus den Paketen aufnehmen, die Google Drive mit Python betreiben. Als Memorandum werde ich zusammenfassen, wie Google Drive von PyDrive2 über die Drive-API betrieben wird, und das angegebene Dokument duplizieren.
PyDrive2 ist eine gewartete Gabel von PyDrive. Die Aktualisierungen von PyDrive wurden über ein Jahr lang eingestellt, und PyDrive 2 wurde im Januar 2020 veröffentlicht.
Weitere Informationen und Einstellungen zur Authentifizierung bei Verwendung von PyDrive2 finden Sie im Folgenden. Um die Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt
Beachten Sie, dass PyDrive und PyDrive2 auf die Laufwerks-API ** v2 ** zugreifen. Bitte beachten Sie, dass die Drive API auch v3 hat.
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G3020
$ python -V
Python 3.8.1
$ pip list | grep PyDrive2
PyDrive2 1.4.10
Die Dateien werden gemäß Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt abgelegt.
.
├── my_client_secrets.json
├── saved_credentials.json
└── settings.yaml
Lassen Sie das Python-Skript eine ** Kopie der Minutenvorlage ** des Google-Dokuments erstellen.
Zum Zeitpunkt von MTG nehmen wir uns gemeinsam Minuten in Google Dokumente.
Ich fand es langweilig, die Minutenvorlage für jedes MTG zu duplizieren, und begann über Automatisierung nachzudenken. Als ersten Schritt in der Automatisierung habe ich ein ** Skript erstellt, das nach Angabe der ID des Google-Dokuments ** dupliziert wird.
Die URL des Google-Dokuments lautet wie folgt.
https://docs.google.com/document/d/1******************************************o/edit#
Von diesen 1 ************************************************* o
Der Teil ist die ID (ich benutze ein Sternchen, um Maskierung zu bedeuten).
copy_template.py
import argparse
from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive
def main():
#Analysieren der über die Befehlszeile übergebenen Argumente(1)
parser = argparse.ArgumentParser()
parser.add_argument("source_id")
args = parser.parse_args()
source_id = args.source_id
#Holen Sie sich Objekte, um mit Google Drive zu arbeiten(2)
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
#In den Namen der Kopierquelldatei kopiert_Der Dateiname mit(3)
source = drive.CreateFile({"id": source_id})
source.FetchMetadata("title")
dest_title = f"copied_{source['title']}"
#Eine Kopie machen(4)
copied_file = {"title": dest_title}
f = (
drive.auth.service.files()
.copy(fileId=source_id, body=copied_file)
.execute()
)
#URL anzeigen, um auf die erstellte Datei zuzugreifen(5)
dest = drive.CreateFile({"id": f["id"]})
dest.FetchMetadata("alternateLink")
print(dest["alternateLink"])
if __name__ == "__main__":
main()
Dateipositionierung
.
├── copy_template.py
├── my_client_secrets.json
├── saved_credentials.json
└── settings.yaml
Wie benutzt man
$ python copy_template.py --help
usage: copy_template.py [-h] source_id
positional arguments:
source_id
optional arguments:
-h, --help show this help message and exit
Bei der Ausführung wird die URL des duplizierten Dokuments angezeigt.
$ python copy_template.py 1******************************************o
https://docs.google.com/document/d/1******************************************c/edit?usp=drivesdk
Ich konnte keine Möglichkeit finden, das angegebene Dokument in PyDrive Documents zu duplizieren (zu kopieren). [^ 1] .. Also suchte ich in PyDrives Problem und fand ein Problem, auf das ich mich beziehen konnte. Create a copy of the file #85 (Comment) Es wird entsprechend implementiert.
[^ 1]: Das PyDrive-Dokument wird als PyDrive2-Dokument angezeigt (Stand Mai 2020).
Erstellen Sie basierend auf dem Authentifizierungsergebnis ein Objekt ("gdrive"), um Google Drive zu betreiben.
Für das Duplizieren ist die ID des Quelldokuments und der Titel des Zieldokuments erforderlich.
--ID des Quelldokuments: Über die Befehlszeile übergeben --Reproduktionszieltitel: Es ist in Ordnung, auch wenn es behoben ist. Fügen Sie diesmal das Präfix "kopiert" zum Titel des Quelldokuments hinzu.
Verwenden Sie die Methode "CreateFile", um mit Dateien auf Google Drive vom Objekt "gdrive" aus zu arbeiten.
source = drive.CreateFile({"id": source_id})
Der Rückgabewert der Methode "CreateFile" ist eine "GoogleDriveFile" -Instanz. ** Geben Sie eine ID ** und "Datei erstellen" an, damit die Datei über die Instanz "GoogleDriveFile" bearbeitet werden kann.
Die Google Drive-Datei enthält viele Informationen (Metadaten), aber nur die ID kann mit der oben beschriebenen Methode abgerufen werden. Wenn Sie die Informationen haben, die Sie erhalten möchten
source.FetchMetadata (" title ")
source ['title']
Es wird zum Verfahren.
Wenn Sie das Attribut angeben möchten, das Sie in 1 erhalten möchten, geben Sie es gemäß der folgenden Referenz an. https://developers.google.com/drive/api/v2/reference/files
Da "GoogleDrive" und "GoogleDriveFile" keine Methode zum Erstellen einer Kopie der Datei haben, wird der Endpunkt "Files: copy" anscheinend direkt vom "Google-API-Python-Client" aufgerufen, den PyDrive2 umschließt. ist.
Wenn Sie die ID des Dokuments auf dem freigegebenen Laufwerk angeben möchten, müssen Sie den zu kopierenden Code (4) ändern. Übergeben Sie "True" im Argument "supportAllDrives".
copy_template.py
#Eine Kopie machen(4)
copied_file = {"title": dest_title}
f = (
drive.auth.service.files()
.copy(fileId=source_id, body=copied_file, supportsAllDrives=True)
.execute()
)
Laut https://developers.google.com/drive/api/v2/enable-shareddrives
supportsAllDrives — Whether the requesting application supports both My Drives and shared drives. If false, then shared drive items are not included in the response.
Daher können Sie Dateien auch auf dem freigegebenen Laufwerk bearbeiten, indem Sie "True" angeben. Wenn Sie dieses Argument nicht angeben, gibt die Drive-API "Datei nicht gefunden" zurück.
Dateien in "Mein Laufwerk" können kopiert werden, auch wenn "supportAllDrives = True" angegeben ist.
Daher können Sie es jederzeit angeben, aber es scheint, dass Sie es nach Juni 2020 nicht mehr angeben müssen.
Laut Files: copy
-Endpunktdokumentation lautet das Argument" supportAllDrives "nach dem 1. Juni 2020 Es ist veraltet und Sie können mit Dateien auf dem freigegebenen Laufwerk arbeiten, ohne es anzugeben [^ 4].
In Bezug auf den Betrieb des gemeinsam genutzten Laufwerks wurden einige Probleme in PyDrive [^ 2] festgestellt, aber es scheint, dass dies in PyDrive2 [^ 3] unterstützt wird.
[^ 3]: Erfasst in Commit vom Januar 2020
Wie in Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt erwähnt, wird ein größerer Bereich (https://www.googleapis.com") erweitert. / auth / drive
) wird verwendet.
Ich habe versucht anzugeben, ob dies beim Duplizieren der Datei eingegrenzt werden kann, aber ich konnte es nicht eingrenzen [^ 5].
[^ 5]: Ich habe drive.file
, drive.metadata
und deren Kombinationen als Bereiche ausprobiert, aber [Der Benutzer hat der App {appId} {verb} keinen Zugriff auf die Datei {fileId} gewährt]( Der Fehler https://developers.google.com/drive/api/v2/handle-errors#resolve_a_403_error_the_user_has_not_granted_the_app_appid_verb_access_to_the_file_fileid) wurde nicht behoben.
Als ich auf Files: copy
Endpoint Scope verwies, https: //www.googleapis. Von com / auth / drive
habe ich festgestellt, dass es nicht möglich ist, einzugrenzen.
Wir haben zusammengefasst, wie ein Google-Dokument durch Angabe der ID in PyDrive2 dupliziert wird.
Sowohl Dokumente als auch Tabellenkalkulationen sind Dateien, wenn sie von Google Drive aus angezeigt werden. Daher denke ich, dass es möglich ist, andere als das Dokument mit dieser Methode zu duplizieren (um zu einem späteren Zeitpunkt überprüft zu werden).
Recommended Posts