And After - Design e Tecnologia por Sua Conta!
O desenvolvedor é um blog sobre desenvolvimento web, não tratando apenas de programação mas também compartilhando experiências, métodos, debates e tendências da internet.

O Desenvolvedor é um blog de www.andafter.org
Assinar o Feed RSS

Guilherme Serrano

[@]
[www]

Graduado em design, viciado em web, adoro desenvolvimento, mashups, usabilidade, o universo e tudo mais.

Vivo de e para internet. :)

Status
Karma: 68535
Opiniões: 30

Mais deste autor


Sorteio no Twitter com PHP

Sorteio no Twitter com PHP

Muito bomEste texto foi classificado como Muito bom
Em Internet, Programação
Por Guilherme Serrano
18 de Novembro de 2009

Script em PHP que através da API de busca do twitter sorteia usuários que retwittaram uma mensagem selecionada para o sorteio.

RSS Acompanhe O Desenvolvedor por Feeds!


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

  1. Configuração da frase a ser buscada
  2. Pode sortear vários participantes
  3. Lista todos os tweets que estão participando
  4. Não sorteia o responsável pela promoção
  5. Não sorteia mais de uma vez um usuário
  6. Elimina RT´s duplicados
  7. 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: felipe@ffurst.com
 * 
 */

// 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&ecirc;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&ecirc;mios.";
			break;
		}
	
		srand(strtotime("now"));
		$randval = rand(0, count($sorteio)-1);
		echo "<br>O vencedor do pr&ecirc;mio n&uacute;mero ".($i+1)." &eacute;: {$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!

O que você achou do texto?

  • Muito ruim
  • Ruim
  • Regular
  • Bom
  • Muito bom
Sua opinião é o que faz a comunidade funcionar, colabore para isso!

Tags: php, twitter, api, programacao, internet

Enviar para um amigo
Você pode comentar, assinar o feed, conhecer mais sobre o autor e ajudar a divulgar este artigo em sua ferramenta favorita através dos botões abaixo.
  • Rec6
  • ueba
  • linkk
  • dihitt
  • linkloko
  • websapiens
  • linkto
  • Eu curti

Comentários

F. Furst

18/11/2009 02:25:00

denada !!! kkkkkk só cuidem com a msg que vcs vão procurar ... se retornar mts registros, é possível que o script seja interrompido por ultrapassar o tempo limite de execução do PHP ou não ... kkkk

[Responder este comentário]

Guilherme Serrano

18/11/2009 09:24:00

Haha, eu pensei nesta possibilidade mas a solução é simples, ler 1 página do XML por vez e dar um redirect para a próxima página, usando query mesmo. Só preciso gravar o array dos participantes em uma sessão para persistir os dados... se tiver solução melhor comenta aí, que tenho um sorteio pra fazer! haueaheueh :D

F. Furst

18/11/2009 10:18:00

o problema é se tiver umas 100 requisições para a api, e como a velocidade de conexão entre os servidores tb ocila, pode ser que estoure o tempo de execução... vc pode fazer assim como vc sugeriu, mas tipo, não de 1 em 1 e sim de 20 em 20 ou 10 em 10, pra garantir, as requisições não são tão lentas assim :P ... OOOUU taca um set_time_limit(0); no topo do código ou set_time_limit(<quantidade de tempo q vc quer a mais seu demoradinho>); para extender o tempo de execução ... acredito que resolva ...

Guilherme Serrano

18/11/2009 10:40:00

O ruim de setar o limite alto é que sobrecarrega o servidor, eu fazia isso em uma rotina para gerar vitrines, aí todos os processamentos do servidor ficavam lentos. Hoje no negócio da "Vitrine Fácil" eu executo "blocos" de script a cada 10 minutos, usando esse esquema de paginação pra distribuir a carga... :D

Cristian Farias

18/11/2009 08:29:00

O cara é bom!

[Responder este comentário]

F. Furst

18/11/2009 11:20:00

Mas então faz o seguinte ... testa a carga ... realiza um sorteio aí bem rechonchudo :D... e vê da necessidade de distribuir a carga em etapas ...

[Responder este comentário]

Guilherme Serrano

18/11/2009 11:23:00

To planejando um, vou ver como o script vai reagir. Mas não vai ser tããão rechonchudo porque não tenho $ pra isso! auehaeueh

Diogo
[www]

25/1/2010 12:34:00

Tem também o http://sorteie.me/

[Responder este comentário]

Thiago
[www]

30/4/2010 16:29:00

Estou testando o sorteio, mas ele está me retornando erro na linha 54

Fatal error: Cannot instantiate non-existent class: simplexmlelement in /home/marzano/public_html/sorteio.php on line 54

[Responder este comentário]

Guilherme Serrano
[www]

2/5/2010 11:53:00

O script usa a classe SimpleXMLElement, que está disponível no PHP 5. Provavelmente você está com uma versão mais antiga do PHP instalada, deve ser isso... ;)

Jonas Esteves

24/8/2010 16:50:00

Este código salvou nossa tarde.
O Sortei-me estava fora do ar e tinhamos uma promoção que precisa de um sorteio até as 17h.

Valeu pela ajuda.

[Responder este comentário]
Deixe seu comentário!

Nome (requerido)

E-mail (requerido - não será divulgado)

URL

Quanto é 4 + 3?




web tracker