Incorpora i commenti Discourse su un altro sito web tramite Javascript

Le centinaia di volte che sono stato su quella pagina CSS, e non ho mai notato il CSS per gli embedding…

1 Mi Piace

Se qualcuno ha difficoltà a trovare l’aspetto della pagina di incorporamento, ecco come appare:

Ho provato a implementarlo oggi ma ho alcuni problemi:

  • Nel post del forum, l’URL derivato (da discourseEmbedUrl?) viene convertito in minuscolo, rompendo gli URL sensibili alle maiuscole nel link che segue il testo “Questo è un argomento di discussione complementare per la voce originale su…”
  • Al primo caricamento della pagina, l’embed dice “Caricamento discussione…” e si blocca. Al secondo caricamento della pagina tutto funziona.
  • Paginazione: quando l’iframe si sta caricando, avrà un’altezza predefinita, ma se non vengono trovati commenti, l’altezza si riduce per visualizzare solo una riga con “Avvia discussione”. Questo peggiora il bug del caricamento della discussione, poiché mantiene un’altezza verticale elevata.
  • Sarebbe bello se i dati estratti dal genitore dell’embed favorissero un meta tag invece di trasformare l’intera pagina in testo, suppongo che questo sia un comportamento più generalizzato di discourse.

La sorpresa più grande è stata scoprire che ogni volta che visiti un URL con un embed, viene creato un nuovo argomento. Questo è nell’OP:

L’unica soluzione a cui riesco a pensare è un po’ un trucco, che si basa su SSR/caching a breve termine per eseguire il ping dell’endpoint dell’embed:

quindi penso che la logica sarebbe:

  1. controlla $discourse/embed/info?embed_url=$link

  2. se l’argomento esiste, mostra l’embed come al solito.

  3. in caso contrario, mostra un pulsante “avvia conversazione” che collega a $discourse/new-topic?subject=$link.

Funzionerebbe, o c’è qualche altro collegamento che deve essere effettuato?

Viene creato un nuovo argomento solo quando una pagina con l’embed viene visitata per la prima volta. Nelle visite successive, viene visualizzato l’argomento esistente associato all’URL.

Se non desideri la creazione automatica degli argomenti, puoi crearli tramite chiamate API nel modo che preferisci e quindi passare il topicID all’embed per controllare manualmente l’associazione.

Capito, questo è brutale per il mio caso perché ci sono decine di migliaia di pagine

Come questo?

  1. API controlla se l’argomento esiste
  2. non esiste, mostra pulsante
  3. clicca pulsante, API aggiunge argomento
  4. successo, il contenitore del pulsante si trasforma in embed

…anche questo ha alcuni problemi, come i clic sui pulsanti senza un follow-up di coinvolgimento.

C’è un modo per creare l’argomento solo quando un utente ha effettivamente commentato, qualcosa del genere?:

$discourse/new-topic?subject=$link.

o il problema qui è che non possiamo passare il topicID per un accoppiamento deterministico?

No, non è possibile rispondere a un argomento che non esiste in Discourse.

Per soddisfare questa esigenza, abbiamo reso possibile creare tutti gli argomenti incorporati come argomenti non elencati che vengono automaticamente elencati la prima volta che qualcuno risponde.

Penso che la creazione dell’argomento richieda una richiesta autenticata eseguita sul server. Se non vuoi occupartene, un altro approccio sarebbe aggiungere un pulsante all’interfaccia utente che attivi codice simile a questo (il codice che altrimenti verrebbe aggiunto automaticamente al tag head della pagina): discourse/public/javascripts/embed.js at 581dbca97f2b55c9bbbe40dc3b58a9df7409d77f · discourse/discourse · GitHub. Si tratta solo di creare un elemento iframe utilizzando questi dati:

<div id='discourse-comments'></div>
<meta name='discourse-username' content='DISCOURSE_USERNAME'>

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'http://127.0.0.1:4200/',
    discourseEmbedUrl: 'EMBED_URL',
    // className: 'CLASS_NAME',
  };
</script>

Modifica: ho dovuto provarci. Questo è solo una prova di concetto: discourse-embed-iframe-test/app/routes/triggering-embed-code.tsx at main · scossar/discourse-embed-iframe-test · GitHub. Non penso sia una buona soluzione per il tuo problema.

La logica è interamente sul client (la funzione loader è solo per comodità). Sfortunatamente, non c’è un buon modo per il client di sapere se l’argomento esiste su Discourse. Quindi non è possibile personalizzare l’interfaccia utente in base al fatto che l’argomento esista o meno. Ci sarebbero modi per risolvere questo problema, ma probabilmente richiederebbero la scrittura di qualcosa nel database dell’app.

Discourse utilizza Window: postMessage() per passare dati dall’iframe al documento padre. Ad esempio, quando viene cliccato un link di risposta nei commenti incorporati: discourse/app/assets/javascripts/discourse/scripts/embed-application.js at 581dbca97f2b55c9bbbe40dc3b58a9df7409d77f · discourse/discourse · GitHub. Mi chiedo se un messaggio possa essere inviato al documento padre per indicare che un argomento è stato creato. Ciò consentirebbe ai siti di fare cose come impostare spinner di caricamento personalizzati o visualizzare un’interfaccia utente diversa a seconda che l’argomento sia pronto o meno a ricevere commenti.

1 Mi Piace

Non credo che debba essere così se fosse possibile assegnare un link primario a un nuovo post:

$discourse/new-topic-link?link=$link

Che presumibilmente reindirizzerebbe alla discussione se esiste già e utilizzerebbe la logica esistente nell’amministratore dell’embed. Forse con dei template?

Suppongo che un altro modo per risolvere questo problema sia cercare eventuali post che fanno riferimento al link in questione e mostrare eventuali corrispondenze come parte di una conversazione a livello di sito, renderizzando direttamente nella pagina tramite SSR. Questo potrebbe essere equivalente dato che gli embed sono solo in visualizzazione. Il problema più ovvio sarebbe scegliere a quale discussione inviare l’utente quando desidera partecipare.

modifica: se riesco a capire come cercare post per contenuto del link

Mi chiedo se questa funzionalità possa essere utilizzata per attaccare un forum Discourse. Nello specifico, è possibile per qualcuno falsificare la visita di pagine sotto URL multipli di un host e creare molti molti argomenti?

Ciao community di Discourse!

Sono entusiasta di condividere un plugin che ho sviluppato per coloro che utilizzano Docusaurus v3 e desiderano incorporare commenti di Discourse sui loro siti.

docusaurus-plugin-discourse-comments

Questo plugin semplifica l’integrazione dei commenti di Discourse nel tuo sito Docusaurus v3. Ecco alcune caratteristiche principali:

  • Integrazione perfetta con Docusaurus v3
  • Percorsi di incorporamento configurabili
  • Modalità di debug per una facile risoluzione dei problemi
  • Gestione automatica degli URL di incorporamento
  • Posizionamento personalizzabile dei commenti

Se stai utilizzando Docusaurus v3 e desideri aggiungere commenti di Discourse alla tua documentazione o ai tuoi post del blog, questo plugin semplifica notevolmente il processo.

Puoi trovare il plugin su npm: docusaurus-plugin-discourse-comments

4 Mi Piace

Supponiamo di avere un singolo host incorporabile, blog.example.com e un allow-list di percorso con carattere jolly come /.*.

Vorrei aggiungere un altro incorporamento usando lo stesso host, ma questa volta con un allow-list diverso, es. /new-release.* e con un tag extra, diciamo releases.

Ovviamente l’argomento “new release” potrebbe corrispondere a entrambe le combinazioni host/percorso, ma quale dei due avrebbe la precedenza? In quale ordine vengono valutate le regole?

È ancora il caso che non possiamo incorporare un argomento da un forum privato su un host separato? Il mio caso d’uso è che utilizziamo Kajabi per ospitare il prodotto e Discourse come piattaforma di commenti. Ognuno richiede accessi separati, quindi sospetto che la risposta sia ancora “non possibile”, ma questo è uno dei fattori limitanti per i nostri utenti e un grosso problema, dato che abbiamo oltre 750 moduli, ognuno con uno spazio di discussione dedicato. Se potessi incorporare l’argomento di Discourse per ogni modulo Kajabi sulla stessa pagina, anche senza poter commentare sulla pagina, semplificherebbe tutto e consentirebbe un facile collegamento all’argomento pertinente in Discourse. Quindi, ci sono stati progressi su questo o sarà sempre una limitazione dei forum privati?

Vedo che non è possibile incorporare commenti da un forum privato (su un sito che utilizza un dominio separato):

Tuttavia, un collega sta utilizzando per i commenti su un sito Ghost un forum pubblico (su un dominio completamente diverso), pubblicando principalmente post gratuiti. Recentemente ha pubblicato il suo primo post riservato ai membri e, poiché ho spostato l’argomento associato su Discourse in una categoria non visibile a “Tutti” ma piuttosto a un Gruppo specifico (associato ai membri paganti sul sito Ghost), l’incorporamento ora visualizza il messaggio “Errore nell’incorporamento”.

Sebbene l’OP abbia affermato che i forum privati (su domini separati) non consentono il funzionamento dell’incorporamento, questo è un forum pubblico ma con una categoria privata. Il problema che sto riscontrando è dovuto al fatto che una categoria privata su un forum pubblico sia funzionalmente la stessa di un forum privato? Ho infatti letto il seguente commento, che sembra supportare tale affermazione:

Se è vero che gli argomenti di categorie private su forum pubblici non possono essere incorporati “out of the box”, c’è un modo per farlo con qualche aggiustamento dell’incorporamento (e/o della piattaforma)? Non ho molta fretta di (speriamo) “risolvere” questo problema poiché sono abbastanza d’accordo con l’idea di impostare temporaneamente la categoria privata su pubblica (dato che Discourse non può eseguire lo scraping del post Ghost privato e quindi visualizzare inavvertitamente il suo contenuto agli utenti non paganti su Discourse), ma se fosse possibile far funzionare questo, non mi dispiacerebbe assumere qualcuno in futuro per modificare l’incorporamento e/o proporre una PR per la piattaforma.

Ciao, sto usando la funzionalità di incorporamento con il mio blog Ghost, tuttavia sto riscontrando alcuni problemi nel modo in cui i post del blog finiscono sul mio forum. Ho configurato gli host sottostanti:

A causa di problemi con la configurazione del sottodominio (ho il mio dominio con un ISP diverso da dove ho il mio forum Discourse) ho deciso di percorrere la strada dei Tag.

Il problema che riscontro è che tutti i miei post del blog finiscono nella categoria Blog sul mio forum Discourse. Sto usando un utente amministratore per l’autore del post su Discourse, tutte e 3 le categorie consentono agli amministratori di creare nuovi argomenti.

Qualche suggerimento su cosa potrebbe causare questo?

Forse specificare i percorsi per ciascuno? Ad esempio, se i post che dovrebbero andare nella categoria blog sono sotto /blog/<slug>, se non ricordo male puoi fare /blog/*.

1 Mi Piace

Non funziona con il blog Ghost (almeno non con un’installazione abbastanza standard). Sto usando il mio dominio principale (alphagamer.net), il blog Ghost aggiunge automaticamente il percorso in base al titolo del post del blog dopo il dominio. Ho provato ad aggiungere un percorso ma lo rimuove semplicemente.

1 Mi Piace

Mi stavo chiedendo se i commenti di discourse (argomento) potessero essere incorporati in un argomento di discourse? Magari con un Iframe che includa il pulsante di risposta ma non il resto del sito. Cioè senza intestazione o piè di pagina.

L’ho usato con Ghost senza problemi, a parte la mancanza di integrazione SSO, che fa arrabbiare gli utenti.

Ricordo di aver dovuto modificare leggermente il codice di esempio.

Penso che funzioni bene se hai 1 embed, penso che se stai cercando di incorporare diversi tipi di post del blog in diverse categorie di Discourse, richiederà qualche aggiustamento in più.

Pensavo di poterlo fare funzionare usando i Tag, ma i tag da soli non sembrano farlo (per la mia configurazione). Credo che su Ghost dovrò creare delle Content Collections che in pratica mi permettono di aggiungere una struttura di cartelle (come alphagamer.net/blog/ e le altre di cui ho bisogno). Ci proverò durante il fine settimana, aggiornerò la mia “allowlist dei percorsi” e posterò qui se riuscirò a farlo funzionare.

La allowlist può essere separata da virgole come questa?

/blog/.*,/articles/.*

Modifica: sembra che non funzioni. Neanche questo funziona:

/(blog|articles)/.*

Forse devono essere due host separati?