Incorpora commenti di Discourse su un altro sito web tramite Javascript

Esiste un modo per trovare l’ID del topic associato o l’URL di Discourse per una determinata pagina con embedding di Discourse? Vorrei fornire l’URL di Discourse per il nostro schema.org discussionUrl json-ld che includiamo nelle pagine con commenti incorporati. Ad esempio,

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

e

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

1 Mi Piace

Sì, abbiamo un endpoint API dedicato proprio per questo. Ecco un esempio:

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' 

E la risposta è:

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

Ottima domanda, l’ho aggiunta all’OP.

9 Mi Piace

Ciao a tutti - Ho seguito questo argomento e ho cercato di capire come funziona la funzione “I topic importati rimarranno non elencati finché non ci sarà una risposta”.

In sostanza, ho incorporato con successo un topic di Discourse in una pagina web, ma vorrei che la pagina incorporata mostrasse tutti i post del topic, non solo le risposte al post originale.

Non dovrebbe essere la funzione “I topic importati rimarranno non elencati finché non ci sarà una risposta” a fare questo? Ho provato ad abilitare e disabilitare questa opzione e anche l’opzione “tronca i post”, ma non sembra esserci alcuna differenza in entrambi i casi.

Qualche suggerimento? Grazie in anticipo.

_Chuck

Aggiornamento: Ho trovato questo argomento insieme a un plugin Discourse scritto da @arivanandan (grazie!). Proverò a implementarlo e aggiornerò per la posterità.

Aggiornamento 2: Il plugin funziona! Un enorme grazie ancora a @arivanandan!!

3 Mi Piace

Ciao!

È possibile incorporare un riepilogo delle statistiche di un utente, tipo:

STATISTICHE

  • 240 giorni di visite

  • 6 giorni di tempo di lettura

  • 4 giorni di tempo di lettura recente

  • 1,5k argomenti visualizzati

  • 9,1k post letti

  • 539 dati

  • 34 segnalibri

  • 38 argomenti creati

  • 1,2k post creati

  • 320 ricevuti

  • 61 soluzioni

5 Mi Piace

Questo descrive il nostro caso d’uso attuale. Tutto funziona come previsto quando gli utenti sono loggati su entrambi i siti.

Il problema che riscontro è che, se l’utente non ha effettuato l’accesso alla nostra istanza di Discourse (che non prevede accesso anonimo), non vede nulla nella pagina in cui è stato inserito l’embed.

È possibile configurare l’embed in modo che mostri un messaggio “Effettua l’accesso a Discourse per vedere la discussione” in questo caso?

6 Mi Piace

Ho avuto una situazione simile in un’istanza, e ciò che ha risolto il problema per me è stato avere entrambi i siti sotto lo stesso Identity Provider utilizzando DiscourseConnect - Single Sign-On ufficiale per Discourse (sso).

5 Mi Piace

Grazie, ma in questo caso non è possibile.

Comunque, il comportamento attuale sembra strano perché, se ci sono problemi con l’accesso, l’utente non vede nulla. C’è una ragione per non mostrare un link di accesso che reindirizzi al sito Discourse?

3 Mi Piace

Sto riscontrando lo stesso problema. Sarebbe bello vedere i commenti incorporati anche se il sito è impostato in modalità privata. Nel complesso, sto adorando Discourse, e la possibilità di aggiungere i commenti a Ghost è un plus!

3 Mi Piace

C’è un modo per passare un ID div univoco ogni volta che lo script viene chiamato? Ho un caricamento di contenuti asincrono sotto il mio articolo principale e vorrei che i commenti apparissero anche su quegli elementi. Ovviamente, il problema con l’impostazione attuale è che tutti vengono mostrati nell’ID div ‘discourse-comments’.

Grazie. @eviltrout

2 Mi Piace

Non è possibile passare un ID dinamico. Tuttavia, accetterei una PR per farlo!

2 Mi Piace

@eviltrout Ehm… beh, so cos’è una PR (ora), ma come si avvia una pull request?

1 Mi Piace

Scusa, puoi essere più chiaro su cosa intendi? Non sono uno sviluppatore Ruby, quindi purtroppo quel codice non verrà da me. Ci ho provato una volta, ma non sono andato molto lontano.

In realtà pagherei volentieri per avere questa funzionalità. Pensi che pubblicare nel marketplace sarebbe la strada giusta? Grazie.

2 Mi Piace

Sì, il marketplace è un ottimo punto di partenza se non hai la possibilità di aggiungere la funzionalità da solo.

1 Mi Piace

Ottima funzione, ragazzi.

Vorremmo utilizzarla presto, ma abbiamo oltre 30.000 blog sul nostro sito. Non vogliamo che tutti vengano inseriti nel forum senza commenti. Dato che i blog vengono inseriti come argomenti OnLoad, mi chiedevo se esistesse un modo per inserirli nel forum solo dopo un clic su un pulsante nell’embed, ad esempio, in modo che non tutti i blog vengano caricati quando visitati (ad esempio da Google)?

Credo che la nostra nuova pagina di panoramica degli argomenti sarà invasa dai blog (per i nostri amministratori, poiché inizialmente saranno invisibili per gli utenti normali del forum).

1 Mi Piace

Non esiste una tale funzionalità. La possibilità di crearle come non elencate è stata aggiunta per rispondere a questo caso d’uso specifico, ma capisco come possa essere comunque insufficiente di fronte a 30.000 blog.

Forse puoi scrivere uno script per importare manualmente la cronologia con le date originali dei post?

3 Mi Piace

Ho un’altra domanda. Lo stiamo già utilizzando, ma abbiamo articoli con link nofollow. Nel forum i link sono dofollow (il nofollow è scomparso).

Possiamo risolvere questo problema? O il canonical è sufficiente per evitare che i link nell’articolo del topic vengano seguiti?

1 Mi Piace

Mi chiedo se l’attributo data-attribute “nosnippet” possa essere d’aiuto? Robots Meta Tags Specifications | Google Search Central  |  Documentation  |  Google for Developers

Non sono sicuro al 100% se Google ignori il contenuto contrassegnato da nosnippet o se si limiti a comunicargli di non visualizzarlo nell’anteprima dei risultati di ricerca (SERP).

2 Mi Piace

Come puoi trasferire le foto utilizzando questo metodo?

1 Mi Piace

Ho scritto alcuni script per migrare i commenti del nostro blog da Disqus al forum Discourse. Nel farlo, ho creato un gran numero di argomenti utilizzando direttamente l’API di Discourse, invece di lasciare che fosse l’integrazione a crearli. Per i vecchi post, sto utilizzando il metodo di embedding topicId, mentre per i nuovi post futuri sto adottando il metodo discourseEmbedUrl.

Tuttavia, riscontro un problema strano per cui alcuni nuovi argomenti vengono comunque creati. (Sospetto che ciò sia dovuto a un bug da parte mia, quando ho avuto temporaneamente alcuni topicId mancanti in alcuni post, ed è proprio quelli che vengono creati come duplicati.) Anche se al momento non credo esista una soluzione per me, vorrei proporre una soluzione per il futuro.

Poiché il controller di embedding cerca di individuare un post esistente in base alla colonna del database embed_url, vorrei vedere una proprietà nell’API per impostare tale campo al momento della creazione di un argomento. Questo permetterebbe al mio script di importazione di impostare questa proprietà per l’argomento. Di conseguenza, l’integrazione non avrebbe nemmeno bisogno di preoccuparsi di passare dal campo topicId al campo discourseEmbedUrl nel JavaScript.

2 Mi Piace

Ho appena individuato la fonte di questo problema con il plugin embed. Durante la configurazione dell’embedding, esiste un’impostazione “Allowed Hosts” (Host consentiti), che imposta quindi la CSP per l’iframe; l’iframe verrà visualizzato solo su tale host. Ad esempio, se configuro gli embed con un host consentito come example.com e provo a incorporare lo script JS su attacker.com, l’iframe rifiuta di caricarsi con l’errore:

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

Tuttavia, in questo punto lo script JS è già stato eseguito e ha creato un argomento sul forum con l’URL fornito al codice di embedding.

Nel mio caso, ciò che sta accadendo è che utilizziamo Netlify per l’anteprima delle build, quindi una copia del blog viene effettivamente servita da URL netlify.app, che carica poi quel embed.js e crea il thread del forum per i post che avevo importato in precedenza in modo errato.

Non si tratta necessariamente di un problema di sicurezza, poiché è comunque possibile creare argomenti solo per gli URL del sito configurato e che corrispondono alla lista bianca dei percorsi. Tuttavia, è un problema in questa strategia di migrazione, dato che non avevo modo di impostare embed_url sui thread del forum durante la migrazione dei vecchi post in Discourse.

La soluzione consiste nell’aggiungere una regola CSP per impedire che embed.js venga eseguito su domini non configurati nell’impostazione “allowed hosts”.

Come prova di concetto, ho copiato il codice di embedding su un dominio completamente non correlato e ho impostato discourseEmbedUrl su uno dei vecchi post che avevo importato. Ho caricato la pagina e l’iframe è stato bloccato, ma lo script JS era già stato eseguito e aveva creato il thread del forum.

Se ritieni che si tratti più di un problema di sicurezza che di un bug, sono felice di eliminare questo post e segnalarlo tramite HackerOne.

2 Mi Piace