Dropbox hat angekündigt, zum 14. Dezember den RSS-Feed für Ereignisse zu deaktivieren. Bislang haben wir damit für Datei-Uploads in die Dropbox Benachrichtigungen in Podio erzeugt — Rechnungen einscannen, einfach in einen Dropbox-Ordner schieben, und der Empfänger merkt das in seinem Podio: sehr praktisch. Im Folgenden wird ein alternativer Weg über Automatisierungs-Tools wie Zapier diskutiert, aber dann ein ganz anderer über ein lokales Python-Skript vorgestellt.
Dropbox-Ereignisse
In Podio sind zwei Dropbox-Themen relevant:
- einem Podio-Eintrag eine Datei aus der Dropbox hinzufügen/anhängen (statt eines Datei-Uploads), was seit langem ein Standard-Feature von Podio ist, und
- Dropbox-Benachrichtigungen: in Podio sichtbar machen, wenn jemand Dateien in die Dropbox legt.
In Podio kann man einen RSS-Feed durch eine App auslesen lassen; es wird pro RSS-Beitrag ein Podio-Eintrag erzeugt. Nach dem EOL am 14.12. wird dies mit der Dropbox nicht mehr funktionieren. Laut Dropbox möge man in Zukunft bitte stattdessen auf einem der drei folgenden Wege zu Informationen über neue Dateien in der Dropbox kommen (wenn man sie nicht zufällig mit seinen Desktop-Benachrichtigungen über den Bildschirm huschen sieht):
- auf der Dropbox-Seite die Ereignis-Liste ansehen oder im Dropbox-Applet auf dem eigenen Rechner die Benachrichtigungen-Liste — aber das ist nicht “push”, sonder “pull”, d.h. man muß dort selbst hingehen, statt daß man einen “ping” bekommt an einer Stelle, wo man sowieso ist (wie z.B. Podio)
- seine Email-Benachrichtigungen aktivieren — das wäre “push”, aber in den Dropbox-Einstellungen wird einem lediglich eine wöchentliche “Digest”-Email mit einer Zusammenfassung aller Aktivitäten in allen freigegebenen Ordnern angeboten, was unübersichtlich und ggf. zu spät ist
- auf die API, die Programmierschnittstelle von Dropbox zugreifen — das ist nichts für den Endverbraucher, sondern ein Vorschlag für Unternehmen, die dafür einen gestandenen Programmierer haben/beauftragen. Es gibt allerdings auch eine einfachere Möglichkeit, die APIs von Dropbox und Podio miteinander sprechen zu lassen, wovon der nächste Abschnitt handelt.
Zapier & Co.
Es gibt mittlerweile einige kostenpflichtige Dienste, die einem die Schnittstellenprogrammierung abnehmen und die Verknüpfung zweier Cloud-Apps mit einigen Klicks ermöglichen (wobei es bisweilen ganz so glatt dann doch nicht läuft). Der größte Anbieter, der auch Podio “kann”, ist Zapier, aber es gibt auch ein paar andere mit ähnlichem Angebot. Allen gemein ist, daß sie pro Ereignis “feuern”, d.h. mit jeder hochgeladenen Datei wird auch auf Podio ein Ereignis ausgelöst, z.B. das Anlegen eines neuen Eintrags in einer App oder einer Aufgabe.
Das ähnelt der nun bald obsoleten Methoden mit dem RSS-Feed — und auch da schon hat es genervt, für 20 hochgeladene Dateien nicht eine, sondern 20 Benachrichtigungen zu bekommen. Und wenn man es schon neu macht, dann doch auch an dieser Stelle gleich besser, so unsere Anforderung.
Man kann hergehen und mit GlobiFlow aufwendige Filter schreiben, die prüfen, ob man am selben Tag schon einmal einen Eintrag oder eine Aufgabe auf Podio wegen neuer Dateien in demselben Dropbox-Briefkasten hatte und dann diese Doubletten nicht anlegen oder gleich löschen. Der Aufwand dafür erscheint aber eher größer als der für einen ganz anderen Weg, der genau das automatisiert, was man als Projektmanager selbst machen würde, wenn es keine Automatisierung gäbe. Nämlich erstens in den (oder die) Dropbox-Ordner im Datei-Manager/Finder auf dem eigenen Rechner hineinsehen, ob was Neues drin ist, und falls ja, zweitens die daraus folgende Aufgabe(n) zu formulieren und in den Backlog oder jemandes Aufgabenliste legen.
Leser, die sich für Geschäftsprozesse interessieren, aber nicht selbst programmieren, müssen hier nicht mehr weiterlesen — außer, die Neugierde siegt!
Dropbox – Lokales Python-Skript – Email
Das folgende Skript mit dem Namen DropboxNotif.py tut dieses:
- drei Standard-Module importieren, eins zum Durchforsten der Ordner (os), eins für den Email-Versand (smtplib), und eins, um merkwürdige Nicht-ASCII-Zeichen aus Dateinamen zu entfernen, die das SMTP-Modul nicht verdauen kann (re)
- den Email-Server starten, damit alles bereit ist für den Versand
- ein Verzeichnis (dictionary) mit Kurznamen (“Briefkasten1”) und lokalen Pfaden der zu durchforstenden Dropbox-Ordner anlegen
-
eine Funktion definieren (pruefen ob neue), die den Ordner mit dem jeweils angegebenen Pfad durchsucht, versteckte System-Dateien als irrelevant erkennt und nur dann
WAHR
ausgibt, wenn „richtige“ Dateien drin sind - eine Funktion definieren (message string), die den Text einer Mail zusammenstellt mit dem immer gleichen (eigene Mailadresse) und Empfänger (Email-Adresse der Ziel-Podio-App), einem mit dem Briefkasten-Kurznamen zusammengestellten Betreff sowie der Dateiliste als Textkörper
-
über das Briefkästen-dictionary iteriert und für jeden Briefkasten, bei dem die Funktion pruefen ob neue
WAHR
ausgibt, eine mit der Funktion message string komponierte Email an die Mailadresse der entsprechenden Podio-App schickt - den Mailserver wieder beendet
#! /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 entscheiden, welches Textfeld vom Betreff und welches Textfeld vom Textkörpfer der Mail ausgefüllt werden sollen. Weitere wichtige Felder kann dann GlobiFlow ausfüllen:
Der Flow wird getriggert durch ein neu angelegtes Item, aber nicht durch jedes, sondern nur durch welche mit genau dem Betreff, den wir oben im Python-Script festgelegt haben — in diesem Fall “Dropbox FF: neue Dateien”. Weil wir ja wissen, zu welchem Briefkasten diese Mail gehört, fällt es leicht, Details wie in unserem Fall eine Kostenstelle oder ein verantwortliches Team-Mitglied zuzuweisen. Hier haben wir auch ein Wiedervorlage-Datumsfeld, das auf den Folgetag eingestellt wird.
Tägliches automatisches Ausführen
Das täglich (oder häufiger oder seltener) auszuführende Bash-Skript ist unter OSX ziemlich kurz, unter Windows und Linux sieht es anders aus:
#!/bin/bash
/Users/meinUsername/anaconda3/bin/python DropboxNotif.py
Auf allen Plattformen läßt sich ein solches Skript mit einem cronjob steuern. Man kann es sich auch etwas bequemer machen, auf dem Mac etwa mit der kleinen App Launch Control (selten häßliche Benutzeroberfläche, aber funktioniert):
Schlagwörter: Dropbox, GlobiFlow, Podio, Python, Zapier