Semana passada ganhei cinco seriais do Mind Meister Premium (um aplicativo web para construção de mapas mentais) para distribuir e dois deles resolvi distribuir no Twitter.
Questionado pelo @fefurst sobre os próximos prêmios, falei que não sabia como iria fazer o sorteio e ele, monstrinho programador que é, prontamente respondeu que "ia dar uma olhadinha na API do Twitter".
Dito e feito, na mesma manhã ele me envia a primeira versão de um script em PHP (já viu as novidades do PHP 5.3?)que utiliza a API Serch do Twitter procurando por uma mensagem específica (a da promoção, que você pode setar no script) para sortear entre os participantes…
Features
- Configuração da frase a ser buscada
- Pode sortear vários participantes
- Lista todos os tweets que estão participando
- Não sorteia o responsável pela promoção
- Não sorteia mais de uma vez um usuário
- Elimina RT´s duplicados
- Permite filtrar a data inicial e final dos tweets que participarão do sorteio
O código
Agora está na versão 0.3, tudo na agilidade do Furst para publicar um código bonitinho e corrigir alguns bugs. O código está como deve ser: enxuto e fácil de entender, não ousei nem adicionar mais comentários, pois está bastante legível.
<?php /* * Sorteio no twitter... :D v. 0.3 RC1 * * Auhor: Felipe Furst * email: [email protected] * */ // login de onde origina o sorteio $login = "gserrano"; // início do perído para avaliação de RT $data_inicio = strtotime("2009-11-13 08:00"); // fim do perído para avaliação de RT $data_fim = strtotime("2009-11-18 12:00"); // msg q foi retwitada, atenção as vezes alguém pode retwitar uma msg e ela icar cortada, interessante colocar um código junto da msg ou cortar alguma palavras do final $rt_string = "@gserrano"; // número de pessoas para sortear $num_premios = 2; // ------------------ a partir daqui não se mexe ----------------------- // ------------------ a partir daqui não se mexe ----------------------- // ------------------ a partir daqui não se mexe ----------------------- // ------------------ a partir daqui não se mexe ----------------------- $str = Array("á", "à", "â", "ã", "ä", "é", "è", "ê", "ë", "í", "ì", "î", "ï", "ó", "ò", "ô", "õ", "ö", "ú", "ù", "û", "ü"); $rep = Array("a", "a", "a", "a", "a", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "o", "u", "u", "u", "u"); $rt_string = str_replace($str, $rep, strtolower($rt_string)); $search_str = "{$login}"; if(strlen($rt_string) > 0) { $temp = explode(" ", $rt_string); foreach($temp as $t) { $search_str.="+{$t}"; } } $page=1; $sorteio = Array(); echo "Sorteio de {$num_premios} prêmios.<br><br>"; echo "Twittadas:<br>"; while(true) { $twtr_search = "http://search.twitter.com/search.atom?q={$search_str}&rpp=100&page={$page}"; // busca todos os registros possíveis ... $str_xml = file_get_contents($twtr_search); $xml = new SimpleXMLElement($str_xml); $page++; if($page > 1500) // a api do twitter só retorna 1500 páginas break; if(count($xml->{"entry"}) > 0) { foreach($xml->{"entry"} as $e) { if(strtotime($e->{"published"}) <= $data_fim && strtotime($e->{"published"}) >= $data_inicio) { // tem que estar dentro da data do sorteio if(array_search(utf8_decode($e->{"author"}->{"name"}), $sorteio) === false) { // verifica se o cara retwittou mais de uma vez para não aumentar a chance de vitória echo date("m.d.y H:i:s", strtotime($e->{"published"})). " - "; echo utf8_decode($e->{"author"}->{"name"}).": ".str_replace(Array("<b>", "</b>"), "", utf8_decode($e->{"content"}))."<br>"; if(strrpos($e->{"author"}->{"name"}, $login) === false) { // não sorteia quem proporciona o sorteio $sorteio[] = utf8_decode($e->{"author"}->{"name"}); } } } } } else { break; } } if(!empty($sorteio)) { echo "<br><br>Sorteado(s):"; for($i=0; $i<$num_premios; $i++) { if(empty($sorteio)) { echo "<br><br>sobraram ".($num_premios-$i)." prêmios."; break; } srand(strtotime("now")); $randval = rand(0, count($sorteio)-1); echo "<br>O vencedor do prêmio número ".($i+1)." é: {$sorteio[$randval]}"; unset($sorteio[$randval]); // não sortei o cara mais de uma vez ... $sorteio = array_values($sorteio); // refaz o vetor eliminando a posição nula do maluco removido } } else { echo "<br><br>Não houve twittadas para o sorteio."; }
Testei ele aqui e está funcionando perfeitamente. Com essa base dá para implenetar mais coisas, como um reply automático para os vencedores, adicionar periodicamente os concorrentes em um BD para gerar uma "lista" de quem está participando da promoção (caso ela dure vários dias, por exemplo)… criatividade, programadores deste mundo!
A base está aí, valeu @fefurst!