Das ist so eine dieser Sachen, wenn du merkst, du hast einen Job zu erledigen, und denkst: schreibe ich schnell ein paar Zeilen Code, die das für mich erledigen. Zack, hast du ein neues Projekt am Hals. Aber es hat Früchte getragen: ein wenig in Python-Routinen gegossene Hilfe, um Lesezeichen aus dem alternden Bookmarking-Dienst Diigo zu retten.
Animation created with Luma Labs Dream Machine
Diigo war damals, eine Offenbarung. So um 2010 war das, als ich anfing, den „Social Bookmarking“-Dienst produktiv einzusetzen; bis dahin hatte ich delicio.us genutzt, aber der ging unter, und Diigo war viel besser. Also war ich irgendwann auch zahlender Kunde; Diigo war’s wert. Seitdem habe ich also einige tausend Internet-Fundstücke abgelegt, verschlagwortet, mit Notizen und Anmerkungen versehen.
Aber der Dienst ist eine Sackgasse, und noch dazu eine, in der es sich immer ungemütlicher anfühlt. Zum einen ist das ganze Konzept „Social Bookmarking“ aus der Zeit gefallen – ist der Nutzen, den ein paar hypothetische Follower aus meinen Bookmarks haben, das Privatsphären-Risiko wert? Und dann erscheint es mir auch ein wenig unangemessen, dass all diese Arbeit als Trainingsmaterial für jede beliebige KI herumliegt.
Der zweite, gewichtigere Grund, Diigo zu verlassen: Der Dienst wird unzuverlässig. Bookmarks sind nicht wiederzufinden, auf unterschiedlichen Geräten ist die Datenbank auf unterschiedlichem Stand. Also fürchte ich, dass der Dienst keine Zukunft hat, auch wenn er Mitte 2024 noch läuft. Gerade so.
Mit der offiziellen API geht alles seinen sozialistischen Gang
Es gibt ja Hoffnung – in Form einer Möglichkeit, über die Diigo-Website ein Export-CSV zu erzeugen, und über eine offizielle API-Schnittstelle. Die CSV-Dateien kann man auch wieder importieren; die frühesten meiner Codeschnipsel tun genau das und schieben die Bookmarks in eine Nextcloud-Bookmark-Installation. Einziger Wermutstropfen ist, dass dabei das Erstellungsdatum verloren geht, aber die Inhalte sind schon mal gesichert.
Bei Diigo löschen – oder wenigstens auf privat setzen – müsste ich sie immer noch, und auch wenn es auf der Website Möglichkeiten zum „bulk edit“ gibt, ist mir das bei einigen tausend Bookmarks zu viel Handarbeit. Automate the boooring stuff – ein Job für ein Python-Skript und die Diigo-API.
Die Diigo-API ist dann wiederum lausig dokumentiert und strahlt starke „Ich weiß, ist noch nicht fertig, mach ich später“-Vibes ab. Man muss sich ein API-Token generieren lassen, das man zusammen mit Nutzernamen und Passwort einsetzen muss, und bekommt dafür eigentlich nur zwei Funktionen: Bookmark lesen, und Bookmark anlegen/überschreiben.
Nach etwas Herumexperimentieren habe ich eine dritte Funktion gefunden, die die Lösung meiner Aufgabe überhaupt erst ermöglicht: Über einen HTTP-DELETE-Aufruf der API kann man Bookmarks auch löschen. Das funktioniert, aber ist massiv begrenzt: Etwa ein Dutzend Aufrufe erlaubt die API, dann zwingt sie einen zu ein paar Minuten Wartezeit, ehe man nochmal zehn Bookmarks löschen kann, dann wieder warten… mein erstes Skript wurde davon immer wieder abgeschossen.
Gibt’s da nicht was besseres?
Nun, es gibt einen besseren Weg, zumindest für einige Aufgaben. Die Diigo-Webseite hat ein paar Methoden mehr zur Verfügung, als sie die offizielle API bereitstellt. Sie nutzt zusätzliche Aufruf-Punkte, und die kann sich auch ein externes Skript (wie meines) zunutze machen.
Sie macht auch die Legitimierung der API-Aufrufe erst ein wenig schwieriger und dann sehr viel leichter. Sie nutzt nämlich kein API-Token, sondern die Session-Cookies aus einer Browseranmeldung. Wenn man sich also einmal für das Skript im Browser angemeldet und das nervige Klicke-alle-Ampeln-während-ich-sie-durchrotiere-CAPTCHA gelöst hat, kann man diese API-Aufrufe nach Herzenslust und anscheinend ohne Mengenbeschränkung nutzen.
Schnell darfst du trotzdem nicht via API-Aufruf
Kleine zusätzliche Gemeinheit: Der Aufruf, der ein Lesezeichen anlegt oder überschreibt, muss vorgetäuscht bekommen, dass man ihn von einem Browser aus tätigt, dann funktioniert er auch. Leider reicht das nicht für drei weitere Funktionen, die die Sache enorm beschleunigen würden: delete_b, mark_readed und convert_mode – eine ganze Liste von Bookmarks auf einen Schlag bearbeiten bzw. löschen.
Diese Aufrufe erzeugen eine „403 Forbidden“-Meldung, und ich kriege sie bislang nicht zum Laufen. Solange das nicht funktioniert, muss mein Programm sich (und den Nutzer) durch 100 Einzelaufrufe quälen, wo es einen API-Call für 100 Bookmarks auslösen könnte. Ich habe mal eine Mail geschickt; wenn ich Antwort kriege, ergänze ich.
Was jetzt schon geht
Im Repository findet sich ein Python-Skript, das nach Aufruf mit
python main.py
über textbasierte Auswahl-Menüs folgende Funktionen zur Verfügung stellt
- Setze alle Diigo bookmarks auf privat
- Exportieren, Löschen und Reimportieren nach Nextcloud
- Import und Export von CSV-Dateien nach Nextcloud
- CSV-Dateien checken
…und der heiße Scheiß kommt später
Natürlich habe ich drüber nachgedacht, wie mir KI helfen kann, meine Lesezeichen besser zu verwalten, und natürlich könnte ein Sprachmodell helfen, Bookmarks zu ergänzen, besser zu vertaggen, genauer zu beschreiben – und vielleicht eines Tages sogar ein Embedding dafür in eine Vektordatenbank zu schreiben, damit man mit einem KI-Chatbot über die passenden Lesezeichen diskutieren kann. Das müsste nach meinen ersten Versuchen auch mit einem lokalen Sprachmodell wie Aya oder Gemma2:9b ganz passabel gehen.
Ein andermal.
Verwandte Artikel:
- Delicious noch köstlicher machen (Montag, 19. Januar 2009; Schlagworte: delicious.com, Gedächtnis, Mr. Wong, Onlinejournalismus, Social Bookmarking)
- untergeek lernt Drupal (Mittwoch, 22. Juli 2009; Schlagworte: Drupal, memory_limit, Openatrium, PHP, Projektmanagement, Speicher, Strato, Tools)
Oh ja. Ich finde, dass Diigo seit der Abschaffung der Listen und Einführung von Outliners nachgelassen hat. Seitdem nimmt man auch kein Lebenszeichen mehr von den Betreibern wahr. Gerade jetzt hätten sie die Möglichkeit, ihre Plattform etwas aufzufrischen und KI-generierte Seitenzusammenfassungen, KI-generierte Tags etc. zu implementieren, um die Plattform auf einen moderneren Stand zu bringen. Dennoch finde ich es ist bis heute die beste Möglichkeit seit Delicious sich an Yahoo verkauft hat, seine Bookmarks zu verwalten. Highlighter benutze ich sehr gerne. Von Synchronisationsproblemen habe ich noch nichts mitbekommen — aber manchmal muss man seine Library im Browser öffnen, damit das Browser-Addon wieder Kontakt zur Hauptseite hat und die Daten richtig speichert. Die „social“ Features haben mich noch nie interessiert — bzw. ich suche mir gerne aus, wem ich mitteile, dass ich überhaupt existiere bzw. was mich beschäftigt. Von daher ist bei mir per Defaulteinstellung alles von Anfang an privat.
Ich sehe mir gerade die X-te Lösung an, die eventuell Diigo ersetzen könnte – in meiner persönlichen Bewertung haben eigentlich alle grundsätzlich schlechter abgeschnitten als Diigo. iki.ai heißt das Ding (z.Zt. im Angebot auf der Seite Appsumo). Zusätzlich zu Bookmarks kannst Du auch noch u.a. YT-Videos speichern u. transcribieren lassen, Dokumente hochladen und mit deiner eigenen Bibliothek chatten, natürlich auch innerhalb der Plattform im Netz recherchieren und so gefundene Informationen zur eigenen Bibliothek hinzufügen. Beim ersten Test wirkt es ganz cool. Aber auf den zweiten Blick wäre ich vorerst vorsichtig damit, vorbehaltlos meine Dokumente hochzuladen. Zum Bookmarken von Artikeln und Videos ist es vielleicht vorerst OK. Für persönliche Dokumente lieber nicht — die PDFs liegen scheinbar unverschlüsselt in irgendeiner Cloud. Eine Exportfunktion vermisse ich ebenfalls noch. Aber vielleicht tut sich da ja noch was im Laufe der weiteren Entwicklung.
Tatsächlich bin ich nach einigen Wochen Nextcloud-Bookmarks so mittelzufrieden, aber es funktioniert. Meine Hoffnung ist, dass KI-Funktionen wie Transkription und automatische Tag-Generierung nach und nach entstehen und ich mir nicht selbst was schreiben muss. :(