Intégrer les commentaires Discourse sur un autre site web via Javascript

Existe-t-il un moyen de trouver l’ID du sujet associé ou l’URL Discourse pour une page donnée avec intégration Discourse ? J’aimerais fournir l’URL Discourse pour notre schema.org discussionUrl en JSON-LD que nous incluons dans nos pages comportant des commentaires intégrés. Par exemple,

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

et

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

1 « J'aime »

Oui, nous disposons d’un point de terminaison API dédié à cet effet. Voici un exemple :

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' 

Et la réponse est :

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

Bonne question, je l’ai ajoutée au message original.

9 « J'aime »

Salut à tous, je suis ce sujet et j’essaie de comprendre comment fonctionne la fonction « Les sujets importés restent non répertoriés tant qu’il n’y a pas de réponse ».

En gros, j’ai intégré avec succès un sujet Discourse sur une page web, mais je souhaite que la page intégrée affiche tous les messages du sujet, et pas seulement les réponses au message initial.

La fonction « Les sujets importés restent non répertoriés tant qu’il n’y a pas de réponse » ne devrait-elle pas permettre cela ? J’ai essayé d’activer/désactiver cette option ainsi que l’option « tronquer les messages », sans remarquer de différence dans les deux cas.

Des pistes ? Merci d’avance.

_Chuck

Mise à jour : J’ai trouvé ce sujet ainsi qu’un plugin Discourse écrit par @arivanandan (merci !). Je vais tenter de l’implémenter et publier une mise à jour pour la postérité.

Mise à jour 2 : Le plugin fonctionne ! Un grand merci encore à @arivanandan !!

3 « J'aime »

Bonjour !

Est-il possible d’intégrer un résumé des statistiques d’un utilisateur, par exemple :

STATISTIQUES

  • 240 jours de visite

  • 6 jours de temps de lecture

  • 4 jours de temps de lecture récent

  • 1,5k de sujets consultés

  • 9,1k de messages lus

  • 539 donnés

  • 34 signets

  • 38 sujets créés

  • 1,2k de messages créés

  • 320 reçus

  • 61 solutions

5 « J'aime »

Cela décrit notre cas d’utilisation actuel. Tout fonctionne comme prévu lorsque les utilisateurs sont connectés aux deux sites.

Le problème que je rencontre est que, si l’utilisateur n’est pas connecté à notre instance Discourse (qui n’autorise pas l’accès anonyme), il ne voit rien sur la page où l’intégration a été placée.

Est-il possible de faire en sorte que l’intégration affiche un message « Connectez-vous à Discourse pour voir la discussion » dans ce cas ?

6 « J'aime »

J’ai déjà été confronté à une situation similaire, et ce qui m’a aidé, c’est d’avoir les deux sites sous le même fournisseur d’identité en utilisant DiscourseConnect - SSO officiel pour Discourse.

5 « J'aime »

Merci, mais ce n’est pas possible dans ce cas.

Le comportement actuel semble étrange, car si un problème survient avec les connexions, l’utilisateur ne voit rien. Y a-t-il une raison de ne pas afficher un lien de connexion qui redirigerait vers le site Discourse ?

3 « J'aime »

Je rencontre le même problème. Ce serait bien de pouvoir voir les commentaires intégrés même si le site est en mode privé. Dans l’ensemble, j’adore Discourse, et la possibilité d’ajouter les commentaires à Ghost est un plus !

3 « J'aime »

Existe-t-il un moyen de passer un identifiant unique de div à chaque fois que le script est appelé ? Je charge du contenu de manière asynchrone sous mon article principal et j’aimerais que les commentaires s’affichent également sur ces éléments. Bien sûr, le problème avec la configuration actuelle est qu’ils s’affichent tous dans l’identifiant de div ‘discourse-comments’.

Merci. @eviltrout

2 « J'aime »

Il n’est pas possible de transmettre un identifiant dynamique. Cependant, j’accepterais une demande de fusion pour le faire !

2 « J'aime »

@eviltrout Euh… eh bien, je sais maintenant ce qu’est une PR, mais comment initie-t-on une pull request ?

1 « J'aime »

Désolé, peux-tu être plus clair sur ce que tu veux dire par là ? Je ne suis pas développeur Ruby, donc malheureusement, ce code ne viendra pas de moi. J’ai un peu joué avec une fois, mais je n’ai pas été très loin.

Je paierais même volontiers pour que cette fonctionnalité soit ajoutée. Penses-tu que poster sur le marketplace serait la bonne approche pour cela ? Merci.

2 « J'aime »

Oui, la place de marché est un excellent endroit pour commencer si vous n’avez pas la possibilité d’ajouter la fonctionnalité vous-même.

1 « J'aime »

Super fonction, les gars.

Nous aimerions l’utiliser rapidement, mais nous avons plus de 30 000 blogs sur notre site web. Nous ne voulons pas qu’ils soient tous dans le forum sans commentaires. Comme les blogs sont insérés sous forme de sujets OnLoad, je me demandais s’il existait un moyen de les insérer dans le forum après un clic sur un bouton dans l’intégration, par exemple, afin que tous les blogs ne soient pas insérés lors de la visite (via Google, par exemple) ?

Je pense que notre nouvelle page de vue d’ensemble des sujets sera inondée de blogs (pour nos administrateurs, car ils commenceront invisibles pour les utilisateurs normaux du forum).

1 « J'aime »

Il n’existe pas une telle fonctionnalité. La possibilité de les créer en mode non répertorié a été ajoutée pour répondre à ce cas d’usage spécifique, mais je comprends que cela puisse même s’avérer insuffisant face à 30 000 blogs.

Peut-être pourriez-vous écrire un script pour importer manuellement l’historique en conservant les dates de publication originales ?

3 « J'aime »

J’ai une autre question. Nous l’utilisons actuellement, mais nous avons des articles contenant des liens en nofollow. Sur le forum, les liens sont en dofollow (le nofollow a disparu).

Est-ce quelque chose que nous pouvons corriger ? Ou la balise canonical suffit-elle pour éviter de suivre les liens dans l’article du sujet ?

1 « J'aime »

Je me demande si l’attribut de données « nosnippet » pourrait aider ? Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

Je ne suis pas sûr à 100 % que Google ignore le contenu marqué par nosnippet, ou s’il lui suffit de lui indiquer de ne pas l’afficher dans l’aperçu des résultats de recherche (SERP).

2 « J'aime »

Comment pouvez-vous transférer des photos en utilisant cette méthode ?

1 « J'aime »

J’ai écrit quelques scripts pour migrer les commentaires de notre blog depuis Disqus vers le forum Discourse. Ce faisant, j’ai créé un certain nombre de sujets en utilisant l’API Discourse plutôt que de laisser cette intégration les générer. Pour les anciens articles, j’utilise la méthode d’intégration topicId, tandis que les nouveaux articles utiliseront désormais la méthode discourseEmbedUrl.

Cependant, je rencontre un problème étrange : certains nouveaux sujets sont créés de toute façon. (Je soupçonne un bug de mon côté, dû au fait que j’ai brièvement laissé certains topicId manquants sur certains articles, et ce sont ceux-ci qui sont créés en double.) Bien que je ne pense pas qu’il y ait de solution pour moi à l’heure actuelle, je souhaiterais proposer une solution pour le futur.

Puisque le contrôleur d’intégration tente de rechercher un article existant via la colonne de base de données embed_url, je souhaiterais voir une propriété API permettant de définir ce champ lors de la création d’un sujet. Cela permettrait à mon script d’importation de définir cette propriété pour le sujet. Ainsi, l’intégration n’aurait même plus besoin de se soucier de basculer entre les champs topicId et discourseEmbedUrl dans le JavaScript.

2 « J'aime »

J’ai justement identifié la source de ce problème avec le plugin d’intégration (embed). Lors de la configuration de l’intégration, il existe un paramètre « Hosts autorisés » qui définit ensuite la CSP pour l’iframe ; cette dernière ne s’affiche alors que sur l’hôte spécifié. Par exemple, si je configure les intégrations avec un hôte autorisé example.com et que j’essaie d’intégrer le JS sur attacker.com, l’iframe refuse de se charger avec l’erreur suivante :

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

Cependant, à ce stade, le JS a déjà été exécuté et a créé un sujet sur le forum avec l’URL fournie au code d’intégration.

Dans mon cas, ce qui se produit, c’est que nous utilisons Netlify pour prévisualiser les builds, si bien qu’une copie du blog est effectivement servie depuis des URL netlify.app. Celles-ci chargent alors ce embed.js et créent le fil de discussion du forum pour les articles que j’avais précédemment importés de manière incorrecte.

Il ne s’agit pas nécessairement d’un problème de sécurité, car cela ne permet toujours de créer des sujets que pour des URL du site configuré et correspondant à la liste blanche des chemins. C’est toutefois un problème dans le cadre de cette stratégie de migration, car je n’avais aucun moyen de définir l’attribut embed_url sur les fils de discussion du forum lors de l’importation d’anciens articles vers Discourse.

La solution consiste à ajouter une règle CSP pour empêcher l’exécution de ce embed.js sur des domaines qui ne sont pas configurés dans le paramètre « hosts autorisés ».

À titre de preuve de concept, j’ai copié le code d’intégration sur un domaine totalement sans rapport et j’ai défini discourseEmbedUrl sur l’un des anciens articles que j’avais importés. J’ai chargé la page : l’iframe a été bloquée, mais le JS avait déjà été exécuté et avait créé le fil de discussion du forum.

Si vous estimez qu’il s’agit davantage d’un problème de sécurité que d’un bug, je suis prêt à supprimer ce message et à le signaler via HackerOne à la place.

2 « J'aime »