Drop­box hat angekündigt, zum 14. Dezem­ber den RSS-Feed für Ereignisse zu deak­tivieren. Bis­lang haben wir damit für Datei-Uploads in die Drop­box Benachrich­ti­gun­gen in Podio erzeugt — Rech­nun­gen ein­scan­nen, ein­fach in einen Drop­box-Ord­ner schieben, und der Empfänger merkt das in seinem Podio: sehr prak­tisch. Im Fol­gen­den wird ein alter­na­tiv­er Weg über Automa­tisierungs-Tools wie Zapi­er disku­tiert, aber dann ein ganz ander­er über ein lokales Python-Skript vorgestellt.

Dropbox-Ereignisse

In Podio sind zwei Drop­box-The­men rel­e­vant:

  • einem Podio-Ein­trag eine Datei aus der Drop­box hinzufügen/anhängen (statt eines Datei-Uploads), was seit langem ein Stan­dard-Fea­ture von Podio ist, und
  • Drop­box-Benachrich­ti­gun­gen: in Podio sicht­bar machen, wenn jemand Dateien in die Drop­box legt.

In Podio kann man einen RSS-Feed durch eine App ausle­sen lassen; es wird pro RSS-Beitrag ein Podio-Ein­trag erzeugt. Nach dem EOL am 14.12. wird dies mit der Drop­box nicht mehr funk­tion­ieren. Laut Drop­box möge man in Zukun­ft  bitte stattdessen auf einem der drei fol­gen­den Wege zu Infor­ma­tio­nen über neue Dateien in der Drop­box kom­men (wenn man sie nicht zufäl­lig mit seinen Desk­top-Benachrich­ti­gun­gen über den Bild­schirm huschen sieht): 

  1. auf der Drop­box-Seite die Ereig­nis-Liste anse­hen oder im Drop­box-Applet auf dem eige­nen Rech­n­er die Benachrich­ti­gun­gen-Liste — aber das ist nicht “push”, son­der “pull”, d.h. man muß dort selb­st hinge­hen, statt daß man einen “ping” bekommt an ein­er Stelle, wo man sowieso ist (wie z.B. Podio);
  2. seine Email-Benachrich­ti­gun­gen aktivieren — das wäre “push”, aber in den Drop­box-Ein­stel­lun­gen wird einem lediglich eine wöchentliche “Digest”-Email mit ein­er Zusam­men­fas­sung aller Aktiv­itäten in allen freigegebe­nen Ord­nern ange­boten, was unüber­sichtlich und ggf. zu spät ist;
  3. auf die API, die Pro­gram­mier­schnittstelle von Drop­box zugreifen — das ist nichts für den End­ver­brauch­er, son­dern ein Vorschlag für Unternehmen, die dafür einen ges­tande­nen Pro­gram­mier­er haben/beauftragen. Es gibt allerd­ings auch eine ein­fachere Möglichkeit, die APIs von Drop­box und Podio miteinan­der sprechen zu lassen, wovon der näch­ste Abschnitt han­delt.

Zapier & Co.

Es gibt mit­tler­weile einige kostenpflichtige Dien­ste, die einem die Schnittstel­len­pro­gram­mierung abnehmen und die Verknüp­fung zweier Cloud-Apps mit eini­gen Klicks ermöglichen (wobei es bisweilen ganz so glatt dann doch nicht läuft). Der größte Anbi­eter, der auch Podio “kann”, ist Zapi­er, aber es gibt auch ein paar andere mit ähn­lichem Ange­bot. Allen gemein ist, daß sie pro Ereig­nis “feuern”, d.h. mit jed­er hochge­lade­nen Datei wird auch auf Podio ein Ereig­nis aus­gelöst, z.B. das Anle­gen eines neuen Ein­trags in ein­er App oder ein­er Auf­gabe.

Das ähnelt der nun bald obso­leten Meth­o­d­en mit dem RSS-Feed — und auch da schon hat es gen­ervt, für 20 hochge­ladene Dateien nicht eine, son­dern 20 Benachrich­ti­gun­gen zu bekom­men. Und wenn man es schon neu macht, dann doch auch an dieser Stelle gle­ich bess­er, so unsere Anforderung.

Man kann herge­hen und mit Glob­i­Flow aufwendi­ge Fil­ter schreiben, die prüfen, ob man am sel­ben Tag schon ein­mal einen Ein­trag oder eine Auf­gabe auf Podio wegen neuer Dateien in dem­sel­ben Drop­box-Briefkas­ten hat­te und dann diese Dou­blet­ten nicht anle­gen oder gle­ich löschen. Der Aufwand dafür erscheint aber eher größer als der für einen ganz anderen Weg, der genau das automa­tisiert, was man als Pro­jek­t­man­ag­er selb­st machen würde, wenn es keine Automa­tisierung gäbe. Näm­lich erstens in den (oder die) Drop­box-Ord­ner im Datei-Man­ager/Find­er auf dem eige­nen Rech­n­er hinein­se­hen, ob was Neues drin ist, und falls ja, zweit­ens die daraus fol­gende Aufgabe(n) zu for­mulieren und in den Back­log oder jeman­des Auf­gaben­liste leg­en.

Leser, die sich für Geschäft­sprozesse inter­essieren, aber nicht selb­st pro­gram­mieren, müssen hier nicht mehr weit­er­lesen — außer, die Neugierde siegt!

Dropbox > Lokales Python-Skript > Email

Das fol­gende Skript mit dem Namen DropboxNotif.py tut dieses:

  1. drei Stan­dard-Mod­ule importieren, eins zum Durch­forsten der Ord­ner (os), eins für den Email-Ver­sand (smt­plib), und eins, um merk­würdi­ge Nicht-ASCII-Zeichen aus Dateina­men zu ent­fer­nen, die das SMTP-Mod­ul nicht ver­dauen kann (re);
  2. den Email-Serv­er starten, damit alles bere­it ist für den Ver­sand;
  3. ein Verze­ich­nis (dic­tio­nary) mit Kurz­na­men (“Briefkasten1”) und lokalen Pfaden der zu durch­fors­ten­den Drop­box-Ord­ner anle­gen;
  4. eine Funk­tion definieren (pruefen_ob_neue), die den Ord­ner mit dem jew­eils angegebe­nen Pfad durch­sucht, ver­steck­te Sys­tem-Dateien als irrel­e­vant erken­nt und nur dann “True” aus­gibt, wenn “richtige” Dateien drin sind;
  5. eine Funk­tion definieren (message_string), die den Text ein­er Mail zusam­men­stellt mit dem immer gle­ichen (eigene Mailadresse) und Empfänger (Email-Adresse der Ziel-Podio-App), einem mit dem Briefkas­ten-Kurz­na­men zusam­mengestell­ten Betr­e­ff sowie der Dateiliste als Tex­tkör­p­er;
  6. über das Briefkästen-dic­tio­nary iteriert und für jeden Briefkas­ten, bei dem die Funk­tion pruefen_ob_neue “True” aus­gibt, eine mit der Funk­tion message_string kom­ponierte Email an die Mailadresse der entsprechen­den Podio-App schickt ;
  7. den Mailserv­er wieder been­det.
#! /Users/meinUsername/anaconda3/bin/python

import os
import smtplib
import re

server = smtplib.SMTP('smtp.meinProvider.de', 587)
server.starttls()
server.login("mein@benutzername.de", "meinEmail-Passwort")

lokaler_db_pfad = '/Users/meinUsername/Dropbox/'

ordner = {
    'Briefkasten1' : lokaler_db_pfad + 'Ordnername1',
    'Briefkasten2' : lokaler_db_pfad + 'Ordnername2',
    'Briefkasten3' : lokaler_db_pfad + 'Ordnername3'
    # ggf. weitere oder weniger Dropbox-Ordner...
}

def pruefen_ob_neue(pfad):
    if os.listdir(pfad) == ['.DS_Store', '.dropbox']:
        return False
    elif os.listdir(pfad) == ['.DS_Store', 'Icon\r', '.dropbox']:
        return False
    else:
        return True

def message_string(ordner_key, ordner_value):
    subject_str = 'Subject: Dropbox ' + ordner_key + ': neue Dateien' + '\n'
    body_str = '\n'.join(os.listdir(ordner_value)) + '\n'  # Dateiliste
    body_str = re.sub(r'[^\x00-\x7F]+',' ', body_str)   # Non-ASCII-Zeichen weg
    message_str = 'From: Fritz Feger <mail@fritzfeger.de>\n' + \
        'To: Podio <meineApp.App-ID@meinWorkspace.meineOrganisation.podio.com>\n' + \
        subject_str + \
        '\n' + \
        body_str
    return message_str

# falls neue Dateien, Message erzeugen und Email verschicken
for k, v in ordner.items():
    if pruefen_ob_neue(ordner.get(k)) == True:
        message = message_string(k, v)
        server.sendmail('mein@benutzername.de', 'meineApp.App-ID@meinWorkspace.meineOrganisation.podio.com', message)
    else:
        pass

server.quit()

Angelegte Podio-Einträge mit GlobiFlow vervollständigen

Eine Mail hat nicht viele Felder, und wenn Podio eine empfängt, kann man sich lediglich dafür entschei­den, welch­es Textfeld vom Betr­e­ff und welch­es Textfeld vom Tex­tkörpfer der Mail aus­ge­füllt wer­den sollen. Weit­ere wichtige Felder kann dann Glob­i­Flow aus­füllen:

Dropbox-GlobiFlow

Der Flow wird getrig­gert durch ein neu angelegtes Item, aber nicht durch jedes, son­dern nur durch welche mit genau dem Betr­e­ff, den wir oben im Python-Script fest­gelegt haben — in diesem Fall “Drop­box FF: neue Dateien”. Weil wir ja wis­sen, zu welchem Briefkas­ten diese Mail gehört, fällt es leicht, Details wie in unserem Fall eine Kosten­stelle oder ein ver­ant­wortlich­es Team-Mit­glied zuzuweisen. Hier haben wir auch ein Wieder­vor­lage-Datums­feld, das auf den Fol­ge­tag eingestellt wird.

Tägliches automatisches Ausführen

Das täglich (oder häu­figer oder sel­tener) auszuführende Bash-Skript ist unter OSX ziem­lich kurz, unter Win­dows und Lin­ux sieht es anders aus:

#!/bin/bash
/Users/meinUsername/anaconda3/bin/python DropboxNotif.py

Auf allen Plat­tfor­men läßt sich ein solch­es Skript mit einem cron­job steuern. Man kann es sich auch etwas beque­mer machen, auf dem Mac etwa mit der kleinen App Launch Con­trol (sel­ten häßliche Benutze­r­ober­fläche, aber funk­tion­iert):

Dropbox Launch Control