SkyDrive mit Python

Ich bin gerade dabei für ein Projekt ein Skript zu entwickeln, das periodisch Daten auf einen ausgelagerten Speicher kopiert. Zunächst hatte ich dabei an Amazon S3 gedacht, allerdings handelt es sich weder um kritische Daten noch ist eine besonders hohe Verfügbarkeit notwendig, so dass Microsoft SkyDrive ebenfalls ausreicht.

Für Amazon S3 gibt es, wie ich herausgefunden habe, eine gut dokumentierte Python API Library, boto. Für Microsoft SkyDrive gibt es ebenfalls eine Library, python-skydrive, allerdings ist das mit der Dokumentation hier nicht so ganz optimal. Es gibt eine, aus den Code-Kommentaren automatisch generierte, API Dokumentation, in der jedoch ein paar Fallstricke lauern und vor allem keine Code-Beispiele vorhanden sind, die das Verständnis meist doch sehr vereinfachen würden. Inzwischen habe ich die Verbindung allerdings hinbekommen und will hier einmal kurz aufzeigen, was ich dazu machen musste, da mir ein solches Minimalbeispiel gefehlt hatte.

Zunächst einmal benötigt man zwei Libraries, die nicht automatisch vorhanden sind: requests und PyYAML. Diese kann man entweder über pip, easy_install oder den Paketmanager seiner Distribution installieren.

Die Installation von python-skydrive entspricht der gelieferten Dokumentation, man kann dies einfach mit pip install python-skydrive durchführen.

Anschließend hat man alle notwendigen Vorraussetzungen erfüllt (Ich setze hier vorraus, dass man bereits einen Live-Account besitzt und auf SkyDrive zugreifen kann) und kann die Verbindung vorbereiten. SkyDrive verwendet eine OAuth Authentifizierung. Diese verwendet, vereinfacht dargestellt, eine Client-ID und ein Secret, welche man bei Microsoft anlegen muss. Man sollte die beiden Werte dann lokal in einer Textdatei zwischenspeichern. Bei Microsoft habe ich die Anwendung python-skydrive genannt. Der Name ist allerdings nicht entscheidend. Das Feld „Umleitungsdomäne“ bleibt leer. In der Beschreibung der Command-Line Version von python-skydrive steht „Be sure to check the „mobile client app“ box under „API settings“„, daher habe ich dies hier ebenfalls gemacht.

Python-skydrive bietet nun verschiedene Möglichkeiten, die API zu nutzen. Einerseits kann man interaktiv die Werte übergeben, andererseits kann man mit einer Konfigurationsdatei arbeiten, die die zusätzlichen Parameter, wie den Auth Code, der durch python-skydrive vom SkyDrive Server bezogen wird, sichert. Letzteres empfiehlt sich für automatische Systeme, in die kein Benutzereingriff erfolgen soll.

Die Vorgehensweise ist allerdings in beiden Fällen relativ ähnlich, das folgende sollte zunächst in einer Python-Eingabeaufforderung eingegeben werden. Damit wird zunächst das benötigte Modul der python-skydrive API importiert und anschließend ein Objekt erzeugt, das über die bereits beschaffte Client ID und -Secret verfügen.

from skydrive.api_v5 import SkyDriveAPI
my_skydrive = SkyDriveAPI(client_id = '[meine client id]', client_secret = '[mein client secret]', )
my_skydrive.my_sd.auth_user_get_url()

Die unterste Methode liefert einen Unicode-String zurück, welcher eine URL enthält. Diese sollte man dann in einen Webbrowser kopieren und aufrufen. Nachdem man sich mit seinem Windows Live Kennwort authentifiziert hat, landet man auf einer leeren Seite. Die URL dieser Seite kopiert man nun und fügt sie im folgenden Schritt wieder ein:

my_url = ''
my_skydrive.auth_user_process_url(my_url)
my_skydrive.auth_get_token()

Im Idealfall sollte nun der Zugriff auf SkyDrive möglich sein. Testen lässt sich dies bspw. so:

my_skydrive.listdir()

Man sollte ein Objekt zurückgeliefert bekommen. Dies entspricht dem Default-Verzeichnis.

Um PersistentSkyDriveAPI zu nutzen, muss zunächst eine Konfigurationsdatei angelegt werden. Standard ist hier ~/.lcrc, ich habe das angepasst auf ~/.skydrive.auth, da das etwas ersichtlicher erscheint. Diese Datei muss folgenden Inhalt haben:

client:
id: [meine client id]
secret: [mein client secret]

Nun legt man folgendermaßen ein SkyDriveAPI Objekt an:

from skydrive.api_v5 import PersistentSkyDriveAPI
my_skydrive = PersistentSkyDriveAPI.from_conf('~/.skydrive.auth')

Die restlichen Schritte sind identisch zu den oben genannten für den ersten Aufruf. PersistentSkyDriveAPI legt allerdings den ermittelten authorization_code und einige weitere Daten ebenfalls in der Config-Datei ab und aktualisiert diese auch wenn nötig. Bei den folgenden Aufrufen sollte man direkt nach dem erstellen des Objekts mit der API arbeiten können.

Schreibe einen Kommentar

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