Aljoscha Rittnerhttps://amplifi.casa/@/beandev@fediverse.blog/atom.xml2022-05-02T15:50:08.402606+00:00<![CDATA[Mastodon Instanz API nutzen - Erste Schritte]]>https://fediverse.blog/~/BeandevMastodon/Mastodon%20Instanz%20API%20nutzen%20-%20Erste%20Schritte/2022-05-02T15:50:08.402606+00:00Aljoscha Rittnerhttps://fediverse.blog/@/beandev/2022-05-02T15:50:08.402606+00:00<![CDATA[<h1 dir="auto">Einführung</h1>
<p dir="auto">Mastodon hat eine sehr saubere und klare REST API, für eine Menge an Operationen. Im Prinzip alles, was man in einem Client durchführen kann (Lesen, Nachrichten schreiben, Favorisieren, Bilder hochladen, usw. usf.) lässt sich ebenfalls über die API realisieren. Allerdings erfordert das natürlich eine Authentifizierung. Ohne sich der Instanz “Bekanntzumachen”, kann man nicht auf die API zugreifen.</p>
<p dir="auto">Mastodon verwendet dafür OAuth2, was sich deutlich von einer User/Password Authentifizierung, wie es BasicAuth erlaubt, unterscheidet. Ohne tiefer ins Detail zu gehen, ist es wichtig zu wissen, dass OAuth2 verschiedene Anmelde-Workflows bietet, die stufenweise funktionieren. Man muss sich das einfach so vorstellen: Da man als Mensch ja nicht direkt mit der Maschine “Mastodon-Instanz” (dem Host) reden kann, benutzt man immer einen Stellvertreter, eine Application (der Client). Ein Client, kann eine Smartphone-App wie Tusky oder Fedilab sein, es kann das Mastodon WebUI sein oder eben auch ein Python-Script.</p>
<p dir="auto">Eine Client-App, die mit einem Host sprechen will, muss damit sich erstmal registrieren. Ansonsten akzeptiert der Host den Client nicht. Das funktioniert bei Mastodon auf zwei Arten. Entweder selbst über die API (denn über die API darf man alles machen) oder man registriert über das Mastodon WebUI eine Client Application. </p>
<p dir="auto">Dass sich eine App einfach selber registrieren darf, ist übrigens nicht selbstverständlich. Im Fediverse ist das bei dezentralen Instanzen und den vielen Client-Implementationen aber deutlich einfacher zu handhaben. Man stelle sich vor jede App (Tusky, Fedilab, Mastodon, …) müsste auf jeder Instanz in Fediverse erstmal manuell von jedem Anwender oder Entwickler registriert werden, damit man Nachrichten schreiben kann! Das wäre eine riesige Hürde, die man in einem offenen Netzwerk so nicht haben will.</p>
<p dir="auto">Wichtig ist zu wissen, dass mit der Registrierung einer App, die Mastodon Instanz sich diese Information merkt und dem Registrierenden ein paar Daten mitgibt, die man immer wieder verwenden sollte. Damit kommen wir zu wichtigen Merkmalen von OAuth2. Die App bekommt eine ID (Client-ID) und ein Geheimnis (Client-Secret) zugewiesen. Diese beiden Informationen reichen aber noch nicht, um tatsächlich auf die API zuzugreifen. Es gibt noch ein Zugangstoken. Ein Token ist eine zeitlich begrenzter Zugangsschlüssel. So wie eine Hotelkarte, mit der man nur zu den gebuchten Tagen in das Hotelzimmer darf, ist ein Zugangstoken ebenfalls auf eine bestimmte Zeit beschränkt. Ist der Token abgelaufen, muss man sich einen neuen besorgen. </p>
<p dir="auto">Das ist ein recht aufwendiger Arbeitsablauf und erfordert ein paar Schritte. Zunächst registriert man sich als Application. Dafür denkt man sich einen Namen aus und gibt eine URL der eigenen Heimat an (oder man verwendet einen speziellen Platzhalter). Dann bekommt man eine ID, ein Secret und einen Token. Mit den drei Informationen darf man dann die ersten Abfragen durchführen. Da das immer wiederkehrende Arbeiten sind, verlässt man sich dabei besser auf Bibliotheken, die das für einen machen. Für Python gibt es <a href="https://github.com/halcy/Mastodon.py" rel="noopener noreferrer">Mastodon.py</a>. Diese Bibliothek ist nicht nur ein Wrapper für die gesamte REST-API, sie kümmert sich auch um den ganzen Workflow der Registrierung und Authentifizierung. Es ist sozusagen der persönliche Hotelpage, der einem bei allem hilft, inkl. dem Öffnen der Türen.</p>
<p dir="auto">Zwar erlaubt auch Mastodon.py das direkte Registrieren per API, aber es ist sinnvoller, das über das Web-UI zu machen. In dem Fall merkt sich das UI die Registrierung und speichert die Daten für einen. Nicht jede Instanz erlaubt das, aber die meisten. </p>
<h1 dir="auto">Application Client registrieren</h1>
<h2 dir="auto">Grunddaten</h2>
<p dir="auto">Zunächst geht man über das WebUi in Einstellungen und dort auf Entwicklung:</p>
<p dir="auto"><img src="https://fediverse.blog/static/media/E02A7EA4-D759-6052-70A9-194883FF2F56.png" alt="Mastodon - Entwicklung - Anwendungen"></p>
<p dir="auto">Mit dem Button “Neue Anwendung” lässt sich nun eine Client-App registrieren:</p>
<p dir="auto"><img src="https://fediverse.blog/static/media/0ED4FAAD-DA58-8886-C7B6-0896BB879DCC.png" alt="Mastodon - Neue Anwendung - Anlegen"></p>
<p dir="auto">Als Namen denkt man sich was Nettes aus, die URL kann das eigene Instanz-Profil sein und die Weiterleitungs-URL sollte mit dem Platzhalter “urn:ietf:wg:oauth:2.0:oob” beschrieben sein. Wir schreiben Scripte und werden keine Login-Eingaben an einen Benutzer weiterleiten. </p>
<h2 dir="auto">Berechtigungen</h2>
<p dir="auto">Im untereren Bereich kann man bei “Befugnissen” festlegen, was die Client Application überhaupt alles darf. In OAuth2 nennt man das den “Scope”. Für die ersten Spielereien sollte man nur den Haken bei “read” aktiviert haben, damit man sich nicht aus Versehen was kaputt macht. Also “write” und “follow” erstmal deaktivieren. Man sieht aber, dass man sich sehr viele Einzelberechtigungen zusammenstellen kann:</p>
<p dir="auto"><img src="https://fediverse.blog/static/media/162BA9A4-CAC9-CF2F-9255-60A1E1BBA2BF.png" alt="Mastodon - Neue Anwendung - Berechtigungen"></p>
<h2 dir="auto">OAuth2 Daten der Registrierung</h2>
<p dir="auto">Nachdem man alles mit dem großen blauen Speicherbutton am Ende gesichert hat, ist erstmal Verwirrung angesagt. Nirgendwo sieht man nun die Client-ID und das Secret und auch kein Token. Dafür nun in der Liste der Anwendungen wieder auf den Namen klicken, und voilà: die OAuth2 Daten:</p>
<p dir="auto"><img src="https://fediverse.blog/static/media/1C51335D-0BA3-2483-C041-A9956E3E14C5.png" alt="Mastodon - Anwendung - OAuth2 Daten"></p>
<h1 dir="auto">Mastodon.py installieren</h1>
<p dir="auto">Ich gehe davon aus, dass Grundkenntnisse in Python existieren und vor allem eine Umgebung existiert, in Python zu entwickeln. Viele werden pip oder pip3 verwenden, also ist Mastodon.py schnell installiert.</p>
<pre><code dir="auto">pip3 install Mastodon.py
</code></pre>
<h1 dir="auto">Das erste Script</h1>
<p dir="auto">Nun die IDE der Wahl öffnen und ein superkleines Beispiel (noch nicht vollständig):</p>
<pre><code dir="auto"><span class="source"><span class=""><span class="keyword control">import</span> <span class=""><span class="">json</span></span></span>
<span class=""><span class="keyword control">from</span></span><span class=""><span class=""> <span class=""><span class="">mastodon</span></span> <span class=""><span class="keyword control">import</span></span></span></span><span class=""></span><span class=""> <span class="">Mastodon</span></span>
<span class=""><span class="">mastodon</span></span> <span class="keyword operator">=</span> <span class=""><span class=""><span class="variable function">Mastodon</span></span> <span class="punctuation">(</span><span class="">
<span class="variable parameter">client_id</span><span class="keyword operator">=</span><span class="string"><span class="string"><span class="punctuation string">'</span></span></span><span class="string"><span class="string">ep***************************************Xo<span class="punctuation string">'</span></span></span><span class="punctuation">,</span>
<span class="variable parameter">client_secret</span><span class="keyword operator">=</span><span class="string"><span class="string"><span class="punctuation string">'</span></span></span><span class="string"><span class="string">AY**********************************0s<span class="punctuation string">'</span></span></span><span class="punctuation">,</span>
<span class="variable parameter">api_base_url</span><span class="keyword operator">=</span><span class="string"><span class="string"><span class="punctuation string">'</span></span></span><span class="string"><span class="string">https://social.tchncs.de<span class="punctuation string">'</span></span></span>
</span><span class="punctuation">)</span></span>
</span></code></pre>
<p dir="auto">Wir brauchen “json” für bequemere Ausgaben und dann wird das installierte Mastodon.py importiert. Im nächsten Schritt wird das Mastodon-Object erzeugt und wir übergeben die client_id und das client_secret (aus dem Web-UI sind das Client-Schlüssel und Client-Secret). Die api_base muss die Instanz sein, wo wir die App registriert haben.</p>
<p dir="auto">Ups, warum nicht das Token? Wir lassen unseren Hotelpagen “Mastodon.py” den Job machen. Fehlt der Token, fragt Mastodon.py direkt nach einem neuen Token an. Etwas verschwenderisch, aber hier sinnvoll. Denn der Token läuft sowieso irgendwann ab und wir wollen ja nicht jedes Mal das Script ändern…</p>
<p dir="auto">Nun fügen wir aber noch was dem Script an:</p>
<pre><code dir="auto"><span class="source"><span class=""><span class="">nodeinfo</span></span> <span class="keyword operator">=</span> <span class=""><span class=""><span class="">mastodon</span><span class="punctuation">.</span></span><span class=""><span class="variable function">instance_nodeinfo</span></span><span class="punctuation">(</span><span class="punctuation">)</span></span>
<span class=""><span class=""><span class="support function">print</span> </span><span class="punctuation">(</span><span class=""><span class=""><span class=""><span class="">json</span><span class="punctuation">.</span></span><span class=""><span class="variable function">dumps</span></span><span class="punctuation">(</span><span class=""><span class=""><span class="">nodeinfo</span></span><span class="punctuation">,</span> <span class="variable parameter">indent</span><span class="keyword operator">=</span><span class="constant numeric">4</span><span class="punctuation">,</span> <span class="variable parameter">default</span><span class="keyword operator">=</span><span class=""><span class="support type">str</span></span></span><span class="punctuation">)</span></span></span><span class="punctuation">)</span></span>
<span class=""><span class="">activity</span></span> <span class="keyword operator">=</span> <span class=""><span class=""><span class="">mastodon</span><span class="punctuation">.</span></span><span class=""><span class="variable function">instance_activity</span></span><span class="punctuation">(</span><span class="punctuation">)</span></span>
<span class=""><span class=""><span class="support function">print</span> </span><span class="punctuation">(</span><span class=""><span class=""><span class=""><span class="">json</span><span class="punctuation">.</span></span><span class=""><span class="variable function">dumps</span></span><span class="punctuation">(</span><span class=""><span class=""><span class="">activity</span></span><span class="punctuation">,</span> <span class="variable parameter">indent</span><span class="keyword operator">=</span><span class="constant numeric">4</span><span class="punctuation">,</span> <span class="variable parameter">default</span><span class="keyword operator">=</span><span class=""><span class="support type">str</span></span></span><span class="punctuation">)</span></span></span><span class="punctuation">)</span></span>
</span></code></pre>
<p dir="auto">Node-Info gibt eine kleine Information der Instanz zurück, Activity eine Statistik darüber, was eigentlich so los ist. Es muss beachtet werden, dass manche Instanzen diese Abfragen nicht erlauben. Dann hagelt es Fehlermeldungen. </p>
<p dir="auto">Was abschließend noch wichtig ist. Wir haben hiermit auf öffentliche Daten der Instanz zugegriffen. Die Registrierung der Client-App (also unseres Scriptes) wurde zwar über das Web-UI (unter unserem Account) angelegt, aber wir verwendeten hier noch keinerlei Benutzerdaten. Das war für diese API Aufrufe auch nicht notwendig, weil wir keine benutzerbezogenen Aktionen ausführten. Es ist sogar möglich über den Mastodon.py Wrapper sich nur als App zu registrieren und die Informationen abzurufen. Das ist eine sehr offene Art, mit einer API umzugehen. Allerdings gibt es immer Einschränkungen. Jede Instanz kann selbst entscheiden, was abrufbar ist und auch die Häufigkeit der Abfragen ist limitiert. Fragt man zu oft einer eine Zeitperiode bestimmte Endpunkte ab, bekommt man Fehlermeldungen. Mastodon.py hat in diesem Fall verschiedene Strategien, wie es damit umgeht. Dazu aber in einem späteren Beitrag.</p>
]]><![CDATA[Einstand]]>https://fediverse.blog/~/BeandevMastodon/Einstand/2022-05-02T12:14:17.687336+00:00Aljoscha Rittnerhttps://fediverse.blog/@/beandev/2022-05-02T12:14:17.687336+00:00<![CDATA[<p>Vor kurzer Zeit fragte ich, ob es neben Plume noch andere bekanntere Blogsoftware (und Dienste) für das Fediverse gibt. Allerdings gibt es nicht viel, außer vielleicht WriteFreely. Sogar Plume schreibt selbst auf <a href="https://joinplu.me/" rel="noopener noreferrer">https://joinplu.me/</a>, dass die Software gerade nicht sehr aktuell ist und die Entwicklung stockt. Trotzdem erscheint mir gerade die Übersichtlichkeit der Funktionen besonders attraktiv. Zudem gibt es wohl doch ein klein wenig Entwicklungsarbeiten an Plume, da in diesem Jahr schon die Versionen 0.7.0 und 0.7.1 erschienen sind und die Integration in Mastodon verbessert.</p>
<p>Ich brauche nicht mehr als ein wenig Markdown und etwas Syntax-Highlighting:</p>
<pre><code><span class="source"><span class=""><span class="">world</span></span><span class="keyword operator">=</span><span class="string"><span class="string"><span class="punctuation string">'</span></span></span><span class="string"><span class="string">Fediverse<span class="punctuation string">'</span></span></span>
<span class=""><span class=""><span class="support function">print</span> </span><span class="punctuation">(</span><span class=""><span class="storage type string">f</span><span class="string"><span class="string"><span class="punctuation string">"</span></span></span><span class="string"><span class="string">Hello </span><span class=""><span class="punctuation">{</span><span class="source"><span class=""><span class="">world</span></span></span></span><span class=""><span class="punctuation">}</span></span><span class="string"><span class="punctuation string">"</span></span></span></span><span class="punctuation">)</span></span>
</span></code></pre>
<p>Das scheint auch gut zu funktionieren.</p>
<p>In diesem Blog soll es etwas um Mastodon gehen. Primär aus technischer Sicht (also API, Entwicklung, Scripting usw.), aber auch News und gesellschaftliche wie soziale Themen rund ums Fediverse.</p>
]]>