Javascript経由で別のウェブサイトにDiscourseコメントを埋め込む

ディスコース埋め込みが行われている特定のページに関連するトピックIDまたはディスコースURLを取得する方法はありますか?埋め込まれたコメントを含むページに含める schema.org の discussionUrl JSON-LD に対して、ディスコースURLを提供したいと考えています。例えば、

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

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

です。

「いいね!」 1

はい、そのための専用 API エンドポイントをご用意しています。以下に例を示します。

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' 

レスポンスは以下の通りです。

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

ご質問ありがとうございます。これを OP に追加しました。

「いいね!」 9

みなさんこんにちは。このトピックをフォローし、「インポートされたトピックは返信があるまで非公開リストに追加される」という機能がどのように動作するかを理解しようと試みています。

基本的には、Discourse のトピックを Web ページに埋め込むことに成功しました。ただし、埋め込まれたページには元の投稿だけでなく、トピック内のすべての投稿を表示させたいと考えています。

「インポートされたトピックは返信があるまで非公開リストに追加される」という設定でこれが実現できるはずではありませんか?この設定を有効/無効にし、「投稿を切り詰め」オプションも試してみましたが、どちらの場合も違いがわかりません。

何かヒントはありますか?あらかじめありがとうございます。

_Chuck

追記:このトピック と、@arivanandan 氏によって作成された Discourse プラグイン を見つけました(ありがとうございます!)。実装を試みて、将来の参考のために更新を投稿します。

追記 2:プラグインが動作しました!@arivanandan 氏に改めて大感謝です!!

「いいね!」 3

こんにちは!

ユーザーの統計情報の要約を埋め込むことは可能でしょうか?例えば:

統計情報

  • 訪問日数:240 日
  • 読了時間:6 日
  • 最近の読了時間:4 日
  • 閲覧トピック数:1.5k
  • 読了投稿数:9.1k
  • 付与数:539
  • ブックマーク数:34
  • 作成トピック数:38
  • 作成投稿数:1.2k
  • 受け取り数:320
  • 解決数:61
「いいね!」 5

これは現在の当社のユースケースを説明しています。ユーザーが両方のサイトにログインしている場合は、すべてが期待通りに動作します。

問題は、当社の Discourse インスタンス(匿名アクセスは許可されていない)にログインしていないユーザーの場合、埋め込みが配置されたページに何も表示されないことです。

この場合、埋め込み部分に「議論を見るには Discourse にログインしてください」というメッセージを表示することは可能でしょうか?

「いいね!」 6

私も同様の状況に直面したことがあり、解決策として両方のサイトを同一のアイデンティティプロバイダーの下に配置し、DiscourseConnect - Discourse の公式シングルサインオン (sso) を使用しました。

「いいね!」 5

ありがとうございます。ただし、この場合はそれが不可能です。

現在の挙動は少し不自然に思えます。ログインに問題がある場合、ユーザーには何も表示されないからです。Discourse サイトにリダイレクトするログインリンクを表示しない理由はあるのでしょうか?

「いいね!」 3

私も同じ問題に直面しています。サイトがプライベートモードに設定されていても、埋め込みコメントが表示されると嬉しいですね。全体的に、Discourse がとても気に入っています。Ghost にコメントを追加できる機能も素晴らしいです!

「いいね!」 3

スクリプトを呼び出すたびに、一意の div ID を渡す方法はありますか?メイン記事の下に非同期でコンテンツをロードしており、そのアイテムにもコメントを表示したいと考えています。現在の設定の問題点は、すべてが ‘discourse-comments’ という div ID に表示されてしまうことです。

ありがとうございます。@eviltrout

「いいね!」 2

動的な ID を渡す方法は現在ありません。ただし、その機能を実装するプルリクエスト(PR)は歓迎します!

「いいね!」 2

@eviltrout ええと、PR(プルリクエスト)が何かは(今では)わかりますが、どうやってプルリクエストを開始するのですか?

「いいね!」 1

すみませんが、その発言の意味をもう少し詳しく教えていただけますか?私は Ruby 開発者ではないので、残念ながらそのコードを提供することはできません。以前少し触れたことはありますが、そこまで進めませんでした。

実際、この機能の実装にお金を支払ってもいいと考えています。それについてはマーケットプレイスに投稿するのが良い方法だと思いますか?よろしくお願いいたします。

「いいね!」 2

はい、ご自身でその機能を追加できない場合は、マーケットプレイスが始めるのに最適な場所です。

「いいね!」 1

素晴らしい機能ですね。

すぐに利用したいと考えているのですが、当サイトには3万を超えるブログ記事があります。すべてをコメントなしでフォーラムに追加したくありません。ブログ記事は OnLoad でトピックとして挿入されるようですが、例えば埋め込み内のボタンクリック後にフォーラムに挿入するといった方法は可能でしょうか?そうすれば、Google などの検索経由で訪問された際に、すべてのブログが即座に挿入されるのを防げるはずです。

新しいトピック一覧ページがブログ記事で溢れてしまうのではないかと懸念しています(通常の利用者には最初は非表示になりますが、管理者にとっては問題になるでしょう)。

「いいね!」 1

そのような機能はありません。非公開リストとして作成する機能が、この特定のユースケースに対応するために追加されましたが、3万件ものブログを前にしても、それだけでは不十分だとお考えになるのも理解できます。

もしかすると、スクリプトを書いて、元の投稿日付を保持しつつ履歴を手動でインポートすることはできるかもしれません。

「いいね!」 3

もう一つ質問があります。現在使用していますが、nofollow のリンクを含む記事があります。フォーラムではリンクは dofollow になっています(nofollow は消えています)。

これは修正可能ですか?それとも、トピック記事内のリンクを追跡しないために、canonical だけで十分でしょうか?

「いいね!」 1

data-属性の「nosnippet」が役立つかもしれませんか?

Googleがnosnippetでマークされたコンテンツを完全に無視するのか、それともSERPのプレビューに表示しないように指示するだけなのか、100%確信が持てません。

「いいね!」 2

この方法で写真を転送するにはどうすればよいですか?

「いいね!」 1

Disqus から Discourse フォーラムへブログのコメントを移行するためのスクリプトを作成しました。その際、統合機能に作成を任せるのではなく、Discourse API を使って多数のトピックを直接作成しました。過去の投稿については topicId 埋め込み方式を、今後の新規投稿については discourseEmbedUrl 方式を使用しています。

しかし、なぜか新しいトピックが作成されてしまうという奇妙な問題が発生しています(私の側のバグで、一部の投稿から topicId が一時的に欠落していたことが原因ではないかと推測しています。その欠落したものが重複トピックとして作成されているようです)。現時点では私自身に解決策はないと思いますが、今後のための解決案を提案させてください。

埋め込みコントローラーは データベースの embed_url カラムから既存の投稿を検索しようとする ため、トピックを作成する際 にそのフィールドを設定できる API プロパティの追加を提案します。これにより、インポートスクリプトがトピックに対してこのプロパティを設定できるようになります。そうすれば、統合側で JS 内の topicIddiscourseEmbedUrl フィールドの切り替えを気にする必要がなくなります。

「いいね!」 2

この問題の根源が埋め込みプラグインにあることを突き止めました。埋め込みを設定する際、「許可されたホスト」という設定があり、これが iframe の CSP(コンテンツセキュリティポリシー)を設定します。その結果、iframe はそのホストでのみ表示されます。例えば、example.com を許可されたホストとして設定し、attacker.com で JS を埋め込もうとすると、iframe は以下のエラーで読み込みを拒否されます。

Refused to frame 'https://forum.example.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://example.com".

ただし、この時点で JS はすでに実行されており、埋め込みコードに指定された URL を使ってフォーラムにトピックが作成されてしまいます。

私の場合、Netlify を使ってビルドのプレビューを行っているため、ブログのコピーが実際には netlify.app の URL から提供されています。これが embed.js を読み込み、以前に誤ってインポートした投稿のフォーラムスレッドを作成してしまっていたのです。

これは必ずしもセキュリティ上の問題ではありません。設定されたウェブサイト内の URL かつパスの許可リストに一致するトピックしか作成できないからです。しかし、Discourse への古い投稿の移行時に、フォーラムスレッドに対して embed_url を設定する方法がなかったため、この移行戦略においては問題となります。

対策としては、「許可されたホスト」設定で指定されていないドメインで embed.js が実行されないようにする CSP ルールを追加することです。

概念実証として、埋め込みコードを全く関係のないドメインにコピーし、discourseEmbedUrl を以前インポートした投稿のいずれかに設定しました。ページを読み込むと iframe はブロックされましたが、JS はすでに実行され、フォーラムスレッドが作成されていました。

これがバグというよりもセキュリティ上の問題だとお考えであれば、この投稿を削除し、HackerOne を通じて報告することを喜んで行います。

「いいね!」 2