Bei Diensten wie Twitter, vertraue ich meine Inhalte und Daten einem zentralen Anbieter an. Das kann zum Problem werden, da ich von diesem Anbieter abhängig werde und die Kontrolle verliere, ob und wie lange meine Daten für mich und andere verfügbar sind. Ich möchte jedoch Datensouveränität, also meine Daten langfristig für eigene Zwecke nutzen können. Ich habe deshalb alle meine Tweets in einen Solid Pod exportiert.
Dank der DSGVO sind Twitter und Co. inzwischen verpflichtet, persönliche Daten auf Anfrage maschinenlesbar heraus zu geben. Bei Twitter findest du die Option in den Account Einstellungen unter „Deine Twitter Daten“:
Sobald Twitter dir das Archiv bereit gestellt hat, kannst du dessen kompletten Inhalt auf einen Solid Pod hochladen. Neben strukturierten JSON-Daten enthält es auch eine hübsche HTML Variante, die du unter der entsprechenden Pod-URL abrufen kannst:
Nun hast du ein persönliches Online-Archiv all deiner Twitter-Aktivitäten, das dir niemand mehr wegnehmen kann. Die Zugriffsrechte des Ordners solltest du auf jeden Fall beschränken, da das Archiv auch private Daten, wie zum Beispiel Direktnachrichten enthält.
Die HTML-Seite ist ganz nett, die Stärke von Solid liegt aber in der Verlinkung von Daten, um diese in anderen Kontexten nutzbar zu machen. Ich möchte, dass andere auf die Tweets verweisen können, um mit ihnen zu interagieren. Ich habe daher die öffentlichen Tweets auch als Linked Data in meinem Pod verfügbar gemacht.
Im Original-Archiv liegen alle Tweets maschinenlesbar in der Datei data/tweet.js
vor. Mit einem kleinen NodeJS-Skript habe ich diese zu Linked Data konvertiert. Zunächst iteriert das Skript durch die Liste der Tweets und legt für jeden Tweet eine Ressource in einem rdflib Store an:
const me = sym('https://angelo.veltens.org/profile/card#me');
tweets.forEach(({id, full_text, created_at}) => {
const date = new Date(created_at);
const path = createPath(date, id);
const doc = sym(`https://store.example/${path}`)
const it = sym(`https://store.example/${path}#it`);
store.add(it, RDF('type'), AS('Note'), doc);
store.add(it, AS('content'), full_text, doc);
store.add(it, AS('attributedTo'), me, doc);
store.add(it, AS('published'), date, doc);
store.add(it, AS('url'), sym(`https://twitter.com/i/web/status/${id}/`), doc);
targetFiles.push({ doc, path })
});
Ich habe mich für das Activity-Streams-Vokabular entschieden, da dieses bereits erfolgreich im Fediverse (z.B. Mastodon) verwendet wird und ich möglichst kompatibel werden möchte.
Nachdem alle tweets zum Typ as:Note
konvertiert wurden exportiere ich jede Ressource in eine eigene Turtle (.ttl
) Datei. Dadurch können bei Bedarf feingranulare Zugriffsrechte gesetzt werden:
targetFiles.forEach(({doc, path}) => {
const data = serialize(doc, store, null, 'text/turtle')
const file = `./data/result/${path}$.ttl`
writeFile(file, data);
})
Das war auch schon alles Wesentliche. Das ganze Skript inklusive der hier nicht gezeigten Hilfsmethoden habe ich als Snippet bei Gitlab hinterlegt.
Nachdem das Ergebnis auf einen Solid Pod geladen wurde, wird jeder Tweet durch eine URI identifiziert und kann abgerufen und verlinkt werden. Der unten abgebildete Tweet zum Beispiel hat die URI https://angelo.veltens.org/public/tweets/2019/08/1161337802652626946#it.
Der Solid Data Browser ist in der Lage, sowohl eine HTML Ansicht des Tweets zu rendern, als auch die zugrunde liegenden Rohdaten anzuzeigen:
Nun können die „Tweets“ im Solid Ökosystem ihr volles Potential entfalten und unabhängig von der Plattform Twitter bestehen.
Vielleicht hast du ja Lust, eine Solid Microblogging-App zu bauen?