Embed Discourse comments on another website via Javascript

Discourse 임베딩을 통해 특정 페이지와 연결된 토픽 ID나 Discourse URL을 찾는 방법이 있을까요? 임베딩된 댓글이 포함된 페이지에 포함하는 schema.org discussionUrl JSON-LD에 Discourse URL을 제공하려고 합니다. 예를 들어,

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

그리고

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

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
}

좋은 질문이네요. 원문에 추가해 두었습니다.

9개의 좋아요

여러분 안녕하세요 - 이 주제를 계속 지켜보고 있었고, “Imported topics will be unlisted until there is a reply.”(답글이 있을 때까지 가져온 주제는 목록에 표시되지 않음) 기능이 어떻게 작동하는지 파악해 보고 있습니다.

결국 웹페이지에 디스코urs 주제를 성공적으로 임베드했지만, 원본 게시물에 대한 답글뿐만 아니라 주제 내의 모든 게시물을 임베드된 페이지에 표시하고 싶습니다.

“Imported topics will be unlisted until there is a reply.” 기능이 이 역할을 해줘야 하지 않나요? 이 기능을 활성화/비활성화해 보고 “truncate posts” 옵션도 시도해 봤지만, 둘 다 차이가 없는 것 같습니다.

– 조언 주실 수 있을까요? 미리 감사드립니다.

_차크

업데이트: @arivanandan 님이 작성하신 디스코urs 플러그인과 함께 이 주제를 찾았습니다(감사합니다!) – 구현을 시도해 보고 후속 업데이트를 올릴 예정입니다.

업데이트 2: 플러그인이 작동합니다! @arivanandan 님께 다시 한번 큰 감사드립니다!!

3개의 좋아요

안녕하세요!

사용자 통계 요약을 임베드할 수 있을까요? 예를 들어 다음과 같은 형태입니다:

통계

  • 240일 방문

  • 6일 읽기 시간

  • 최근 4일 읽기 시간

  • 1.5k 토픽 조회

  • 9.1k 게시물 읽음

  • 539개 부여

  • 34개 북마크

  • 38개 토픽 생성

  • 1.2k 게시물 생성

  • 320개 수락

  • 61개 해결

5개의 좋아요

이것은 우리의 현재 사용 사례를 설명합니다. 사용자가 두 사이트 모두에 로그인된 경우 모든 것이 예상대로 작동합니다.

제가 겪는 문제는 사용자가 우리의 Discourse 인스턴스(익명 액세스가 없는)에 로그인하지 않은 경우, 임베드가 배치된 페이지에서 아무것도 볼 수 없다는 점입니다.

이러한 상황이 발생했을 때 임베드가 "토론을 보려면 Discourse에 로그인하세요"라는 메시지를 표시하도록 하는 것이 가능한가요?

6개의 좋아요

저도 비슷한 상황을 겪은 적이 있었는데, DiscourseConnect - Official Single-Sign-On for Discourse (sso)을 사용하여 두 사이트를 동일한 Identity Provider 아래에 두는 것이 해결책이었습니다.

5개의 좋아요

감사합니다. 하지만 이 경우에는 불가능합니다.

다만 현재 동작 방식이 다소 이상해 보입니다. 로그인에 문제가 발생하면 사용자에게 아무것도 표시되지 않기 때문입니다. discourse 사이트로 리다이렉트되는 로그인 링크를 표시하지 않는 이유가 있을까요?

4개의 좋아요

저도 같은 문제를 겪고 있습니다. 사이트가 비공개 모드로 설정되어 있더라도 내장된 댓글을 볼 수 있으면 좋겠습니다. 전반적으로 Discourse를 매우 마음에 들어 하고 있으며, Ghost에 댓글을 추가할 수 있다는 점은 큰 장점입니다!

3개의 좋아요

스크립트가 호출될 때마다 고유한 div id를 전달하는 방법이 있을까요? 메인 기사 아래에 비동기 방식으로 콘텐츠를 로드하고 있으며, 해당 항목에도 댓글이 표시되기를 원합니다. 물론 현재 설정의 문제는 모든 댓글이 ‘discourse-comments’ div id에 표시된다는 점입니다.

감사합니다. @eviltrout

2개의 좋아요

동적 ID를 전달할 방법이 없습니다. 하지만 이를 구현하는 PR은 환영합니다!

2개의 좋아요

@eviltrout 음… PR이 뭔지는 이제 알지만, pull request를 어떻게 시작하나요?

1개의 좋아요

죄송하지만 말씀하신 내용을 좀 더 명확히 설명해 주시겠어요? 저는 Ruby 개발자가 아니라서 해당 코드를 제가 작성하기는 어려울 것 같습니다. 한 번쯤 손을 대어 보았지만,そこまで 진도를 나가진 못했습니다.

사실 이 기능이 추가되려면 돈을 지불할 의향이 있습니다. 마켓플레이스에 게시하는 것이 그 방법을 위한 올바른 접근 방식이라고 생각하시나요? 감사합니다.

2개의 좋아요

네, 해당 기능을 직접 추가할 수 없다면 마켓플레이스는 시작하기에 좋은 곳입니다.

1개의 좋아요

정말 멋진 기능입니다.

조만간 이 기능을 사용해보고 싶은데, 저희 웹사이트에는 30,000개 이상의 블로그가 있습니다. 댓글이 없는 모든 블로그가 포럼에 표시되길 원하지 않습니다. 블로그가 OnLoad 시점에 토픽으로 삽입되기 때문에, 방문할 때(예: 구글을 통해) 모든 블로그가 삽입되지 않도록, 임베드에서 버튼을 클릭한 후에야 포럼에 삽입되도록 할 수 있는 방법이 있는지 궁금합니다.

새로운 토픽 개요 페이지가 블로그로 넘쳐날 것 같습니다 (일반적인 정식 사용자에게는 처음부터 비공개로 시작하므로 관리자 입장에서 특히 그렇습니다).

1개의 좋아요

그런 기능은 없습니다. 특정 사용 사례를 해결하기 위해 비공개로 생성할 수 있는 기능이 추가되었지만, 3만 개나 되는 블로그를 고려할 때 그것조차 부족할 수 있다는 점은 이해할 수 있습니다.

원래 게시 날짜를 포함하여 히스토리를 수동으로 가져오는 스크립트를 작성해 볼 수 있을까요?

3개의 좋아요

또 다른 질문이 있습니다. 현재 이 기능을 사용 중인데, nofollow 링크가 포함된 게시물이 있습니다. 포럼에서는 링크가 dofollow로 설정되어 있습니다(nofollow가 제거되었습니다).

이것을 수정할 수 있을까요? 아니면 canonical 태그만으로도 주제 게시물의 링크를 따라가지 않도록 처리할 수 있을까요?

1개의 좋아요

data-attribute "nosnippet"가 도움이 될지 궁금합니다. Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

Google이 nosnippet으로 표시된 내용을 완전히 무시하는지, 아니면 SERP 미리보기에 표시하지 말라고 지시하는 것인지는 100% 확신할 수 없습니다.

2개의 좋아요

이 방법으로 사진을 전송하는 방법은 무엇인가요?

1개의 좋아요

Disqus의 블로그 댓글을 Discourse 포럼으로 마이그레이션하기 위해 몇 가지 스크립트를 작성했습니다. 이 과정에서 Discourse API를 사용해 주제를 직접 생성했으며, 이 통합 플러그인이 생성하도록 두지 않았습니다. 기존 게시물에는 topicId 임베딩 방식을 사용하고 있으며, 앞으로의 새 게시물에는 discourseEmbedUrl 방식을 사용하고 있습니다.

하지만 일부 새 주제가 여전히 생성되는 이상한 문제가 발생하고 있습니다. (일부 게시물에서 topicId가 잠시 누락되었을 때 제 코드에 버그가 있었기 때문으로 추정되며, 해당 게시물들이 중복으로 생성되고 있는 것으로 보입니다.) 현재 제가 해결할 방법은 없다고 생각하지만, 향후를 위한 해결책을 제안하고자 합니다.

임베드 컨트롤러가 기존 게시물을 embed_url 데이터베이스 컬럼으로 조회하려고 시도하고 있으므로, 주제를 생성할 때 해당 필드를 설정할 수 있는 API 속성을 추가해 주었으면 합니다. 이렇게 하면 제 임포트 스크립트가 해당 주제의 이 속성을 설정할 수 있게 됩니다. 그러면 이 통합 플러그인은 JS에서 topicId와 discourseEmbedUrl 필드 간 전환을 걱정할 필요가 전혀 없게 될 것입니다.

2개의 좋아요

임베드 플러그인 관련 문제의 원인을 찾았습니다. 임베드를 설정할 때 “허용된 호스트”(Allowed Hosts) 설정이 있으며, 이 설정은 iframe의 CSP(Content Security Policy)를 설정합니다. 따라서 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 중 경로 허용 목록(path allowlist)과 일치하는 URL에 대해서만 토픽을 생성할 수 있기 때문입니다. 하지만 이전 게시물을 Discourse로 이관하는 과정에서 포럼 스레드에 embed_url을 설정할 방법이 없었기 때문에, 이 마이그레이션 전략에서는 문제가 됩니다.

해결 방법은 “허용된 호스트” 설정에 포함되지 않은 도메인에서 embed.js가 실행되는 것을 방지하기 위해 CSP 규칙을 추가하는 것입니다.

개념 증명(Proof of Concept)으로, 임베드 코드를 완전히 무관한 도메인에 복사하고 discourseEmbedUrl을 이전에 가져온 오래된 게시물 중 하나로 설정했습니다. 페이지를 로드했을 때 iframe은 차단되었지만, JS는 이미 실행되어 포럼 스레드를 생성해 버렸습니다.

이것이 버그보다는 보안 문제로 판단된다면, 이 게시물을 삭제하고 대신 HackerOne을 통해 보고하는 것을 기꺼이 수행하겠습니다.

2개의 좋아요