Twitter sem CURL
Recentemente tive que desenvolver um pequeno aplicativo que interage com o twitter. Obviamente, a minha primeira opção foi fazer uma busca pra ver o que já existia de pronto para facilitar meu trabalho.
Achei várias classes e mini-tutoriais pela web.
O desenvolvimento foi rápido e simples. Na minha máquina, tudo funcionou certinho. Subi o protótipo em meu servidor e "plaft", nada funcionava, mensagens de erro invadiram minha telinha.
O problema acontece porque estou em um servidor compartilhado, e consequentemente existe uma restrição na configuração do PHP na vairável "openbase_dir". Quando ela está setada, o CURL não pode abrir URLs externas.
Solicitar que fosse mudada a configuração foi a primeira tentativa, e diga-se de passagem ainda estou esperando uma posição do Host. A opção foi pesquisar um jeito de interagir com o Twitter sem o uso do CURL.
Sai CURL, entra fsock
Criar uma interação com o twitter requer basicamente mandar e receber dados de uma URL com autenticação. Assim, depois de alguma pesquisa cheguei a um modelinho que resolve o meu problema, e espero eu, ajude vocês a dar seus primeiros passos no mundo de interação com o Twitter.
Fiz uma "mini classe" que serve de exemplo básico. Com ela é possível mandar mensagem pro twitter e receber a lista autenticada de um usuário. Ela está bem básica, apenas para mostrar como interagir com o twitter sem o CURL. Estou trabalhando para implementar todas as funcionalidades da API do Twitter nesta classe e aviso vocês quando estiver pronta.
Vamos ao código:
<?php
class TwitterAPI{
var $userName = "";
var $password = "";
function __construct(){
}
/*
* Faz Conversa
* Deveria ser privada, mas agora ajuda no desenvolvimento
* @var method - endereco da pagina na API
* @var userName - nome do usuario a ser autenticado
* @var password - senha do usuario
*/
function fazConversaGET($method, $userName='', $password=''){
$response="";
if ($userName=='' || $password==''){
$userName = $this->userName;
$password = $this->password;
}
$fp = fsockopen("twitter.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET $method HTTP/1.1\r\n";
$out .= "Host: twitter.com\r\n";
$out .= "Authorization: Basic ".base64_encode ($userName.':'.$password)."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
$response.= fgets($fp, 128);
}
fclose($fp);
}
return $response;
}
/*
* Buscar lista do usuario e amigos (autenticada)
* e retornar um objeto SimpleXML
*/
function getFriendList($userName='', $password='',$page=1){
// checa pra ver se foi setado um nome e usuario manualmente
// senao pega do objeto
if ($userName=='' || $password==''){
$userName = $this->userName;
$password = $this->password;
}
// API do twitter pede pra não exceder numero de paginas
// poderia ser usado o COUNT ao inves de page, mas se vc ler a DOC,
// eles pedem para usar o PAGE
if ($page>10)
$page = 10;
// BUSCA O XML
$response = $this->fazConversaGET('http://twitter.com/statuses/friends_timeline.xml?page='.$page,$userName,$password);
// O XML VEM COM RESPOSTAS DE HEADER - EU ACHO ONDE O XML INICIA E ARRANCO OS HEADERS
// DEVERIA TRATAR ISSO DEPOIS
$x = strpos($response,"<?xml");
if ($x>0){
$response = substr($response,$x);
if(class_exists('SimpleXMLElement')){
return new SimpleXMLElement($response);
}else{
return $response;
}
}else{
return false;
}
}
/*
* ENVIAR MENSAGEM PARA LISTA AUTENTICADA
*/
function sendMessage($userName='', $password='',$msg=''){
// ENCODA A MENSAGEM PRA APARECER CERTINHO
// DEVERIA TER MENOS NO MAX 140 CARACTERES
$msg = urlencode($msg);
$response="";
// NOTE QUE AQUI FAZEMOS UM POST
$out="POST http://twitter.com/statuses/update.json HTTP/1.1\r\n"
."Host: twitter.com\r\n"
."Authorization: Basic ".base64_encode ($userName.':'.$password)."\r\n"
."Content-type: application/x-www-form-urlencoded\r\n"
."Content-length: ".strlen ("status=$msg")."\r\n"
."Connection: Close\r\n\r\n"
."status=$msg";
$fp = fsockopen ('twitter.com', 80);
fwrite ($fp, $out);
while (!feof($fp)) {
$response.= fgets($fp, 128);
}
fclose ($fp);
return $response;
}
}
// EXEMPLO DE UTILIZAÇÃO DA CLASSE
// CRIA NOVO OBJETO
$tw = new TwitterAPI();
// BUSCA A PAGINA 1 EM XML DA SUA LISTA DE AMIGOS
$res = $tw-> getFriendList('SEU USUARIO', 'SUA SENHA');
echo "<pre> PAGINA 1: <BR>";
print_r($res);
echo "</pre>";
// BUSCA A PAGINA 2 EM XML DA SUA LISTA DE AMIGOS
$res = $tw-> getFriendList('SEU USUARIO', 'SUA SENHA', 2);
echo "<pre> PAGINA 2: <BR>";
print_r($res);
echo "</pre>";
// MANDA MENSAGEM AUTENTICADA COM SEU USUARIO
$res = $tw->sendMessage('SEU USUARIO','SUA SENHA','Isso veio de um PHP sem o CURL');
echo "<pre> PAGINA 2: <BR>";
print_r($res);
echo "</pre>";
?>

Comments