Open Source im professionellen Einsatz
Linux-Magazin 07/2011
© sTan, Fotolia.com

© sTan, Fotolia.com

Perl-Skript automatisiert Datei-Austausch via Dropbox

Ab in die Kiste

Größere Dateien tauscht die Jugend heute gerne über den proprietären Dropbox-Service aus. Dessen Web-API erlaubt auch den Einsatz selbst geschriebener Skripte, beispielsweise zum Abholen einer Datei aus dem Schatten einer Firewall.

1103

Neulich wollte mir eine Praktikantin ein digitales Hörbuch leihen und schlug vor, es mir zu "dropboxen". Dass der unter Dropbox.com erhältliche Service bereits zum Standard für den Austausch größerer Dateien avanciert ist, war mir neu. Auch dass die amerikanische Jugend dropboxen bereits als Verb wie googeln verwendet, gab mir zu denken.

Von der Website auf http://dropbox.com lädt der User kostenlos ein Clientbinary herunter (Windows, Mac und sogar Linux werden unterstützt) und sieht dann auf seinem System einen neuen lokalen Dropbox-Folder. Schiebt er Dateien hinein, springt hinter den Kulissen eine magische Software an, die den neuen Inhalt unauffällig und tröpfchenweise auf den Dropbox-Server hochlädt.

Von dort synchronisieren sich dann weitere Clients desselben Users (oder die von extra autorisierten Freunden) ebenso magisch, sodass ein User auf jedem Computer der Welt einen permanent aktualisierten Order mit seinen Dateien findet. Falls irgendwo kein Dropbox-Client installiert ist, benötigt der User lediglich einen Browser und geht auf die Dropbox-Website (siehe Abbildung 1).

Abbildung 1: Das Webinterface von Dropbox ermöglicht die Manipulation von Dateien auch auf solchen Rechnern, auf denen kein Client installiert ist.

Open Source bevorzugt

Allerdings behagte mir der Gedanke nicht, ein Binary ohne einsehbaren Sourcecode auf meinem PC zu Hause zu starten. Zum Glück bietet Dropbox aber auch ein Web-API an, mit dem ein paranoider Pinguinfreund wie ich seine helle Freude an dem kostenlosen Service haben kann. Vernünftigerweise möchte Dropbox.com auch die User von API-getriebenen Programmen dazu erziehen, ihren Usernamen und ihr Passwort nicht auf irgendwelchen Oberflächen von Drittanbietern einzutippen, und setzt deswegen auf Oauth. Um den User bei der Applikation anzumelden, holt die zunächst von der Dropbox-Website unter Angabe eines Developer-Token und -Secret einen Request-Token mit -Secret ab. Mit dem Request-Token in der URL lenkt dann die Applikation den Browser des Users zur Dropbox-Website, die ihn, falls er dort noch nicht eingeloggt ist, zur Angabe seines Usernamens mit Passwort auffordert (Abbildung 2).

Abbildung 2: Die Perl-Applikation verweist auf Dropbox.com, wo der User seine Kenndaten eingibt, um sich zu autorisieren.

Klappt das Login, fragt Dropbox den User, ob er wirklich damit einverstanden ist, dass die Applikation »Perl Test Client« Zugriff auf seine Dropbox-Daten erhält (siehe Abbildung 3). Bestätigt er dies, lenkt die Dropbox-Website den Browser wieder zurück zur Applikation und schickt in der URL einen so genannten Access-Token mit. Den darf die Applikation dann speichern und damit bis zum Verfallsdatum die Aufträge des Users unter dessen Dropbox-Account ausführen.

Abbildung 3: Der User bestätigt, dass er der Perl-Applikation die Verwaltung seiner Dropbox-Daten anvertraut.

Webserver als Gerüstbau

Da ein Perl-Client als Kommandozeilen-Applikation normalerweise kein Browserinterface betreibt, klopft das Skript »dropbox-init« in Listing 1 mit dem Modul Mojolicious::Lite vom CPAN schnell einen notdürftigen Webserver auf http://localhost:8082 zusammen. Er reagiert auf die Pfade »/« sowie »/callback« und betreibt damit eine Startseite und eine Rücksprungadresse nach erfolgreicher Anmeldung des Users auf der Dropbox-Website. Der HTML-Code, den der Server jeweils ausspuckt, liegt im »__DATA__« -Segment ab Zeile 64. Mojolicious sucht dort wegen des Verweises auf »index« in Zeile 37 nach »@@ index.html.ep« und sendet das dort liegende HTML zurück, nachdem es die Template-Variablen ersetzt hat. Die Anweisung »% layout 'default';« setzt das Drumherum, damit aus der Meldung auch ein wohlgeformtes HTML-Dokument wird.

Listing 1

dropbox-init

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Mojolicious::Lite;
04 use Net::Dropbox::API;
05 use YAML qw(LoadFile DumpFile);
06
07 my $dev_key = "iyaiu823ajksgwf";
08 my $dev_secret = "zlkj32lkj2kl3dp";
09 my $listen = "http://localhost:8082";
10 my($home) = glob '~';
11 my $CFG_FILE = "$home/.dropbox.yml";
12
13 my $CFG = {};
14 $CFG = LoadFile( $CFG_FILE ) if
15 -f $CFG_FILE;
16
17 @ARGV = (qw(daemon --listen), $listen);
18
19 my $box = Net::Dropbox::API->new({
20 key => $dev_key,
21 secret => $dev_secret,
22 });
23
24 my $REQUEST_TOKEN;
25 my $REQUEST_SECRET;
26
27 ###########################################
28 get '/' => sub {
29 ###########################################
30 my ( $self ) = @_;
31
32 $box->callback_url( "$listen/callback" );
33 $self->stash->{login_url} = $box->login;
34
35 $REQUEST_TOKEN = $box->request_token;
36 $REQUEST_SECRET = $box->request_secret;
37 } => 'index';
38
39 ###########################################
40 get '/callback' => sub {
41 ###########################################
42 my ( $self ) = @_;
43
44 $box->auth({
45 request_token =>
46 $self->param('oauth_token'),
47 request_secret =>
48 $REQUEST_SECRET
49 });
50
51 $CFG->{ access_token } =
52 $box->access_token();
53 $CFG->{ access_secret } =
54 $box->access_secret();
55
56 DumpFile $CFG_FILE, $CFG;
57
58 $self->render_text( "Token saved.",
59 layout => 'default' );
60 };
61
62 app->start;
63
64 __DATA__
65 ###########################################
66 @@ index.html.ep
67 % layout 'default';
68 <a href="<%= $login_url %>"
69 >Login on dropbox.com</a>
70
71 @@ layouts/default.html.ep
72 <!doctype html><html>
73 <head><title>Token Fetcher</title></head>
74 <body>
75 <pre>
76 <%== content %>
77 </pre>
78 </body>
79 </html>

Startet der User die Mojolicious-Applikation und tippt http://localhost:8082 in den Browser, erscheint das notdürftige UI in Abbildung 4 mit einem Link auf die Login-Seite von Dropbox.com.

Abbildung 4: Der Mojolicious-Server bringt einen Login-Link, der zu Dropbox.com verweist.

Das Modul Net::Dropbox::API, ebenfalls vom CPAN, abstrahiert schön die Dropbox-Zugriffe und die Oauth-Autorisierung [2]. Setzt der API-Developer im Konstruktoraufruf in Zeile 19 die auf der Dropbox-Developer-Site [3] eingeholte Kombination aus Developer Key und Secret, greift der Aufruf der Methode »login()« (Zeile 33) hinter den Kulissen auf den Dropbox-Server zu, holt einen Request-Token mit Secret ein und liefert eine Login-URL zurück. Diese präsentiert die Webapplikation dann dem User, der sich auf einen Mausklick hin so bei Dropbox anmelden kann (Abbildung 5).

Abbildung 5: Nach dem Einloggen geht die Kontrolle von Dropbox.com wieder an den Mojolicious-Server über, der die Token-Daten in einer YAML-Datei speichert.

Die Mojolicious-Applikation speichert die eingeholten Werte für Request-Token und -Secret in den globalen Variablen »$REQUEST_TOKEN« und »$REQUEST_SECRET« , auf die sie später zugreift, wenn Dropbox.com den Browser nach erfolgreichem Login wieder zurück zum Gerüstserver unter der in Zeile 32 gesetzten Callback-URL sendet.

Erlangt die Mojolicious-Applikation anschließend wieder die Kontrolle, braucht sie sich nur den beigelegten Access-Token aus der Parameterliste des Callback zu schnappen und hat dann zusammen mit dem vorher gespeicherten Request-Token-Secret die Schlüssel in der Hand, um anstelle des Users nach Belieben in dessen Dropbox-Account herumzufuhrwerken. Das Skript speichert die beiden Schlüssel aber nur in der YAML-Datei »~.dropbox.yml« (Abbildung 6), damit später aufgerufene Applikationen sie sich ohne große Klimmzüge dort abholen können.

Abbildung 6: Die vom Skript erzeugte YAML-Datei mit Access-Token und Access-Secret.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Mit einer chinesischen Guillotine und einem Einzugsscanner bewaffnet geht Perlmeister Michael Schilli diesmal seinen Büchern an den Leim. Die Grundlage seiner bibliophoben Tat liefert Google Drive, das mit 5 GByte genug Speicherplatz für ein Online-PDF-Lager mit eingescannten Büchern bietet.

  • Openauth und Archivierung fürs IM in Sugar CRM

    Der Artikel im Linux-Magazin beschreibt, wie die neue Cloud-API in Sugar CRM Dropbox und Pidgin nutzen kann, um die Instant-Messaging-Kommunikation innerhalb des Customer Relationship Managements abzulegen und sie einem Kontakt oder Kunden zuordnet. Dieser Online-Plus-Artikel beschreibt, wie dabei Open Auth und die Archivierung der Dropbox-Inhalte von statten geht.

  • Der Lauscher an der Wand

    Ein Lausch-Bot in einem IRC-Kanal springt bei bestimmten Schlüsselwörtern an und benachrichtigt einen definierten User via Instant Messaging über das Gehörte.

  • Perl-Snapshot

    Der Musikstreaming-Service Spotify pumpt gegen eine monatliche Gebühr Musik auf den Desktop und aufs Smartphone. Noch mehr Groove hat, dass Perl-Hacker Michael Schilli per Oauth-geschütztem Web-API seine Spotify-Playlisten für die Ewigkeit archiviert.

  • Perl-Snapshot

    Ist Perlmeister Schilli unterwegs, weiß er gern, was daheim abgeht. Mit zwei Skripten bekommt er es hin, dass die angeschaffte Billigkamera über das Tumblr-API zyklisch Schnappschüsse auf der Micro-Blogplattform ablegt. Tierisch schick, diese Überwachung.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.