O Segredos dos Grandes Buscadores 🕵️‍♂️

Oi, Matheus aqui novamente. Hoje, compartilho com vocês uma descoberta que, por acaso, se tornou um desafio do k7.

A Dúvida Inicial e a Jornada de Descoberta

A pergunta pode parecer muito simples à primeira vista: "Você sabe como colocar um buscador no navegador?" No entanto, essa questão me levou a uma madrugada de MUITA pesquisa e algumas descobertas. A resposta era mais complexa do que eu imaginava.

Depois de muita busca, descobri o "padrão OpenSearch", um padrão sem documentação ativa que envolve a criação de um XML específico para que seu site seja detectado por navegadores. Por exemplo, meu primeiro XML ficou assim:

<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
  <ShortName>Aparda</ShortName>
  <Description>Aparda Search - Onde a Busca se Torna Descoberta.</Description>
  <Image height="16" width="16" type="image/x-icon">https://aparda.com/uploads/brand/favicon.png</Image>
  <Url type="text/html" template="https://aparda.com/web?q={searchTerms}"/>
</OpenSearchDescription>

Em seguida, precisei referenciar esse XML no cabeçalho do site:

<link rel="search" type="application/opensearchdescription+xml" href="https://aparda.com/opensearch.xml" title="Aparda Search">

Até aqui, tudo certo. O Aparda estava aparecendo automaticamente na lista de buscadores, estava buscando e eu estava feliz.. ai percebi que algo estava faltando: cadê as sugestões de busca????

Minha busca por sugestões me levou a uma página de documentação do chromium sobre Tab Search e também a descobrir um elemento crucial:

xml<Url type="application/x-suggestions+json" method="GET" template="https://minhaurl.com/busca?q={searchTerms}"/>

Adicionei isso ao meu site, mas para minha surpresa, não funcionou conforme o esperado (minha api de sugestões não é pública)

Explorando as Diferenças entre Plataformas

Continuei buscando, muito mesmo, e quando estava sem esperanças, decidi olhar como o Ecosia fazia. Para minha surpresa, eles também utilizavam o padrão de XML referenciado. O Brave seguia o mesmo método, e até mesmo o Yandex adotava essa abordagem. Entretanto, ao analisar o Google e o DuckDuckGo, percebi que eles optavam por um caminho diferente (2 reais ou um caminho misterioso?).

Exemplos de URLs de Sugestões:

A URL do Yandex chamou minha atenção, pois ao acessá-la, um arquivo TXT era baixado, semelhante ao método utilizado pelo Google para suas sugestões de busca (Exemplo do Google). Senti que estava próximo de uma solução, mas mesmo após diversos testes, não consegui que fosse detectado automaticamente.

Vale ressaltar que esse processo me pareceu bastante inseguro, uma vez que os usuários têm acesso direto ao endpoint, possibilitando o consumo indiscriminado em diferentes sites e aplicativos.

Em Busca de Soluções: Desvendando um Pouco mais

Hoje de manhã, encontrei um artigo interessante que trouxe uma nova perspectiva para navegadores baseados em Chrome. O autor destaca que a descoberta automática só funciona se o mecanismo de busca estiver na página inicial e se houver um campo de entrada type="search" ou "text" com o name="s".

<form>
  <input type="search" name="s" />
</form>

ou

<form>
  <input type="text" name="s" />
</form>

Conclusões e Desafios Futuros

Nessa jornada ai eu percebi que a segurança desse processo é uma preocupação válida. O fato de alguns mecanismos permitirem o acesso direto a um endpoint de sugestões pode ser uma "vulnerabilidade em potencial" (Imagina se um engraçado resolve fazer um flood ali e fica fazendo consultas aleatórias ele me "F*de").

Se alguém já enfrentou e solucionou esse problema, ficarei extremamente grato por compartilhar conhecimentos kkkk. Este é só mais um desafio na nossa jornada de construção do Aparda hehehe! 🌐✨

Vou atualizando vocês nos comentários sobre como resolvi o problema (se eu resolver kkkk)


Referências:

API de Auto-Suggest (Básica) para a Aparda 🚀

Usando as APIs expostas do Duckduckgo, Brave e Ecosia, decidimos criar nossa própria solução de auto sugestões para proporcionar uma experiência ainda melhor aos usuários e também ir construindo uma base pra trabalhar no futuro.

ATUALIZAÇÃO: https://github.com/apardabr/php-auto-suggestion/

1. Objetivo da API:

Desenvolvi em PHP uma API de auto-suggest que recebe consultas através da URL no formato https://ac.aparda.com/api?q={termo_de_pesquisa}.

2. Funcionamento:

  • A API consulta sua própria base de dados para obter sugestões.
  • Se não encontrar na base, realiza consultas nas APIs externas (famoso roubar) do Brave e Ecosia.
  • As respostas são combinadas, eliminando duplicatas e o termo de pesquisa.
  • Os resultados são armazenados na base de dados para consultas futuras.

3. Paralelização de Requisições:

Utilização de cURL para realizar consultas simultâneas às APIs externas, melhorando a eficiência da resposta.

4. Cookies Específicos:

Adição de cookies específicos de localização para as requisições ao Brave (country=br) e Ecosia (ECFG=pt-br).

5. Controle de Acesso:

Configuração do cabeçalho Access-Control-Allow-Origin para permitir solicitações apenas do domínio https://aparda.com.

6. Evitar Resultados Duplicados:

Implementação de lógica para evitar que o termo de pesquisa apareça nos resultados finais, eliminando duplicatas.

7. Atualização Dinâmica da Base de Dados:

Comparação entre os resultados das APIs externas e os armazenados na base de dados para garantir atualizações dinâmicas (então se estiver desatualizado ele atualiza sozinho).

8. Configuração do .htaccess:

Configuração do arquivo .htaccess para reescrever a URL de https://ac.aparda.com/api.php?q= para https://ac.aparda.com/api?q=.

9. Conclusão:

A API agora fornece sugestões de forma eficiente, consulta e atualiza dinamicamente sua base de dados e possui medidas de segurança e controle de acesso configuradas.

com essa base depois vou conseguir construir meu próprio index de "auto-suggest" no elasticsearch