Mit Drafts Erinnerungen in Evernote erstellen

Anfang des Sommers führte Evernote die Erinnerungsfunktion für Notizen ein. Ein große Unterstützung für Menschen wie mich, die Evernote nicht nur als Ablagesystem benutzen, sondern auch für Aufgaben. Mein große Hoffnung vor ein paar Monaten war, dass in kurzer Zeit viele Anwendungen von Drittanbietern auf den Markt kommen würden, welche die Reminder-Funktion von Evernote implementieren. Bisher wartete ich darauf vergeblich. Selbst eine Kleinigkeit wie das Erstellen einer neuen Notiz mit dem Fälligkeitsdatum „heute“ fehlt – so was kann man nur über Evernote selber bewerkstelligen. Selbst Drafts, eine meiner absoluten Lieblingsapps zu Erfassungen von Ideen, Einkaufskram und allem anderen bietet zwar eine Unterstützung für Evernote, nicht aber für Reminder.

Otto-Normal-User würde vermutlich bei so was einfach kapitulieren oder weiter hoffen. Irgendwann packt mich jedoch meine Ehre als Entwickler. „Geht nicht“ kann ich einfach nicht auf sich beruhen lassen. Grübeln, suchen, Ansätze entwickeln, bis dann eine fertige Lösung entstanden. Und die wiederum kann auch Otto-Normal-User verwenden.

Die Grundidee bei folgendem ist, in ein Notizbuch namens „Aufgaben“ Notizen mit der Fälligkeit „heute“ oder „morgen“ über Drafts anzulegen. Dazu sind ein paar Vorbereitungen notwendig.

Mit Pythonista lassen sich unter iOS Python-Skripte schreiben und ausführen. Was erstmal wirkt wie eine Spielerei, ist in Wirklichkeit ein mächtiges Werkzeug. Trotz der Einschränkungen von iOS (Stichwort Sandboxing) lassen sich zusätzliche Python-Module installieren. Unter anderem ein Modul, mit dem man mit seinem Evernote-Account kommunizieren kann.

Wie man den Evernote SDK in Pythonista einbinden kann, beschreibt der Entwickler von Pythonista, Ole Zorn, in einem Forums-Beitrag. Den Installier selber findet man hier. Gegenüber dem Originalskript habe ich allerdings eine kleine Veränderung vorgenommen und alle Vorkommnisse von „evernote-1.23.2“ ersetzt durch „ervernote-1.25.0“. Das ist deshalb wichtig, da nur in der neueren Version des Evernote SDK auch Reminder unterstützt werden.

Der besondere Clou liegt darin, unterschiedliche iOS-Applikation mittels URL Schemes zu verbinden. Mittlerweile gibt es viele Apps, die dieses Vorgehen unterstützen. Unter anderem Drafts und Pythonista.

Um mittels Python-Script auf Evernote-Notizen zugreifen zu können, muss sich das Script authentifizieren. Das lässt sich über ein so genanntes „Evernote Developer-Token“ bewerkstelligen. Ein Evernote Developer-Token für sein eigenes Konto kann man hier bekommen. An dieser Stelle beschreibt Evernote noch mal genau die Zusammenhänge. Direkt mit dem Developer-Token zu arbeiten im Script ist sicherlich nicht der eleganteste, für eigene Zwecke jedoch völlig ausreichend und vor allem unkompliziert.

Hat man sich das Token besorgt und den Evernote-SDK in Pythonista installiert, fehlen nur noch wenige Schritte. Zunächst einmal werden in Drafts zwei neue Aktionen angelegt, eine für „Aufgabe heute“ und die andere für „Aufgabe morgen“. Beide sind URL Actions.

Aufgabe heute:
pythonista://reminder?action=run&argv={{[[title]]}}&argv=heute

Aufgabe morgen:
pythonista://reminder?action=run&argv={{[[title]]}}&argv=morgen

Dabei ist „reminder“ das noch anzulegenden Skript, die Aktion weisst Pythonista an, dieses aufzurufen und als Parameter werden die ersten Zeile des Textes von Drafts und „heute“ bzw. „morgen“ übergeben.

Das dazugehörige Skript in Pythonista ist etwas komplizierter:

import sys
sys.path.append('evernote-sdk')
import time
import datetime
import webbrowser
import urllib
import console
console.clear()
print 'Sende zu Evernote...'
console.show_activity()
import evernote.edam.userstore.constants as UserStoreConstants
import evernote.edam.type.ttypes as Types
from evernote.api.client import EvernoteClient
dev_token = "HIERMUSSDEREIGENEDEVELOPERTOKENREIN"
client = EvernoteClient(token=dev_token, sandbox=False)
note_store = client.get_note_store()
message = sys.argv[1]
message = urllib.unquote(message)
note = Types.Note()
note.title = message
note.notebookGuid = 'GUIDNOTIZBUCH'
note.content = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note></en-note>
"""
now = int(round(time.time() * 1000))
then = now + 3600000 # one hour after `now`
morgen = datetime.date.today() + datetime.timedelta(days=1)
morgenunix = int(time.mktime(morgen.timetuple()))* 1000
note.attributes = Types.NoteAttributes()
note.attributes.reminderOrder = now
if sys.argv[2]=='morgen':
note.attributes.reminderTime = morgenunix
else:
note.attributes.reminderTime = now
try:
createdNote = note_store.createNote(note)
except Exception, e:
print type(e)
print e
raise SystemExit
print 'Fertig!'
webbrowser.open('drafts://x-callback-url')

Neben dem bereits erwähnten Delevoper-Token, der an der entsprechenden Stelle im Skript eingesetzt werden muss, fehlt noch die ID (die sogenannten GUID) des Notizbuchs, in dem die Notiz erstellt werden soll. Die einfachste Methode, daran zu gelangen, ist sich im Webbrowser bei Evernote mit seinen Daten anzumelden und das Notizbuch in seinem Account aufzurufen. In der URL steht dann eine Folge von Ziffern und Buchstaben, unter anderem ein Abschnitt weiter links, der mit folgende beginnt: #b= und mit &st= endet. Der Teil dazwischen ist die GUID des Notizbuches, die im Skript eingetragen werden muss.

Noch eine Anmerkung zum Ende des Python-Skripts. Dort wird wieder zurück zu Drafts gesprungen.

Nach den Vorarbeiten sollte es jetzt gelingen, über Drafts neue Notizen in Evernote mit Fälligkeitsdatum anzulegen.

Kommentar verfassen