Discourse-Kommentare via Javascript auf einer anderen Website einbetten

Gibt es eine Möglichkeit, die zugehörige Themen-ID oder Discourse-URL für eine bestimmte Seite mit Discourse-Einbettung zu ermitteln? Ich möchte die Discourse-URL für unsere schema.org discussionUrl JSON-LD angeben, die wir auf unseren Seiten mit eingebetteten Kommentaren verwenden. Zum Beispiel:

https://www.comses.net/codebases/c9d55182-4444-4cc1-9a6f-dcf9c4ca942a/releases/1.0.1/

und

https://forum.comses.net/t/evolution-of-ecological-communities-testing-constraint-closure/8816

1 „Gefällt mir“

Ja, wir haben dafür einen dedizierten API-Endpunkt. Hier ist ein Beispiel:

curl 'https://meta.discourse.org/embed/info?embed_url=https://blog.discourse.org/2021/04/discourse-team-grows-to-50' -H 'API-KEY: logapikeygoeshere' -H 'API-USERNAME: apiusernamehere' 

Und die Antwort lautet:

{
  "topic_id": 187794,
  "post_id": 925017,
  "topic_slug": "discourse-team-grows-to-50-blog",
  "comment_count": 2
}

Gute Frage, ich habe sie zum ursprünglichen Beitrag (OP) hinzugefügt.

9 „Gefällt mir“

Hallo zusammen – ich habe mich mit diesem Thema beschäftigt und versuche herauszufinden, wie die Funktion „Importierte Themen werden bis zu einer Antwort als nicht gelistet markiert

3 „Gefällt mir“

Hallo!

Ist es möglich, eine Zusammenfassung der Benutzerstatistiken einzubetten, wie zum Beispiel:

STATISTIKEN

  • 240 Tage besucht

  • 6 Stunden Lesezeit

  • 4 Stunden Lesezeit in der jüngeren Vergangenheit

  • 1,5 Tsd. angesehene Themen

  • 9,1 Tsd. gelesene Beiträge

  • 539 gegeben

  • 34 Lesezeichen

  • 38 erstellte Themen

  • 1,2 Tsd. erstellte Beiträge

  • 320 erhalten

  • 61 Lösungen

5 „Gefällt mir“

Dies beschreibt unseren aktuellen Anwendungsfall. Alles funktioniert wie erwartet, wenn Benutzer bei beiden Seiten angemeldet sind.

Das Problem, das ich habe, ist, dass Benutzer, die nicht bei unserer Discourse-Instanz angemeldet sind (die keinen anonymen Zugriff erlaubt), auf der Seite, auf der das Embed eingefügt wurde, nichts sehen.

Ist es möglich, dass das Embed in diesem Fall eine Meldung mit dem Text „Bei Discourse anmelden, um die Diskussion zu sehen“ anzeigt?

6 „Gefällt mir“

Ich hatte einmal eine ähnliche Situation, und was bei mir half, war, beide Seiten unter demselben Identity Provider mit DiscourseConnect – Offizielles Single-Sign-On für Discourse (SSO) zu betreiben.

5 „Gefällt mir“

Danke, aber das ist in diesem Fall nicht möglich.

Das aktuelle Verhalten wirkt jedoch seltsam, denn wenn es Probleme mit den Anmeldungen gibt, sieht der Benutzer nichts. Gibt es einen Grund, keinen Anmelde-Link anzuzeigen, der zur Discourse-Website weiterleiten würde?

3 „Gefällt mir“

Ich habe das gleiche Problem. Es wäre schön, wenn die eingebetteten Kommentare auch dann angezeigt würden, wenn die Seite im privaten Modus eingestellt ist. Insgesamt liebe ich Discourse, und die Möglichkeit, Kommentare zu Ghost hinzuzufügen, ist ein Pluspunkt!

3 „Gefällt mir“

Gibt es eine Möglichkeit, bei jedem Aufruf des Skripts eine eindeutige Div-ID zu übergeben? Ich habe asynchrones Laden von Inhalten unter meinem Hauptartikel und möchte, dass die Kommentare auch bei diesen Elementen angezeigt werden. Das Problem bei der aktuellen Einrichtung ist natürlich, dass alle im ‘discourse-comments’ Div angezeigt werden.

Danke. @eviltrout

2 „Gefällt mir“

Es gibt keine Möglichkeit, eine dynamische ID zu übergeben. Ich würde jedoch gerne einen PR dafür annehmen!

2 „Gefällt mir“

@eviltrout Äh… nun, ich weiß zwar, was ein PR ist (jetzt), aber wie startet man eine Pull Request?

1 „Gefällt mir“

Entschuldigung, könntest du bitte genauer erklären, was du damit meinst? Ich bin kein Ruby-Entwickler, daher wird dieser Code leider nicht von mir stammen. Ich habe mich einmal damit beschäftigt, bin aber nicht weit gekommen.

Ich würde tatsächlich für diese Funktionalität bezahlen. Glaubst du, es wäre der richtige Weg, dies im Marketplace zu posten? Danke.

2 „Gefällt mir“

Ja, der Marktplatz ist ein großartiger Ort, um zu beginnen, wenn Sie die Funktion nicht selbst hinzufügen können.

1 „Gefällt mir“

Tolle Funktion, Leute.

Wir möchten sie gerne bald nutzen, aber wir haben mehr als 30.000 Blogs auf unserer Website. Wir wollen nicht, dass alle davon ohne Kommentare im Forum erscheinen. Da die Blogs als Themen OnLoad eingefügt werden, habe ich mich gefragt, ob es eine Möglichkeit gibt, sie erst nach einem Klick auf einen Button im Embed einzufügen, damit nicht alle Blogs beim Besuch (z. B. über Google) sofort eingefügt werden?

Ich denke, unsere neue Übersichtsseite für Themen wird mit Blogs überflutet sein (für unsere Admins, da sie für normale Forum-Nutzer zunächst unsichtbar sind).

1 „Gefällt mir“

Es gibt keine solche Funktion. Die Möglichkeit, diese als nicht gelistet zu erstellen, wurde hinzugefügt, um genau diesen Anwendungsfall zu adressieren, aber ich kann verstehen, dass dies angesichts von 30.000 Blogs vielleicht doch zu wenig ist.

Vielleicht könntest du ein Skript schreiben, um die Historie manuell mit den ursprünglichen Veröffentlichungsdaten zu importieren?

3 „Gefällt mir“

Ich habe noch eine Frage. Wir nutzen es derzeit, haben aber Artikel mit Links, die das nofollow-Attribut tragen. Im Forum sind die Links dofollow (nofollow ist entfernt).

Ist das etwas, das wir beheben können? Oder reicht das canonical-Attribut aus, um zu verhindern, dass die Links im Themenartikel verfolgt werden?

1 „Gefällt mir“

Ich frage mich, ob das Daten-Attribut „nosnippet" vielleicht helfen könnte? Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

Ich bin mir nicht zu 100 % sicher, ob Google den mit nosnippet markierten Inhalt ignoriert oder ob es ihnen nur mitteilt, diesen nicht in der Vorschau in den Suchergebnissen (SERP) anzuzeigen.

2 „Gefällt mir“

Wie können Sie Bilder mit dieser Methode übertragen?

1 „Gefällt mir“

Ich habe einige Skripte geschrieben, um unsere Blog-Kommentare von Disqus in das Discourse-Forum zu migrieren. Dabei habe ich eine Reihe von Themen über die Discourse-API erstellt, anstatt die Integration dies erledigen zu lassen. Für die alten Beiträge verwende ich die Einbettungsmethode topicId, während neue Beiträge ab sofort die Methode discourseEmbedUrl nutzen.

Allerdings habe ich ein seltsames Problem, bei dem dennoch einige neue Themen erstellt werden. (Ich vermute, dass dies auf einen Fehler meinerseits zurückzuführen ist, da ich kurzzeitig einige topicIds in bestimmten Beiträgen fehlen hatte und genau diese als Duplikate erstellt wurden.) Obwohl ich derzeit keine Lösung dafür sehe, möchte ich eine Lösung für die Zukunft vorschlagen.

Da der Einbettungscontroller versucht, einen bestehenden Beitrag über die Datenbankspalte embed_url zu finden, würde ich gerne eine API-Eigenschaft vorschlagen, mit der dieses Feld beim Erstellen eines Themas festgelegt werden kann. Dies würde meinem Import-Skript ermöglichen, diese Eigenschaft für das Thema zu setzen. Anschließend müsste sich die Integration nicht mehr darum kümmern, im JavaScript zwischen den Feldern topicId und discourseEmbedUrl zu wechseln.

2 „Gefällt mir“

Ich habe die Ursache dieses Problems mit dem Embed-Plugin gefunden. Bei der Konfiguration des Embeddings gibt es eine Einstellung „Zulässige Hosts", die daraufhin die CSP für das iframe festlegt, sodass das iframe nur auf diesem Host angezeigt wird. Wenn ich beispielsweise Embeds mit einem zulässigen Host von example.com konfiguriere und versuche, das JS auf attacker.com einzubetten, wird das iframe mit der folgenden Fehlermeldung abgelehnt:

„Das Einbetten von ‘https://forum.example.com/’ wurde verweigert, da ein Vorfahr die folgende Content-Security-Policy-Anweisung verletzt: „frame-ancestors ‘self’ https://example.com"."

In diesem Fall wurde das JS jedoch bereits ausgeführt und hat ein Thema im Forum mit der URL erstellt, die dem Embed-Code übergeben wurde.

In meinem Fall nutzen wir Netlify zur Vorschau von Builds, sodass eine Kopie des Blogs tatsächlich von netlify.app-URLs bereitgestellt wird. Diese lädt dann die embed.js und erstellt die Foren-Threads für die Beiträge, die ich zuvor fehlerhaft importiert hatte.

Dies ist nicht unbedingt ein Sicherheitsproblem, da weiterhin nur Themen für URLs erstellt werden können, die auf der konfigurierten Website liegen und mit der Pfad-Whitelist übereinstimmen. Es ist jedoch ein Problem bei dieser Migrationsstrategie, da ich beim Migrieren alter Beiträge in Discourse keine Möglichkeit hatte, die embed_url für die Foren-Themen festzulegen.

Die Lösung besteht darin, eine CSP-Regel hinzuzufügen, um zu verhindern, dass embed.js auf Domains ausgeführt wird, die nicht unter der Einstellung „Zulässige Hosts" konfiguriert sind.

Als Proof of Concept habe ich den Embed-Code auf eine völlig unrelated Domain kopiert und die discourseEmbedUrl auf einen der von mir importierten alten Beiträge gesetzt. Beim Laden der Seite wurde das iframe blockiert, aber das JS war bereits ausgeführt worden und hatte den Foren-Thread erstellt.

Wenn Sie dies eher als Sicherheitsproblem denn als Fehler betrachten, bin ich gerne bereit, diesen Beitrag zu löschen und ihn stattdessen über HackerOne zu melden.

2 „Gefällt mir“