Embed Discourse comments on another website via Javascript

Есть ли способ найти ID связанной темы или URL Discourse для заданной страницы с внедрением Discourse? Я хотел бы предоставить URL Discourse для нашего schema.org discussionUrl json-ld, который мы включаем в наши страницы с внедрёнными комментариями. Например,

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 лайков

Всем привет — я слежу за этой темой и пытаюсь понять, как работает функция «Импортированные темы будут скрыты из списка, пока не будет ответа».

По сути, я успешно встроил тему Discourse на веб-страницу, но хочу, чтобы встроенная страница показывала все сообщения в теме, а не только ответы на исходный пост.

Разве функция «Импортированные темы будут скрыты из списка, пока не будет ответа» не должна обеспечивать это? Я пробовал включать и отключать эту опцию, а также опцию «Обрезать сообщения», но не заметил никакой разницы в обоих случаях.

Подскажите, пожалуйста, что делать? Заранее спасибо.

_Чак

Обновление: я нашёл эту тему вместе с плагином для Discourse, написанным @arivanandan (спасибо!). Попробую внедрить его и обновлю информацию для будущих пользователей.

Обновление 2: Плагин работает! Огромное ещё раз спасибо @arivanandan!!

3 лайка

Привет!

Можно ли встроить краткую сводку статистики пользователя? Например:

СТАТИСТИКА

  • 240 дней посещений

  • 6 дней времени чтения

  • 4 дня недавнего времени чтения

  • 1,5 тыс. просмотренных тем

  • 9,1 тыс. прочитанных сообщений

  • 539 переданных

  • 34 закладки

  • 38 созданных тем

  • 1,2 тыс. созданных сообщений

  • 320 полученных

  • 61 решение

5 лайков

Это описывает наш текущий сценарий использования. Всё работает как ожидалось, когда пользователи вошли в систему на обоих сайтах.

Проблема, с которой я столкнулся, заключается в том, что если пользователь не вошёл в наш экземпляр Discourse (который не поддерживает анонимный доступ), то на странице, где размещён встроенный контент, ничего не отображается.

Возможно ли настроить встроенный контент так, чтобы в таком случае он отображал сообщение «Войдите в Discourse, чтобы увидеть обсуждение»?

6 лайков

У меня была похожая ситуация в одном случае, и мне помогло размещение обоих сайтов под одним провайдером идентификации с использованием DiscourseConnect — официальный единый вход для Discourse (sso).

5 лайков

Спасибо, но в данном случае это невозможно.

Однако текущее поведение кажется странным, потому что если возникают проблемы с входом, пользователь ничего не видит. Есть ли причина не показывать ссылку на вход, которая перенаправляла бы на сайт Discourse?

3 лайка

Я сталкиваюсь с той же проблемой. Было бы здорово видеть встроенные комментарии, даже если сайт установлен в приватный режим. В целом, мне очень нравится Discourse, и возможность добавлять комментарии в Ghost — это большой плюс!

3 лайка

Есть ли способ передавать уникальный id для div каждый раз при вызове скрипта? У меня есть асинхронная загрузка контента под основной статьёй, и я хотел бы, чтобы комментарии отображались и для этих элементов. Конечно, проблема текущей настройки в том, что все они показываются в div с id ‘discourse-comments’.

Спасибо. @eviltrout

2 лайка

Нет способа передать динамический ID. Однако я был бы рад принять pull request для реализации этой функции!

2 лайка

@eviltrout Э-э… ну, я теперь знаю, что такое PR, но как инициировать pull request?

1 лайк

Извините, не могли бы вы уточнить, что именно вы имеете в виду? Я не разработчик на Ruby, так что, к сожалению, этот код от меня не поступит. Я немного пробовал работать с ним, но не углубился.

Я бы даже заплатил за добавление такого функционала. Как вы думаете, стоит ли для этого написать в разделе Marketplace? Спасибо.

2 лайка

Да, маркетплейс — отличное место для старта, если у вас нет возможности добавить эту функцию самостоятельно.

1 лайк

Отличная функция, ребята.

Мы хотели бы использовать её скоро, но у нас на сайте более 30 000 блогов. Мы не хотим, чтобы все они появлялись в форуме без комментариев. Поскольку блоги вставляются как темы OnLoad, я wondered, есть ли способ вставлять их в форум после нажатия кнопки, например, в виджете, чтобы не все блоги загружались при посещении (например, через Google)?

Я думаю, что наша новая страница со списком тем будет завалена блогами (для наших администраторов, так как для обычных пользователей форума они изначально будут невидимы).

1 лайк

Такой функции нет. Возможность создавать их как скрытые была добавлена для решения именно этой задачи, но я понимаю, что даже этого может быть недостаточно на фоне 30 тысяч блогов.

Может, вы сможете написать скрипт для ручного импорта истории с сохранением оригинальных дат публикаций?

3 лайка

У меня ещё один вопрос. Мы уже используем это, но у нас есть статьи со ссылками с атрибутом nofollow. На форуме ссылки являются dofollow (атрибут nofollow отсутствует).

Можно ли это исправить? Или канонической ссылки достаточно, чтобы не следовать по ссылкам в статье темы?

1 лайк

Интересно, может ли атрибут data-атрибут “nosnippet” помочь? Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

Я не на 100% уверен, проигнорирует ли Google содержимое, помеченное nosnippet, или это просто указывает им не отображать его в превью SERP?

2 лайка

Как можно перенести фотографии с помощью этого метода?

1 лайк

Я написал несколько скриптов для миграции комментариев с Disqus в форум Discourse. В процессе я создал множество тем через API Discourse, вместо того чтобы позволить интеграции делать это автоматически. Для старых постов я использую метод встраивания по topicId, а для новых постов — метод discourseEmbedUrl.

Однако у меня возникла странная проблема: некоторые новые темы всё равно создаются. (Подозреваю, что это связано с ошибкой с моей стороны, когда у некоторых постов временно отсутствовали topicId, и именно они создавались как дубликаты.) Хотя прямо сейчас я не вижу решения для себя, я хотел бы предложить решение на будущее.

Поскольку контроллер встраивания пытается найти существующий пост по колонке базы данных embed_url, я предлагаю добавить свойство в API для установки этого поля при создании темы. Это позволит моему скрипту импорта устанавливать это свойство для темы. Тогда интеграции не придётся беспокоиться о переключении между полями topicId и discourseEmbedUrl в JavaScript.

2 лайка

Мне удалось отследить источник этой проблемы с плагином embed. При настройке встраивания существует параметр «Разрешённые хосты» (Allowed Hosts), который устанавливает CSP для iframe, и iframe отображается только на этом хосте. Например, если я настрою embed с разрешённым хостом example.com, а затем попытаюсь встроить JS на attacker.com, 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 для предпросмотра сборок, поэтому копия блога фактически обслуживается с URL netlify.app, которые затем загружают embed.js и создают темы форума для постов, которые я ранее импортировал с ошибками.

Это не обязательно проблема безопасности, так как создание тем всё равно возможно только для URL на настроенном сайте, соответствующих списку разрешённых путей. Однако это проблема в данной стратегии миграции, поскольку у меня не было возможности установить embed_url для тем форума при переносе старых постов в Discourse.

Решение заключается в добавлении правила CSP, чтобы запретить выполнение embed.js на доменах, не указанных в параметре «Разрешённые хосты».

В качестве доказательства концепции я скопировал код встраивания на совершенно чужеродный домен и установил discourseEmbedUrl на один из старых постов, которые я импортировал. После загрузки страницы iframe был заблокирован, но JS уже выполнился и создал тему форума.

Если вы считаете, что это больше проблема безопасности, чем баг, я с радостью удалю этот пост и сообщу о нём через HackerOne.

2 лайка