Obtendo dados do Navegador pelo User Agent ID usando PHP

Artigo que apresenta a função get_browser do PHP, uma forma de se descobrir os recursos de um navegador web ou crawler (buscador) pelo seu User Agent ID.

Introdução

A arquitetura de aplicações Web define que o documento gerado dinamicamente no servidor seja renderizado através de um programa (navegador Web ou "browser") no computador cliente. Normalmente são utilizadas as linguagens HTML e CSS para geração do documento. No entanto, existem vários navegadores disponíveis no mercado, cada um com características próprias e com um motor (engine) de renderização específico, que procura (ou não) seguir as especificações da W3C a respeito das linguagens citadas, e manter um certo "padrão de qualidade" do resultado visual.

Diante das diferenças entre os motores de renderização, pode ser útil detectar qual deles o cliente está usando para, talvez, aplicar alguns ajustes no layout, seja para torná-lo mais atrativo, seja para contornar algum bug no motor de renderização.

Neste artigo, veremos como detectar qual programa está acessando o sistema e, a partir disso, conseguir ajustar o layout de acordo com este valor detectado, ou oferecer o download de um programa para uma plataforma específica, ou simplesmente gerar estatísticas sobre os programas usados por quem acessa o sistema.

User Agent ID

O termo genérico usado para representar um programa que acessa um site num servidor é "User Agent". Estes programas não são apenas navegadores (browser), mas também os robôs de busca ou outros programas automatizados. Ao acessar um site, normalmente estes programas informam ao servidor uma string com as suas características, e esta string é chamada "User Agent ID" (ou "Browser ID"). Esta informação é passada através da diretiva "User-Agent" do protocolo HTTP, portanto, não é um valor confiável, mas sim uma informação complementar.

No caso de navegadores web, normalmente a string apresenta informações sobre a plataforma do cliente (sistema operacional), sobre a compatibilidade com padrões e a identificação do navegador. Veja alguns exemplos:

Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Linux Mint/5 (Elyssa) Firefox/3.0.5
Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)

Em geral, esta string deveria ser formada por uma sequência de "produto/versão" ou "(comentário)". Na prática, alguns programas seguem esta regra e outros não. Como podemos ver, o User Agent ID não é facilmente legível e nem sempre é o que parece ser.


Traduzindo o User Agent ID

Para "traduzir" o User Agent ID, existe um projeto chamado "Browser Capabilities Project" que oferece periodicamente arquivos INI com expressões regulares que procuram, na medida do possível, identificar as capacidades do navagador. Os arquivos ficam disponíveis gratuitamente numa área de download.

Para PHP, existe um arquivo INI próprio. Para usá-lo, basta seguir estes passos:

  • Baixar o arquivo php_browscap.ini ou lite_php_browscap.ini (o primeiro é mais completo, embora mais lento para se usar).
  • Salvar em algum local do servidor HTTP.
  • Configurar o arquivo php.ini para apontar para o arquivo. Isso é feito modificando-se a diretiva browscap, conforme exemplo abaixo:
    [browscap]
    browscap = /etc/php_browscap.ini
    
  • Usar a função get_browser.

Ao configurar o php.ini corretamente, a função get_browser passa a utilizá-lo assim que é invocada. Esta função recebe por parâmetro uma string com o User Agent ID, e devolve um array associativo com as capacidades/características detectadas. Veja um exemplo de campos retornados:

  • platform = Sistema Operacional
  • majorver = Versão principal
  • minorver = Versão secundária
  • browser = Nome do Navegador (ou programa)
  • version = Versão Nominal
  • frames = Aceita frames
  • tables = Aceita tabelas
  • cookies = Aceita cookies
  • vbscript = Aceita VBscript
  • javascript = Aceita JavaScript
  • javaapplets = Aceita applets Java
  • activexcontrols = Aceita ActiveX
  • beta = É uma versão beta
  • crawler = É um robô de busca

Para obter o User Agent ID do usuário que acessou seu sistema, basta acessar a variável $_SERVER['HTTP_USER_AGENT']. Veja um exemplo de como obter as características do navegador:

$caracteristicas = get_browser($_SERVER['HTTP_USER_AGENT']);

Observações

Como o arquivo php_browscap.ini é atualizado com frequência, pode ser útil colocar uma instrução para que seu servidor o atualize automaticamente em um certo período de tempo. Isso pode ser feito com um agendador de tarefas. Por exemplo, no program "cron" do Linux, podemos informar a seguinte linha:

0 10 * * * wget -O /etc/php_browscap.ini -nv http://browsers.garykeith.com/stream.asp?PHP_BrowsCapINI

Note que usei "/etc" como o local de destino do arquivo. Logo, o cron precisa ser configurado pelo root do sistema, para que ele possa sobrescrever o arquivo neste diretório. Caso queira salvar em outro local, não tem problema, desde que o php.ini seja configurado adequadamente para apontar para o local certo.

A instrução acima diz para o arquivo ser baixado do site via comando wget todo dia às 10:00 da manhã. Se preferir, mude para um horário que achar conveniente.

2 comentários

Jonny Ken disse...

Bem legal o projeto. Pena que é extremamente lento (para analisar 1 minuto de logs do migre.me levou quase 1 minuto.

Eles poderiam fazer um superlite_php_browscap.ini rs rs rs

(Se bem que eu posso ser mais esperto. Aqueles navegadores que já foram verificados não precisam ser verificados novamente... vou testar)