Dies ist ein Python-Skript, das die Ordner auf dem Server komprimiert und in Google Drive speichert. Es soll regelmäßig ausgeführt werden und hat auch die Funktion, alte Sicherungsdateien zu löschen, damit Google Drive nicht voll wird.
Das GitHub-Repository ist hier.
Ich verwende dieses Skript, um die gespeicherten Daten auf dem Minecraft-Server zu sichern, aber ich dachte, es könnte auch für andere Zwecke verwendet werden, also schrieb ich es in Qiitas Artikel. Ich führe dieses Skript übrigens unter AWS EC2 aus (Betriebssystem ist Ubuntu).
Installieren Sie die Module, die für die Verwendung der Google Drive-API mit pip erforderlich sind, damit es funktioniert.
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Das große Bild des Codes ist unten.
import pickle
import os.path
import datetime
import shutil
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaFileUpload
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive']
#Anzahl der Generationen, die das Backup ergänzen
GENERATIONS = 3
#Datenverzeichnis sichern
DATA_DIR = '/home/minecraft/server/'
#Der Name des Ordners, den Sie sichern möchten
DATA_NAME = 'newworld'
#Google Drive-Ordner-ID zum Speichern von Sicherungsdaten(Erscheint in der URL)
PARENT_ID = 'xxxxxx'
def main():
'''
Hauptfunktion
'''
#Anmeldeinformationen abrufen
creds = get_creds()
#Einen Service erstellen
service = build('drive', 'v3', credentials=creds)
#Überprüfen von Dateien, die bereits hochgeladen wurden
existing_files = get_existing_files(service)
if len(existing_files) >= (GENERATIONS - 1):
#Wenn es mehr als nötig gespeichert ist, löschen Sie das alte
delete_unnecessary_files(service,existing_files)
#Zippen Sie die hochzuladenden Dateien
file_to_upload = create_zip_file()
#Datei hochladen
upload_file(service)
def get_creds():
'''
1.Anmeldeinformationen abrufen
'''
creds = None
#Versuchen Sie, die Authentifizierungsdatei zu öffnen
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
#Wenn Sie versagen, erstellen Sie eine neue
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return creds
def get_existing_files(service):
'''
2.Holen Sie sich eine vorhandene Sicherungsdatei
'''
# Call the Drive v3 API
query = "'" + PARENT_ID + "' in parents"
results = service.files().list(fields="nextPageToken, files(id, name, createdTime)", q=query).execute()
items = results.get('files', [])
if not items:
return {}
else:
return items
def delete_unnecessary_files(service,existing_files):
'''
3.Löschen Sie Sicherungsdateien, die Sie nicht mehr aufbewahren müssen
'''
#Holen Sie sich die Erstellungszeit jeder Datei und konvertieren Sie sie in ein Datum / Uhrzeit-Objekt
for f in existing_files:
f['datetime_createdTime'] = datetime.datetime.strptime(f['createdTime'], '%Y-%m-%dT%H:%M:%S.%fZ')
#Nach Erstellungsdatum sortieren
sorted_files = sorted(existing_files, key=lambda x: x['datetime_createdTime'])
delete_len = len(sorted_files) - (GENERATIONS - 1)
for i in range(delete_len):
service.files().delete(fileId=sorted_files[i]['id']).execute()
def create_zip_file():
'''
4.Speichern Sie den Ordner, den Sie sichern möchten, in zip
'''
shutil.make_archive(DATA_DIR + DATA_NAME, 'zip', root_dir=DATA_DIR + DATA_NAME)
def upload_file(service):
'''
5.Datei hochladen
'''
today_str = datetime.datetime.now().strftime("%D").replace("/","-")
file_metadata = {'name': today_str + '.zip','parents':[PARENT_ID]}
media = MediaFileUpload(DATA_DIR + DATA_NAME + '.zip', mimetype='application/zip')
results = service.files().create(body=file_metadata,media_body=media,fields='id').execute()
if __name__ == '__main__':
main()
Für den Teil zur Erfassung von Authentifizierungsinformationen wird das Element Offizielles Beispiel der Google Drive-API unverändert verwendet.
Wenn Sie es zum ersten Mal ausführen, wird der Browser geöffnet und Sie werden um Erlaubnis zur Authentifizierung gebeten. Wenn der Authentifizierungsablauf abgeschlossen ist, werden die Authentifizierungsinformationen in "token.pickle" gespeichert, sodass Sie sich ab dem nächsten Mal nicht mehr beim Browser authentifizieren müssen.
Rufen Sie die bereits als Backup gespeicherte Datei im Ordner von Google Drive ab. Offizielles Beispiel der Google Drive-API Ich versuche, die Dateien unter einen bestimmten Ordner zu bringen, indem ich das Objekt leicht ändere. Ich werde.
Löschen Sie nicht benötigte Dateien, damit Google Drive nicht voll wird. Die im vorherigen Schritt erfassten Dateidaten auf Google Drive werden in der Reihenfolge der Upload-Zeit sortiert und die älteste gelöscht.
Korrekt. Ich benutze Shututil.
Laden Sie die Zip-Datei hoch. Durch Optimieren der Metadaten der Datei versuche ich, sie in einen bestimmten Ordner hochzuladen.
Ich habe das obige Skript ausgeführt, wenn der Server gestartet wird. Es gibt verschiedene Möglichkeiten, dies zu tun, aber ich habe cron verwendet. Insbesondere habe ich folgendes in "crontab" geschrieben.
@reboot python3 /home/minecraft/tools/backup.py
Durch Hinzufügen von "@ reboot" wird es beim Booten ausgeführt.
Recommended Posts