Discourse-indexnow — Notifique o Bing e o Yandex instantaneamente quando tópicos forem criados ou editados

:information_source: Resumo Envia automaticamente as URLs de tópicos públicos ao IndexNow (https://www.indexnow.org/) protocol em caso de criação, edição, exclusão e respostas, permitindo que o Bing, o Yandex e outros mecanismos de busca compatíveis descubram ou removam seu conteúdo em minutos, sem precisar esperar pelos crawlers.
:hammer_and_wrench: Repositório github.com/imlotso/discourse-indexnow
:open_book: Guia de Instalação Como instalar plugins no Discourse

Uma redação em chinês com mais contexto também está disponível no meu fórum: sitetalk.net/t/topic/642

Funcionalidades

  • Envia automaticamente novos tópicos públicos; reenvia quando a primeira mensagem ou atributos críticos do tópico mudam.
  • Enviar ao Responder: Envia automaticamente a URL paginada (ex.: ?page=3) quando novas respostas são publicadas, com um tempo de espera (cooldown) configurável por URL para evitar spam.
  • Envia automaticamente as URLs dos tópicos ao serem excluídos, ajudando os mecanismos a detectarem 404/410 e removerem o conteúdo rapidamente.
  • Agrupa automaticamente URLs localizadas de tópicos quando a Localização de Conteúdo e os parâmetros de consulta de idioma do crawler estão ativos. Usa o parâmetro de idioma configurado, sem valores fixos (hardcoded).
  • Agrupa URLs canônicas e localizadas em solicitações de lote únicas do urlList do IndexNow, em vez de enviá-las uma a uma.
  • Preenchimento Histórico (Backfill): Filtre por categoria e intervalo de datas, visualize a contagem de correspondências e envie em massa. Divisão automática em lotes (chunking) para lotes que excedem o limite de 10.000 do protocolo. Tarefas ativas podem ser canceladas na aba Logs.
  • Envio Manual: Envie URLs personalizadas sob demanda, linha a linha; links externos ou inelegíveis são filtrados automaticamente.
  • Limitação de Taxa Inteligente: Aplica limites horários e diários usando um algoritmo de janela deslizante (sliding window) de granularidade fina. Faz backoff automático em 429 (respeitando Retry-After). A interface administrativa possui Barras de Cota visuais mostrando o uso atual e o tempo exato até a liberação de capacidade.
  • Exclui categorias e tags específicas como regras de camada de negócio por cima dos filtros de privacidade automatizados.
  • Rotação de chaves com um diálogo de confirmação para sobrescrita acidental; chaves anteriores são invalidadas imediatamente.
  • Verificação administrativa para acessibilidade pública de /<key>.txt.
  • Movimentações de tópicos, mudanças de visibilidade de categoria e atualizações de tags disparam reenvios ou exclusões assíncronas em jobs em segundo plano para evitar bloqueios na interface.
  • Registros de log detalhados com IDs de lote, idioma, motivos do gatilho, gráficos de tendência de sucesso/falha de 7 dias e motivos de falha categorizados (Rate Limited, Key Error, Domain Mismatch).
  • Envios totalmente assíncronos, respeitando as fronteiras de privacidade: PMs, categorias restritas, tópicos não listados/excluídos e sites que exigem login nunca são enviados.
  • Disponível em inglês e chinês simplificado.

Etapas de Configuração

  1. Instale o plugin seguindo o guia acima e reconstrua seu contêiner.
  2. Vá para Admin > Plugins > discourse-indexnow.
  3. Em Configurações, clique em Gerar chave (ou cole uma chave hex de 32 caracteres existente).
  4. Marque Ativar envios do IndexNow.
  5. Verifique a acessibilidade pública da chave:
https://your-forum-domain.com/<key>.txt

Deve retornar HTTP 200 com a string da chave. O painel administrativo também exibe um indicador verde/vermelho em cache.
6. (Opcional) Na aba Logs, use o painel “Backfill”: selecione os critérios, clique em Pré-visualizar e depois em Enviar.
7. (Opcional) Use a caixa de envio manual para enviar URLs individuais fora do fluxo automatizado.

A página de Logs também possui barras de uso de cota, um gráfico de tendência de 7 dias e métricas de detalhamento de falhas para diagnosticar facilmente problemas de envio.

Configurações

Configuração Descrição
indexnow_enabled Interruptor principal. Desativado automaticamente se login_required estiver ativado.
indexnow_api_key A chave hex de 32 caracteres para verificação do envio.
indexnow_submit_on_create Envio automático quando um novo tópico público é criado.
indexnow_submit_on_edit Reenvio automático quando a primeira mensagem ou os atributos do tópico mudam.
indexnow_submit_on_reply Envio automático da URL paginada específica quando novas respostas são publicadas.
indexnow_url_cooldown_minutes Período de espera (cooldown) por URL (em minutos) para evitar envios duplicados.
indexnow_excluded_category_ids Categorias a serem excluídas, mesmo que públicas.
indexnow_excluded_tag_names Tags a serem excluídas, mesmo que a categoria do tópico seja elegível.
indexnow_hourly_limit Máximo de URLs a enviar por hora (janela deslizante).
indexnow_daily_limit Máximo de URLs a enviar por dia (janela deslizante).

Limitações Conhecidas

  • O Google não participa atualmente do protocolo IndexNow.
  • URLs localizadas são enviadas apenas quando os parâmetros de idioma do crawler estão ativos e existe conteúdo localizado.
  • Atualmente, edições na primeira mensagem e paginação de novas respostas são suportadas, mas edições em respostas intermediárias não disparam envios independentes.

Este é um plugin independente e não oficial — não mantido pela equipe do Discourse. Ele está em produção no meu próprio fórum, tem cobertura de testes RSpec com CI em cada push/PR, e eu apreciaria relatórios de bugs ou solicitações de funcionalidades via issues no GitHub ou respostas aqui.

7 Curtiram

Obrigado por isso! Eu estava literalmente dizendo, será que preciso criar meu próprio plugin do Indexnow? E pronto! Encontrei isso!

Você pode me dizer se o indexnow_submit_on_edit emite uma submissão do Indexnow para TODOS os rebakes que alteram o conteúdo?

Não — ele só é acionado em edições genuínas por meio do fluxo normal do PostRevisor e apenas para a primeira publicação do tópico (OP). Respostas que não são OPs e reprocessamentos (rebakes) acionados pelo sistema (crons de correção de imagens, reprocessamento em massa por administradores, etc.) não disparam um novo envio, pois esses não passam pelo evento em que este plugin se integra.

Estou usando o plugin há uma semana e ele tem sido ótimo. Ele funciona exatamente como eu preciso, embora eu tenha encontrado alguns bugs que faziam o plugin falhar imediatamente após a instalação.

Especificamente, encontrei colisões de rotas com outros plugins que usam os mesmos endpoints. Houve também um problema com o rate limiting, em que as submissões atingiam o limite, aguardavam alguns minutos e atingiam o limite novamente. Além disso, a folha de estilo do painel administrativo estava sendo injetada em áreas públicas, e as classes CSS não estavam prefixadas corretamente para o plugin.

Também adicionei um recurso que eu realmente queria: a capacidade de enviar quando há uma resposta a um tópico. Essa submissão é vinculada a um número de página específico para que não processe o tópico inteiro. Para tópicos com centenas de respostas, apenas a última página é enviada, o que ajuda o crawler a encontrar a resposta e atualizar o tópico muito mais rápido.

2 Curtiram

Mesclado.

Obrigado por dedicar tempo para fazer uma análise tão aprofundada na base de código. A lógica de bucketing para a janela deslizante e o loteamento de jobs em segundo plano são melhorias sólidas. O gatilho de resposta também é um ótimo toque.

Atualizei os docs do post principal para cobrir as novas barras de cota e as configurações de cooldown que você adicionou.

Realmente aprecio o PR de alta qualidade e a descrição detalhada. :content:

1 Curtiu