UOL XMLify: Um plugin do wordpress para propagandas do UOL XML

(Para os preguiçosos, o plugin está aqui: UOL XMLify )

Quando criei um novo blog com conteúdo que feria a licença de uso do google ad-sense (i.e. tinha mulépelada), fiquei sem opção de propagandas para colocar nos feeds. No blog em si não tinha muito problema, pois vários programas de afiliados aceitam esse tipo de conteúdo e são facilmente embutíveis em blogs, mas os feeds são outra estória. A maioria dos programas de afiliados usa javascript ou flash de uma forma ou de outra, inviabilizando o uso dos banners em leitores de feed (leia-se: não funciona no google reader).

Exemplo de anuncios XML UOL

Exemplo de anuncios XML UOL

Por sorte o UOL tinha uma modalidade nova no seu programa de afiliados: UOL XML. Esta modalidade consiste em uma API XML padrão onde eu poderia acessar a lista de produtos oferecidos, ofertas, etc, e processar e formatar da forma como bem entendesse. Primeiro pensei em fazer uma "gambiarra" como tinha feito pra embutir os anuncios do submarino (que são apenas imagens com um link padronizado), mas a coisa ficava mais complexa pois era preciso acessar o UOL e baixar os XMLs, processá-los e só então embutir no feed.

Tela de administração do plugin

Tela de administração do plugin

Optei pelo caminho mais difícil: desenvolvi um plugin. Ele está ainda em processo de aprovação pelo pessoal do wordpress para ser hospedado por lá, mas já coloquei a primeira versão aqui: UOL XMLify: Um plugin do wordpress para propagandas do UOL XML

Testem, usem e comentem!

Mais "buscas" que cairam aqui.

Sacumé, eu tinha resolvido reviver o blog a partir das buscas interessantes que caiam nele. Pra isso eu precisava listar todas as buscas e encontrar as interessantes. Achar as buscas foi fácil: meu provedor fornece o "awstats" para analisar o tráfego no site e ele separa isso pra mim. Mas pegar da interface dele tava ficando chato porque são muitas, eu queria organizar e analisar antes de escolher "as melhores". Por isso resolvi tratar direto o arquivo de log do awstats.

Como tratar o arquivo de logs do awstats pra extrair as frases de busca

O primeiro passo foi escolher o arquivo. O awstats usa arquivos mensais. Escolhi, claro, o mais recente, afinal é só uma brincadeira. Encontrar lá dentro o que eu queria foi fácil:

$ grep -ni BEGIN_SEARCHWORDS awstats072008.girino.org.txt
380:BEGIN_SEARCHWORDS 343

Ou seja, na começa na linha 380 e se estende por mais 343 linhas. Então vamos extrair essas informações daí, certo? Fiz esse scriptzinho aqui pra isso:

$ file=awstats072008.girino.org.txt;
$ grep_result=`grep -ni BEGIN_SEARCHWORDS $file`;
$ begin_pos=`echo $grep_result | awk -F: '{print $1}'`;
$ size=`echo $grep_result | awk '{print $2}'`;
$ head -$1)begin_pos+size+1 $file | tail -$2)size+2

Podem ver que as 4 primeiras linhas "apenas" processam o tamanho do arquivo para encontrar o inicio e fim do trecho que eu quero extrair. E só a ultima linha faz o trabalho mesmo. Eu poderia ter feito "na mão" e colocado logo:

$ head -$3)380+343+1 awstats072008.girino.org.txt  | tail -$4)343+2

Mas perdia toda a graça de se brincar com linha de comando 😉

Mas ainda tem um detalhe: esses "dados" estão "codificados" para uso em url (urlencoded, para os íntimos), e precisamos decodificar. Eu até pensei em um script perl ou sed ou awk pra isso, mas pra que? Como dizia o João Cupim, meu professor de marcenaria no COLTEC, cada atividade tem sua ferramenta apropriada, não improvise ferramentas. Pois pra lidar com URLs, quem melhor que PHP? Então o que levaria uma dúzia de linhas e prometeria ficar incompleto em perl/sed/awk, vira isto daqui em PHP:

<?php
$line = fgets(STDIN); // reads one line from STDIN
while ($line) {
    echo urldecode($line);
    $line = fgets(STDIN); // reads one line from STDIN
}
?>

E ainda com a garantia do PHP de que vai funcionar e ter atualizações futuras, etc e tal!

Basta lascar isso aí num arquivo "urldecode.php" e chamar:

$ head -$5)begin_pos+size+1 $file | tail -$6)size+2 | php urldecode.php

Et voilá! Seu arquivo de log foi processado com sucesso ;).

No próximo post eu falo sobre as buscas que encontrei.

References   [ + ]

1, 5. begin_pos+size+1
2, 6. size+2
3. 380+343+1
4. 343+2