Einbetten von Mastodon Nachrichten

Hoftage der Reichs- und Kurfürsten.

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Einbetten von Mastodon Nachrichten

Hi,

ich habe mir das Thema nochmal angeschaut und denke eine Lösung für das Einbinden von Toot's gefunden zu haben. Sprich ich habe da selber etwas gebaut. Soll ich das ins Forum einbauen? Ich habe bisher erstmal nur einen PoC (Proof of Concept) erstellt, ob das überhaupt irgendwie geht.

Es müsste da aber noch ein wenig Arbeit reingesteckt werden, dass das dann aus einem BB-Code einen eingebetteten Toot macht. Außerdem ist da ziemlich viel Javascript notwendig 🙄, dass dann irgendwie ins Forums-Javascript integriert werden muss.

Hier ist der Code von meinem PoC:

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Mastodon oembed test</title>
    <style>
      .mastodon-embed {
        display: block;
        margin: 10px 0;
      }
    </style>
  </head>
  <body>
    <div>
      <input type="text" name="toot" class="js-mastodon-input" />
      <input type="button" id="embed" value="Einbinden" />
    </div>
    <div class="js-mastodon-embed-container"></div>
    <script async="async">
      const iframes = new Map();
      const $container = document.querySelector(".js-mastodon-embed-container");
      const mastodonUrlMatcher = /(https?:\/\/[^/]*)\/@[^@/]*\/[^?/]*/g;

      const isValidUrl = (candidate) => {
        let url;
        try {
          url = new URL(candidate);
        } catch (_) {
          return false;
        }
        return url.protocol === "http:" || url.protocol === "https:";
      };

      const htmlToIframeElement = (html) => {
        if (!html) return;
        const template = document.createElement("template");
        template.innerHTML = html.trim();
        // we only want the iframe and not the embedded script tag
        return template.content.firstChild;
      };

      const getNewId = () => {
        let id = 0;
        let failCount = 0;
        let idBuffer = new Uint32Array(1);
        while (id === 0 || iframes.has(id)) {
          id = crypto.getRandomValues(idBuffer)[0];
          failCount++;
          if (failCount > 100) {
            // give up and assign (easily guessable) unique number if getRandomValues is broken or no luck
            id = -(iframes.size + 1);
            break;
          }
        }

        return id;
      };

      const setHeightMessageHandler = (e) => {
        const data = e.data || {};

        if (
          typeof data !== "object" ||
          data.type !== "setHeight" ||
          !iframes.has(data.id)
        ) {
          return;
        }

        const iframe = iframes.get(data.id);

        if ("source" in e && iframe.contentWindow !== e.source) {
          return;
        }

        iframe.height = data.height;
      };

      const embedToot = async (toot) => {
        if (!isValidUrl(toot)) {
          return;
        }

        const matchedUrlParts = mastodonUrlMatcher.exec(toot);
        if (!matchedUrlParts || matchedUrlParts.length !== 2) {
          return;
        }

        const [mastodonTootUrl, instanceUrl] = matchedUrlParts;
        const response = await fetch(
          `${instanceUrl}/api/oembed?url=${mastodonTootUrl}&maxwidth=550`
        );
        if (response.status !== 200) {
          return;
        }

        const responseJson = await response.json();
        const iframe = htmlToIframeElement(responseJson.html);
        const id = getNewId();

        iframes.set(id, iframe);
        iframe.scrolling = "no";
        iframe.style.overflow = "hidden";
        iframe.onload = function () {
          iframe.contentWindow.postMessage(
            {
              type: "setHeight",
              id: id,
            },
            "*"
          );
        };
        $container.append(iframe);
      };

      window.addEventListener("message", setHeightMessageHandler);
    </script>

    <script async="async">
      const $toot = document.querySelector(".js-mastodon-input");
      const $embed = document.getElementById("embed");
      if ($toot && $embed) {
        $embed.addEventListener("click", () => {
          embedToot($toot.value);
        });
      }
    </script>
  </body>
</html>
Wer den PoC testen will, das Ganze einfach als index.html Datei speichern und mit nem Browser öffnen. Ins Textfeld dann die URL von einem Toot reinkopieren, die man aus dem Klick auf Teilen > Auf einem anderem Server > Kopieren gewinnt.
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag:
Montesquieu
Bewertung: 2.13%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von [B@W] Abominus »

Benutzeravatar
[B@W] Abominus
Beiträge: 52603
Registriert: Di 16.09.2003, 12:00
Hat sich bedankt: 14081 Mal
Danksagung erhalten: 17566 Mal
SI-VerdienstkreuzGroßkreuz des Veteranenorden in bes. AusführungPour le Mérite+25

Ich wäre fürs Einbauen, macht den Monti happy.
Stellaris Mods: Steam-Workshop
Crusader Kings II Mods: Steam-Workshop

Beitrag von Montesquieu »

Benutzeravatar
Montesquieu
Rang 20
Beiträge: 27610
Registriert: Fr 29.07.2005, 12:00
Hat sich bedankt: 18208 Mal
Danksagung erhalten: 15317 Mal
SI-VerdienstordenGroßkreuz des VeteranenordenRitterkreuz des Sankt Nikolaus-Ordens+22

Und alles, was den Monti happy macht, macht den Musk traurig. :D

Super Idee, wenn's denn nicht zu problematisch ist.

Wie sind denn eure Accounts da drüben überhaupt?
Der texanische Senator der Herzen

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Ich habe weder einen Account bei Twitter noch bei einer Mastodon Instanz ^^

Ok, ich werde mich dann heute Abend da mal ransetzen, dass ins Forum zu frimmeln.
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag (Insgesamt 3):
[B@W] Abominus, dooya, Alith Anar
Bewertung: 6.38%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von dooya »

Benutzeravatar
dooya
Rang 20
Beiträge: 24960
Registriert: Di 21.12.2004, 12:00
Hat sich bedankt: 5307 Mal
Danksagung erhalten: 20875 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. AusführungGroßkreuz des Sankt Nikolaus-Ordens+8

Keine Einwände.
Wie sind denn eure Accounts da drüben überhaupt?
Hab bislang noch keinen.
Nobody exists on purpose. Nobody belongs anywhere. Everybody’s gonna die. Come watch TV?

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Ich würde noch eine Liste von erlaubten Mastodon-Instanzen hinterlegen wollen und wenn ein Toot einer unbekannten Instanz eingebunden werden soll, würde ich eine Fehlermeldung anzeigen.

Bisher kenne ich aber nur mastodon.social und newsie.social, was sind denn noch vertrauenswürdige Mastodon Instanzen?

Hier findet man eine kleine Liste von Mastodon-Instanzen: https://joinmastodon.org/de/servers
Welche sollen es denn sein?
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag:
Montesquieu
Bewertung: 2.13%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von dooya »

Benutzeravatar
dooya
Rang 20
Beiträge: 24960
Registriert: Di 21.12.2004, 12:00
Hat sich bedankt: 5307 Mal
Danksagung erhalten: 20875 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. AusführungGroßkreuz des Sankt Nikolaus-Ordens+8

Die Tatsache, dass wir eine solche Whitelist führen müssten, spricht für mich gegen das Plugin. 99% zensurfrei, remember?
Nobody exists on purpose. Nobody belongs anywhere. Everybody’s gonna die. Come watch TV?

Beitrag von [B@W] Abominus »

Benutzeravatar
[B@W] Abominus
Beiträge: 52603
Registriert: Di 16.09.2003, 12:00
Hat sich bedankt: 14081 Mal
Danksagung erhalten: 17566 Mal
SI-VerdienstkreuzGroßkreuz des Veteranenorden in bes. AusführungPour le Mérite+25

Das muss unser Papa-Elefant Monti entscheiden.
74jcai.jpg
Folgende Benutzer bedankten sich beim Autor [B@W] Abominus für den Beitrag (Insgesamt 2):
dooya, Garfield
Bewertung: 4.26%
 
Stellaris Mods: Steam-Workshop
Crusader Kings II Mods: Steam-Workshop

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

dooya hat geschrieben:Die Tatsache, dass wir eine solche Whitelist führen müssten, spricht für mich gegen das Plugin. 99% zensurfrei, remember?
Es geht mir dabei nicht um Zensur, sondern um Sicherheit. Wir binden hier per Iframe Code von einer unbekannten Quelle ein. Damit kann halt bei den Nutzern allerlei Unfug getrieben werden. Ja wir sind klein und unbedeutend, so dass sich wohl niemand die mühe machen würde, ein wenig Mastodon-Logik zu implementieren um uns anzugreifen, aber ausschließen kann man es nicht. Wenn man halt bekannte Domains hinterlegt, ist dieser Angriffsvektor halt erstmal vernagelt.
Wer lesen kann, ist klar im Vorteil.

Beitrag von dooya »

Benutzeravatar
dooya
Rang 20
Beiträge: 24960
Registriert: Di 21.12.2004, 12:00
Hat sich bedankt: 5307 Mal
Danksagung erhalten: 20875 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. AusführungGroßkreuz des Sankt Nikolaus-Ordens+8

JoeMill hat geschrieben:Es geht mir dabei nicht um Zensur, sondern um Sicherheit. Wir binden hier per Iframe Code von einer unbekannten Quelle ein. Damit kann halt bei den Nutzern allerlei Unfug getrieben werden. Ja wir sind klein und unbedeutend, so dass sich wohl niemand die mühe machen würde, ein wenig Mastodon-Logik zu implementieren um uns anzugreifen, aber ausschließen kann man es nicht. Wenn man halt bekannte Domains hinterlegt, ist dieser Angriffsvektor halt erstmal vernagelt.
Ich weiß, dass es nicht um Zensur geht, aber wenn innerhalb der Regentschaft bekannt wird, dass nicht alle Mastodon-Instanzen erlaubt sind, hat man u.U. eine Zensurdiskussion am Hals. Die Diskussion, ob eine Instanz vertrauenswürdig ist oder nicht, basiert vermutlich kaum auf harten/technischen Argumenten, sondern auf einer charakterlichen Einschätung der Betreiber. Auf solche Diskussionen würde ich gern verzichten.
Nobody exists on purpose. Nobody belongs anywhere. Everybody’s gonna die. Come watch TV?

Beitrag von Montesquieu »

Benutzeravatar
Montesquieu
Rang 20
Beiträge: 27610
Registriert: Fr 29.07.2005, 12:00
Hat sich bedankt: 18208 Mal
Danksagung erhalten: 15317 Mal
SI-VerdienstordenGroßkreuz des VeteranenordenRitterkreuz des Sankt Nikolaus-Ordens+22

dooya hat geschrieben:Ich weiß, dass es nicht um Zensur geht, aber wenn innerhalb der Regentschaft bekannt wird, dass nicht alle Mastodon-Instanzen erlaubt sind, hat man u.U. eine Zensurdiskussion am Hals. Die Diskussion, ob eine Instanz vertrauenswürdig ist oder nicht, basiert vermutlich kaum auf harten/technischen Argumenten, sondern auf einer charakterlichen Einschätung der Betreiber. Auf solche Diskussionen würde ich gern verzichten.
Bin ich anderer Meinung bzw. sollten wir es uns einfach machen.

Können wir anstatt einer whitelist denn nicht eine blacklist betreiben?

Nehmen wir doch einfach die blacklist von mastodon.social?

https://mastodon.social/about

Ist die größte Instanz und im Blocken relativ human. D. h. es werden vor allem Nazis, Spam-Instanzen und Bot-Netze geblockt. Die würde ich schon dann ausschließen wollen.

Und ja, den Weg, da zu diskutieren gehe ich gerne. Wer hier Nazi-Instanzen haben will, soll sich mal zeigen.
Der texanische Senator der Herzen

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Ich habe da mal was gebaut:

https://octodon.social/@jalefkowit/109521498392448582

Code: Alles auswählen

[ toot]https://octodon.social/@jalefkowit/109521498392448582[/toot]
[ toot]https://mastodon.social/@Tibor/109520338526122840[/toot]
Auf dem FTP liegen jetzt zwei zusätzliche Dateien:
/forum/clientscript/mastodon-embed.js
/forum/clientscript/mastodon-embed.css

Welche ich im "headerinclude" vom Template hinzugefügt habe.

Code: Alles auswählen

<script src="{vb:raw vboptions.bburl}/clientscript/mastodon-embed.js"></script>
<link rel="stylesheet" href="{vb:raw vboptions.bburl}/mastodon-embed.css" />

In der mastodon-embed.js gibt es zwei Listen:

Code: Alles auswählen

  const allowedMastodonInstances = new Set([]);
  const blockedMastodonInstances = new Set([]);
dort kann man Instanzen eintragen. Solange die Listen leer sind passiert nichts, sobald ein Eintrag drin steht greift die jeweilige Liste.

Das Ganze sind Komma separierte Listen welche die URL einer Instanz enthalten. Beispiel: Nur noch mastodon.social und octodon.social sind erlaubt, würde so aussehen:

Code: Alles auswählen

  const allowedMastodonInstances = new Set(["https://mastodon.social", "https://octodon.social"]);
  const blockedMastodonInstances = new Set([]);
Alle außer mastodon.social und octodon.social sind erlaubt, würde so aussehen.

Code: Alles auswählen

  const allowedMastodonInstances = new Set([]);
  const blockedMastodonInstances = new Set(["https://mastodon.social", "https://octodon.social"]);
Wenn irgendwas nicht funktionieren sollte, wird inline eine Fehlermeldung angezeigt.
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag (Insgesamt 3):
dooya, Montesquieu, [B@W] Abominus
Bewertung: 6.38%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von Montesquieu »

Benutzeravatar
Montesquieu
Rang 20
Beiträge: 27610
Registriert: Fr 29.07.2005, 12:00
Hat sich bedankt: 18208 Mal
Danksagung erhalten: 15317 Mal
SI-VerdienstordenGroßkreuz des VeteranenordenRitterkreuz des Sankt Nikolaus-Ordens+22

Du bist ein Held! :eek:
Folgende Benutzer bedankten sich beim Autor Montesquieu für den Beitrag:
[B@W] Abominus
Bewertung: 2.13%
 
Der texanische Senator der Herzen

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Soll/Kann ich dazu einen Post Ankündigungen und Neuigkeiten verfassen?
Wer lesen kann, ist klar im Vorteil.

Beitrag von [B@W] Abominus »

Benutzeravatar
[B@W] Abominus
Beiträge: 52603
Registriert: Di 16.09.2003, 12:00
Hat sich bedankt: 14081 Mal
Danksagung erhalten: 17566 Mal
SI-VerdienstkreuzGroßkreuz des Veteranenorden in bes. AusführungPour le Mérite+25

Ja gerne.
Stellaris Mods: Steam-Workshop
Crusader Kings II Mods: Steam-Workshop

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag (Insgesamt 2):
[B@W] Abominus, Montesquieu
Bewertung: 4.26%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Es ist jetzt möglich auch Bluesky Posts einzubinden:

https://bsky.app/profile/bsky.app/post/3kqipr2lq2t27

Code: Alles auswählen

https://bsky.app/profile/bsky.app/post/3kqipr2lq2t27
Für den Link zum Bluesky Post, auf die 3 Punkte unter dem Post klicken und "Link zum Beitrag kopieren" wählen.

Zudem habe ich das Einbinden von Mastodon und Bluesky in einem Skript zusammengefasst. Daher

Auf dem FTP liegen jetzt zwei zusätzliche Dateien:
/forum/clientscript/social-media-embed.js
/forum/clientscript/social-media-embed.css

Welche ich im "headerinclude" der Templates hinzugefügt habe.

Code: Alles auswählen

<script src="{vb:raw vboptions.bburl}/clientscript/social-media-embed.js"></script>
<link rel="stylesheet" href="{vb:raw vboptions.bburl}/social-media-embed.css" />
Twitter/X soll eigentlich auch in das Skript rein bzw. ist es schon, funktioniert aber aus mir nicht verständlichen Gründen einfach nicht. Deshalb habe ich da die alte twitter-embed.js Implementierung noch eingebaut gelassen. Dort habe ich nur die x.com Domain als erlaubte Hosts für Twitter-Posts mit aufgenommen.
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag (Insgesamt 2):
[B@W] Abominus, dooya
Bewertung: 4.26%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von [B@W] Abominus »

Benutzeravatar
[B@W] Abominus
Beiträge: 52603
Registriert: Di 16.09.2003, 12:00
Hat sich bedankt: 14081 Mal
Danksagung erhalten: 17566 Mal
SI-VerdienstkreuzGroßkreuz des Veteranenorden in bes. AusführungPour le Mérite+25

Danke Dir.
Folgende Benutzer bedankten sich beim Autor [B@W] Abominus für den Beitrag:
JoeMill
Bewertung: 2.13%
 
Stellaris Mods: Steam-Workshop
Crusader Kings II Mods: Steam-Workshop

Beitrag von JoeMill »

Benutzeravatar
JoeMill
Rang 14
Beiträge: 2255
Registriert: Sa 25.09.2004, 12:00
Hat sich bedankt: 650 Mal
Danksagung erhalten: 810 Mal
SI-VerdienstordenGroßkreuz des Veteranenorden in bes. Ausführung

Habe das Problem mit Twitter gefunden und behoben. Lag daran, dass das Twitter-Widget von Twitter selber mit x.com Tweet-URLs nicht klar kam und ich beim Zusammenfassen der verschiedenen Intergrationen in eine Datei, für die Tweet-URLs x.com als Hostnamen benutzt habe.

Damit werden jetzt sowohl Twitter, Mastodon als auch Bluesky durch die social-media-embed.js unterstützt. Für Threads von Meta habe ich leider noch keine Doku gefunden, wie man da ein Post einbinden könnte.

Außerdem habe ich noch einen Fehler mit den beiden Mobilen Styles behoben, da hat das neue Javascript dafür gesorgt, dass diese nur eine weiße Seite dargestellt wurde. Das lag daran, dass ich erstmals Bun (https://bun.sh/) als Bundler benutzt habe, bin dann zurück auf esbuild (https://esbuild.github.io/) gewechselt und damit war das Problem verschwunden.

Ich habe mal das kleine Projekt als GIT Bundle auf den Server hochgeladen: https://www.si-games.com/jomu/social-media-embed.bundle Das Ganze kann man mit folgendem GIT-Befehl importieren. Anweisungen zum Bauen und Benutzen finden sich in der README.md

Code: Alles auswählen

git clone -b main social-media-embed.bundle zielverzeichnis
Folgende Benutzer bedankten sich beim Autor JoeMill für den Beitrag (Insgesamt 4):
dooya, [B@W] Abominus, Montesquieu, Alith Anar
Bewertung: 8.51%
 
Wer lesen kann, ist klar im Vorteil.

Beitrag von Montesquieu »

Benutzeravatar
Montesquieu
Rang 20
Beiträge: 27610
Registriert: Fr 29.07.2005, 12:00
Hat sich bedankt: 18208 Mal
Danksagung erhalten: 15317 Mal
SI-VerdienstordenGroßkreuz des VeteranenordenRitterkreuz des Sankt Nikolaus-Ordens+22

Sehr schön! :top:

Vielen Dank!
Folgende Benutzer bedankten sich beim Autor Montesquieu für den Beitrag:
JoeMill
Bewertung: 2.13%
 
Der texanische Senator der Herzen
Antworten

Zurück zu „Reichstag“