ACHTUNG: Es gibt eine verbesserte und aktualisierte Fassung der hier aufgezeigten Möglichkeit!

Wie bereits beschrieben, landen bei mir alle OneNote-Notizbücher in der Wolke – genauer bei Microsofts OneDrive. Und genau von dort würde ich die gern sichern, um “Fehlbedienungen” vorzubeugen, denn auch Löschungen werden synchronisiert. Dazu ist mein Plan folgender:

  • OneNote synchronisiert sich mit OneDrive.
  • OneDrive wird regelmäßig auf einen Linux-Server gebackuppt.
  • Dieser Server wird nächtlich zu mir nach Hause gebackuppt, somit also auch die OneNote-Notizbücher.

Zum ersten Punkt muss ich nichts weiter sagen – einfach OneNote mit einem Winzigweich-Konto verknüpfen, und auf gehts. Ergebnis ist folgendes:

Übersicht der Notizbücher
Übersicht der Notizbücher

Und darin verbirgt sich auch schon das Problem. Der oben in der grauen Leiste sichtbare Button “Herunterladen” verschwindet prompt, wenn man ein Notizbuch markiert. Warum? Das liegt daran, dass ein OneNote-Notizbuch eigentlich gar keine Datei ist, sondern effektiv ein Ordner, in dem für jeden Abschnitt eine .one-Datei liegt, also Mathe.one und Latein.one.

Mein Ansatz bis hierher war, einfach den Ordner per OneDrive-API (also einer speziellen Programmierschnittstelle) auf meinen Server herunterzuladen. Nur leider gibt es nur eine Möglichkeit, Dateien von OneDrive per API herunterzuladen, aber keine Ordner. Das bedeutet also, ich muss für jeden Abschnitt die Datei /Dokumente/Schule/<Fach>.one herunterladen – ein großartiges Chaos, oder “große Soße”, wie eine einzelne Person in meinem Umfeld jetzt sagen würde. Und um diesen Prozess zu automatisieren, braucht man definitv Vorkenntnis – für den gemeinen Laien ist hier Schluss, vermute ich. Und das ist schlecht, denn Backups sind wichtig.

Wer sich jetzt noch nicht abschrecken lassen hat, tut dann auf einer beliebigen Linux-Kiste folgendes:

  1. Man muss sich mit seinem Microsoft-Konto erstmal eine App erstellen. Der Name spielt vorerst keine Rolle. Wichtig ist, der neuen App dann eine Plattform hinzuzufügen, welche auf dieser Seite als “Mobile Anwendung” bezeichnet wird. Anschließend am unteren Ende der Seite speichern. Wichtig ist von der Seite eigentlich nur die Anwedungs-ID. Das “Anwendungsgeheimnis”, wie es in der deutschen Fassung so schön heißt, habe ich nicht gebraucht.
  2. Nun muss dann in irgendeinem Browser folgende URL angepasst und aufgerufen werden: https://login.live.com/oauth20_authorize.srf?client_id=ANWENDUNGS-ID&scope=onedrive.readonly offline_access&response_type=code&redirect_uri=https://login.live.com/oauth20_desktop.srf (bitte den Wert von client_id entsprechend anpassen, sodass dort dann statt “ANWENDUNGS-ID” die wirkliche Anwendungs-ID steht). Sollte irgendwo nach der Berechtigung gefragt werden, dass diese “App” dann auf OneDrive zugreifen darf, muss natürlich zugestimmt werden.
  3. Theoretisch dürfte nun nur eine weiße Seite erscheinen. Das ist soweit normal, aber die URL hat sich geändert. Die aktuelle Adresse in der Adresszeile muss nun rauskopiert werden, oder genauer der Teil nach ?code= bis zum nächsten & .
  4. Nun müssen wir den Code relativ zeitnah an Microsoft schicken, und zwar nicht etwa per Einschreiben, sondern per POST-Request. Hier bietet sich CURL an: curl -X POST -d “client_id=ANWENDUNGS-ID&redirect_uri=https://login.live.com/oauth20_desktop.srf&code=CODE_VON_EBEN&grant_type=authorization_code” https://login.live.com/oauth20_token.srf – Bitte “ANWENDUNGS-ID” durch die Anwendungs-ID und “CODE_VON_EBEN” durch den gerade in Schritt 3 erhaltenen Code ersetzen.
  5. Als Antwort bekommen wir JSON, worin irgendein Feld “refresh_token” heißt. Diesen Token brauchen wir. Microsoft selbst gibt da für die Antwort auf den POST folgendes Beispiel:
    {
      "token_type":"bearer",
      "expires_in": 3600,
      "scope":"wl.basic onedrive.readwrite",
      "access_token":"EwCo...AA==",
      "refresh_token":"eyJh...9323"
    }

    Uns interessiert also nur der Inhalt des letzten Feldes.

  6. Nun gehts weiter mit einer Lösung, die allenfalls ein Ansatz ist, aber bitte um Gottes Willen nicht perfekt; da kann noch ein Haufen an Sachen optimiert werden. Aber es funktioniert. Und zwar geht es um drei Dateien:
    1. loop.sh
      #!/bin/bash
      
      KEY=`curl -s -X POST -d 'client_id=ANWENDUNGS-ID&redirect_uri=https://login.live.com/oauth20_desktop.srf&refresh_token=REFRESH_TOKEN_HIER&grant_type=refresh_token' https://login.live.com/oauth20_token.srf | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["access_token"]'`
      
      while read p; do
        ./backup.sh $p $KEY
      done <list.txt

      Wie immer, “ANWENDUNGS-ID” wie gehabt und “REFRESH_TOKEN_HIER” durch den eben erhaltenen Refresh-Token ersetzen.

    2. backup.sh
      #!/bin/bash
      
      KEY=$2
      
      AUTH="Authorization: bearer $KEY"
      DATE=`date +%Y--%m--%d-00`
      RESPONSE=`curl -H "$AUTH" -s -i https://api.onedrive.com/v1.0/drive/root:/Dokumente/Schule/$1.one:/content | grep Location | tr -d '\r'`
      
      URL="${RESPONSE/Location: /}"
      
      EXTENSION=`echo $URL | rev | cut -d "." -f 1 | rev`
      
      wget "$URL" -O ${1}-$DATE.$EXTENSION

      Hier muss ausnahmsweise nichts ersetzt werden, es sei denn, das eigene Notizbuch heißt anders. Da wäre dann wichtig, den entsprechenden CURL-Parameter zu ersetzen (Argument hier https://api.onedrive.com/v1.0/drive/root:/Dokumente/Schule/$1.one:/content) und “Schule” gegen den Namen des eigenen Notizbuchs ersetzen. Natürlich bei Bedarf auch den Ordner anpassen, wenn es ein anderer als “Dokumente” ist.

    3. list.txt
      Organisation
      Biologie
      Deutsch
      GK
      Latein
      Mathe
      Physik
      Philosophie
      Geschichte
      Englisch

      …hier einfach alle Abschnittsnamen, die gesichert werden sollen, je in eine neue Zeile eintragen. Bitte keine Leerzeilen einbauen.

  7. Nun noch die beiden Skripte bei Bedarf ausführbar machen:
    chmod +x loop.sh
    chmod +x backup.sh

    Und dann muss nur noch ./loop.sh ausgeführt werden, um den Download zu starten. Wenn alles geklappt hat, dann sollte es jetzt Dateien nach dem Schema Latein-2016–08–27-00.one im aktuellen Ordner geben.

  8. Das Backup am besten nächtlich durchführen lassen: crontab -e ausführen, dann im sich öffnenden Editor die Zeile 50 0 * * * cd /pfad/zu/den/dateien/von/eben/ && ./loop.sh hinten dran fügen und so dann jede Nacht um 00:50 Uhr automatisch ein Backup der entsprechenden Abschnitte bekommen.

War doch ganz einfach, oder? Jetzt verstehe ich auch, warum Backups einfach eine untergeordnete Rolle beim Normalnutzer spielen. Ich sehe schon die Geschäftsidee “OneDrive-Backup as a Service” kommen…

One Responses

  1. OneNote-Backup, nun in effizient - WB7  2. Mai 2017

    […] einer ganzen Weile habe ich mich schon einmal darüber ausgelassen, dass das so mit den Backups unter OneNote nicht schön ist. Eine Art Versionierung wollte ich […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert