<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bittersweet dev</title>
	<atom:link href="http://blog.hboaventura.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hboaventura.com</link>
	<description>Henrique Boaventura</description>
	<lastBuildDate>Wed, 09 May 2012 15:58:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Desabafo de um ubunteiro (a.k.a. como o Ubuntu está acabando com a minha produtividade)</title>
		<link>http://blog.hboaventura.com/desabafo-de-um-ubunteiro-a-k-a-como-o-ubuntu-esta-acabando-com-a-minha-produtividade/</link>
		<comments>http://blog.hboaventura.com/desabafo-de-um-ubunteiro-a-k-a-como-o-ubuntu-esta-acabando-com-a-minha-produtividade/#comments</comments>
		<pubDate>Wed, 09 May 2012 15:58:02 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=447</guid>
		<description><![CDATA[Antes de mais nada, preciso deixar alguns pontos bem claros para o correto entendimento desse desabafo post. Eu, Henrique Boaventura, n&#227;o sou um usu&#225;rio final, sou um desenvolvedor de sistemas e fa&#231;o uso profissional do Ubuntu e vou ser extremamente tendencioso daqui a diante. Ele tamb&#233;m &#233; motivado como uma resposta/complemento ao post do Tonismar [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada, preciso deixar alguns pontos bem claros para o correto entendimento desse <strike>desabafo</strike> post. Eu, Henrique Boaventura, n&atilde;o sou um usu&aacute;rio final, sou um desenvolvedor de sistemas e fa&ccedil;o uso profissional do Ubuntu e vou ser extremamente tendencioso daqui a diante. Ele tamb&eacute;m &eacute; motivado como uma resposta/complemento ao <a href="http://kroiner.wordpress.com/2012/04/10/traicao-do-movimento-ou-maturidade-profissional/">post</a> do <a href="http://kroiner.wordpress.com/">Tonismar Bernardo</a>. Leiam!</p>
<p>Eu vou ser bem direto, o Ubuntu est&aacute; progressivamente matando a minha produtividade.</p>
<p>Sou usu&aacute;rio Ubuntu a anos e acompanhei boa parte, para n&atilde;o dizer todas as vers&otilde;es e atualiza&ccedil;&otilde;es de perto e eu me considero apto para dizer que a Canonical errou!</p>
<p>Na verdade, ela n&atilde;o errou, ela est&aacute; convergindo para uma dire&ccedil;&atilde;o que eu n&atilde;o acredito que seja a melhor para mim. Provavelmente seja melhor para ela, em busca de mais usu&aacute;rios finais, mas para mim, n&atilde;o.</p>
<p>Talvez eu esteja ficando velho e ranzinza, ou como meu amigo Tonismar falou no post dele, estou ficando mais maduro. Ap&oacute;s tantas vers&otilde;es do Ubuntu, de in&uacute;meras horas buscando solu&ccedil;&otilde;es para problemas b&aacute;sicos que, digamos, n&atilde;o deveriam existir em um sistema operacional direcionado ao usu&aacute;rio, confesso que cansei. Cansei de v&aacute;rias coisas.</p>
<h2>Velocidade</h2>
<p>Atualmente estou com a vers&atilde;o 12.04 e uma coisa que *sempre* me intrigou no Ubuntu &eacute; o fato de que toda a vers&atilde;o nova &eacute; anunciada como mais r&aacute;pida que a &uacute;ltima. S&oacute; eu que n&atilde;o consigo atestar isso. Tenho um computador relativamente bom, n&atilde;o &eacute; nenhum super computador do&nbsp;<abbr title="Massachusetts Institute of Technology">MIT</abbr>, mas tamb&eacute;m n&atilde;o &eacute; um computador do milh&atilde;o, &eacute; um notebook, mas n&atilde;o &eacute; do milh&atilde;o, &eacute; um Dell. Tenho como padr&atilde;o, reinstalar do zero cada vers&atilde;o nova do Ubuntu (depois de tanto apanhar com as atualiza&ccedil;&otilde;es, nunca deram certo) e mesmo com tanto alarde sobre a velocidade, &eacute; fato que para mim as coisas est&atilde;o ficando mais lentas.&nbsp;</p>
<h2>Unity/Gnome 3</h2>
<p>Como eu sinto saudade do Gnome 2, ele era t&atilde;o simples e pr&aacute;tico, simplesmente funcionava, eu configurava as &aacute;reas de trabalho, colocava cada programa na sua devida &aacute;rea e instintivamente, usava o sistema, simples assim.</p>
<p>Neste &quot;admir&aacute;vel&quot; mundo novo de Unity/Gnome 3, o que eu vi, foi uma perda muito grande de produtividade. &nbsp;</p>
<p>Vamos falar do Unity. Ele &eacute; lento, fato! Ele pode ter maravilhas de recursos, fant&aacute;sticas op&ccedil;&otilde;es, mas ele &eacute; lento e isso n&atilde;o me serve. Eu estou usando atualmente o Unity, mas somente por necessidade. Menus, Unity Lens, Global Menu, nada disso me s&atilde;o &uacute;teis, na verdade, me confundem mais do que ajudam.</p>
<p>Falando de Gnome 3, essa maravilha que eu declarei amores ao ver os videos e o funcionamento, tamb&eacute;m se tornou um presente de grego. Primeiramente o esquema de &aacute;reas de trabalho din&acirc;micas, onde elas s&atilde;o criadas de acordo com a demanda, e em linha, ou seja, os atalhos eu eu usava antes no teclado para navegar entre as &aacute;reas s&atilde;o parte do passado passado, enterrados, sem contar que cada vez que uma &aacute;rea de trabalho ficava sem um aplicativo, ela era removida, me obrigando a re-organizar todos os aplicativos e re-decorar onde cada um est&aacute;.</p>
<p>Sim, eu sou neur&oacute;tico com a organiza&ccedil;&atilde;o das &aacute;reas de trabalho. Deal with it!</p>
<h2>V&iacute;deo</h2>
<p>Meu notebook tem uma placa nVidia, consideravelmente boa, com o seu driver feito especificamente para Linux, mas isso de nada me adianta. Travamentos, bugs de transi&ccedil;&atilde;o, janelas desaparecendo s&atilde;o constantes no meu uso, cansei de &quot;perder&quot; a janela do Empathy (outra op&ccedil;&atilde;o lament&aacute;vel de IM, mas na falta de uma boa integra&ccedil;&atilde;o de outros clientes, continuo usando), multiplicar janelas do Sublime Text 2 e simplesmente sumir o meu Navegador. Isso n&atilde;o me serve, n&atilde;o mais.</p>
<p>O suporte a multiplos monitores tamb&eacute;m &eacute; algo que est&aacute; *muito* longe de ser algo aceit&aacute;vel, Usar duas telas &eacute; a certeza de muitos dos bugs relatados aqui e mais algumas p&eacute;ssimas decis&otilde;es de layout (como no Gnome 3 onde o monitor secund&aacute;rio funciona como um monitor est&aacute;tico, ou seja, se tu mudar de &aacute;rea de trabalho, ele n&atilde;o muda e no Unity, ele extender a barra de contexto ao segundo monitor).</p>
<h2>Bugs, bugs e um pouco mais de bugs</h2>
<p>Eu sei que sou errado por ser um bleeding edge user (tamb&eacute;m conhecido como: &quot;preciso ter as &uacute;ltimas vers&otilde;es de cada software&quot;), mas a cada vers&atilde;o nova do Ubuntu, luto contra bugs <strike>cretinos</strike>&nbsp;chatos e recorrentes. Um exemplo atualmente &eacute; que eu simplesmente n&atilde;o consigo ver videos em flash, e quando consigo, parece um trailer do avatar pois est&aacute; tudo em tons de azul. Houve um tempo que eu passava horas corrigindo esses bugs, procurando por solu&ccedil;&otilde;es, verificando possibilidades, mas isso n&atilde;o condiz mais com a minha realidade, eu n&atilde;o tenho mais esse tempo e preciso de algo que simplesmente funcione.</p>
<h2>A morte da produtividade</h2>
<p>Eu preciso ligar meu computador e trabalhar, esse tem sido o meu uso nos &uacute;ltimos tempos do meu computador, raras as excess&otilde;es, vejo algum video ou fa&ccedil;o algum post (isso sim &eacute; raro :D). Esses pontos relacionados acima, juntamente com as mudan&ccedil;as causadas pelos novos gerenciados de janela, simplesmente mataram a minha produtividade. Onde antes eu tinha um ambiente 100% controlado onde eu sabia onde estaria cada aplicativo e ao alcance de um atalho navegava entre eles, hoje o que eu tenho &eacute; um mar de confus&atilde;o onde a cada nova vers&atilde;o tenho que me acostumar com novos atalhos (l&oacute;gico que eu posso personalizar, mas tudo &eacute; uma quest&atilde;o de usabilidade e principalmente, tempo) e novas maneiras de fazer velhas coisas que eu simplesmente funcionavam e eu estava contente como estavam.</p>
<h2>This is the end?</h2>
<p>N&atilde;o sei, honestamente, eu continuo usando o Ubuntu, estou escrevendo esse post dele, uso ele diariamente no trabalho tamb&eacute;m, mas n&atilde;o levanto mais a bandeira dele como fazia antes. Acho que estou ficando cada vez mais critico e buscando algo que me fa&ccedil;a ser mais produtivo, como o Tonismar falou no post dele, &eacute; a maturidade, profissional e pessoal, onde tu tem que resolver as coisas e precisa ter um sistema que n&atilde;o vai te deixar na m&atilde;o quando tu precisar dele.&nbsp;</p>
<p>E a vida continua, um bug de cada vez.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/desabafo-de-um-ubunteiro-a-k-a-como-o-ubuntu-esta-acabando-com-a-minha-produtividade/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Noticias do front</title>
		<link>http://blog.hboaventura.com/noticias-do-front/</link>
		<comments>http://blog.hboaventura.com/noticias-do-front/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 17:01:31 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[tradução]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=441</guid>
		<description><![CDATA[N&#227;o, esse n&#227;o &#233; um novo post com conte&#250;do dit&#225;tico. Estou aqui somente para informar que continuo vivo e que ainda vou terminar a s&#233;rie sobre Facebook que iniciei e n&#227;o terminei. Ultimamente tenho me envolvido no processo de tradu&#231;&#227;o da documenta&#231;&#227;o do framework PHP Symfony2, por isso n&#227;o tenho disponibilizado de muito tempo para [...]]]></description>
			<content:encoded><![CDATA[<p>N&atilde;o, esse n&atilde;o &eacute; um novo post com conte&uacute;do dit&aacute;tico. Estou aqui somente para informar que continuo vivo e que ainda vou terminar a s&eacute;rie sobre Facebook que iniciei e n&atilde;o terminei.</p>
<p>Ultimamente tenho me envolvido no processo de tradu&ccedil;&atilde;o da documenta&ccedil;&atilde;o do framework PHP <a href="http://www.symfony.com">Symfony2</a>, por isso n&atilde;o tenho disponibilizado de muito tempo para os posts (traduzir documenta&ccedil;&atilde;o &eacute; uma das retribui&ccedil;&otilde;es que dou para os projetos Open Source que utilizo/divulgo).</p>
<p>A prop&oacute;sito, se algu&eacute;m tiver tempo dispon&iacute;vel e gostaria de ajudar, recomendo fortemente, &eacute; muito bom ajudar :), d&ecirc; uma lida neste <a href="http://andreiabohner.wordpress.com/2010/11/27/contribuindo-com-a-traducao-da-documentacao-oficial-do-symfony2/">link</a> que a <a href="http://andreiabohner.wordpress.com/">Andr&eacute;ia Bohner</a> explica certinho como faz&ecirc;-lo.</p>
<ul>
<li><a href="http://andreiabohner.wordpress.com/2010/11/27/contribuindo-com-a-traducao-da-documentacao-oficial-do-symfony2/">Contribuindo com a tradu&ccedil;&atilde;o da documenta&ccedil;&atilde;o oficial do Symfony2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/noticias-do-front/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Facebook ao seu site &#8211; parte 2 &#8211; Atualizando o status do usuário</title>
		<link>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-2-atualizando-o-status-do-usuario/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-2-atualizando-o-status-do-usuario/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 01:24:44 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=426</guid>
		<description><![CDATA[Essa segunda parte da s&#233;rie &#34;Integrando o Facebook ao seu site&#34; come&#231;ou complicada j&#225; na escolha do t&#237;tulo, n&#227;o conseguia decidir qual complemento usar: &#34;Atualizando o Mural do Usu&#225;rio&#34; ou &#34;Postando no Mural do Usu&#225;rio&#34;. Em ingl&#234;s parece muito mais simples, muito mais! &#201; necess&#225;rio que voc&#234; tenha lido a primeira parte do artigo, caso [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.hboaventura.com/wp-content/uploads/2011/08/facebook.png" rel="" style="" target="" title=""><img alt="" class="alignleft size-full wp-image-416" height="216" src="http://blog.hboaventura.com/wp-content/uploads/2011/08/facebook.png" style="" title="Facebook" width="216" /></a><br />
	Essa segunda parte da s&eacute;rie &quot;Integrando o Facebook ao seu site&quot; come&ccedil;ou complicada j&aacute; na escolha do t&iacute;tulo, n&atilde;o conseguia decidir qual complemento usar: &quot;Atualizando o Mural do Usu&aacute;rio&quot; ou &quot;Postando no Mural do Usu&aacute;rio&quot;. Em ingl&ecirc;s parece muito mais simples, muito mais!</p>
<p>&Eacute; necess&aacute;rio que voc&ecirc; tenha lido a primeira parte do artigo, caso n&atilde;o tenha feito ainda, <a href="http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-1-acessando-o-perfil-publico/">corre l&aacute;</a>.</p>
<p>Agora que cheguei a uma decis&atilde;o, j&aacute; desabafei, voc&ecirc; j&aacute; deve ter lido o primeiro artigo, j&aacute; est&aacute; com todos os arquivos em m&atilde;os, vamos parar de papo e vamos para o que interessa.</p>
<h2>Permiss&otilde;es</h2>
<p>Depois de levar muita bola nas costas, o Facebook aprendeu sobre privacidade (e a falta dela). Existe uma extensa lista de tipos de permiss&atilde;o que sua aplica&ccedil;&atilde;o pode solicitar ao usu&aacute;rio, dispon&iacute;vel na documenta&ccedil;&atilde;o da <a href="https://developers.facebook.com/docs/reference/api/permissions/">api</a>, mas para o nosso exemplo, vamos precisar especificamente da permiss&atilde;o <code>publish_stream</code>, que libera a aplica&ccedil;&atilde;o para atualizar o status do usu&aacute;rio a qualquer momento, assim como criar coment&aacute;rios e curtir conte&uacute;dos.</p>
<p>&nbsp;</p>
<h2>Code is Beautiful</h2>
<p>Quem n&atilde;o concorda com isso, est&aacute; no lugar errado!</p>
<p>Uma vez que j&aacute; temos a permiss&atilde;o escolhida, vamos montar o c&oacute;digo necess&aacute;rio para pedir a autoriza&ccedil;&atilde;o e postar algum conte&uacute;do no mural do usu&aacute;rio. Estou considerando que voc&ecirc; j&aacute; fez o download da SDK do Facebook no <a href="https://github.com/facebook/php-sdk">GitHub</a> (lembre-se do primeiro artigo, jovem <a href="http://starwars.wikia.com/wiki/Padawan">Padawan</a>):</p>
<pre class="php" name="code">    require &#39;php-sdk/src/facebook.php&#39;;

    $facebook = new Facebook(array(
        &#39;appId&#39;  => &#39;125178627581346&#39;,
        &#39;secret&#39; => &#39;9fcc6b62c0f23c337d8ecb9aec27d155&#39;
    ));    

    $user = $facebook->getUser();

    if ($user) {
        $post =  array(
            &#39;message&#39; => &#39;I may be paranoid... but not an android...&#39;
        );
        $facebook->api(&#39;/me/feed&#39;, &#39;POST&#39;, $post);
    } else {
        $loginURL = $facebook->getLoginUrl(array(
            &#39;scope&#39; => &#39;publish_stream&#39;
        ));
        echo &quot;&laquo;a href="\&quot;&quot;.$loginURL.&quot;\&quot;"&raquo;&quot;;
    }
</a></pre>
<p>Lembrem-se, isso &eacute; s&oacute; um exemplo (extremamente <del>tosco</del> simples). Explicando:</p>
<ul>
<li>Linha 1: Requisita a biblioteca do facebook;</li>
<li>Linha 3 a 6: Instancia a biblioteca, passando os tokens da aplica&ccedil;&atilde;o ParanoidAndroid (aqui voc&ecirc; substitui pela sua aplica&ccedil;&atilde;o);</li>
<li>Linha 8: Recupera o usu&aacute;rio;</li>
<li>Linha 11 a 13: Caso o usu&aacute;rio tenha liberado o acesso da aplica&ccedil;&atilde;o, monta a mensagem que vai ser postada no mural do usu&aacute;rio;</li>
<li>Linha 14: Efetua a postagem;</li>
<li>Linha 16 a 18: Caso o usu&aacute;rio n&atilde;o tenha liberado ainda o acesso da aplica&ccedil;&atilde;o, monta a URL para solicitar permiss&atilde;o, informando o tipo de permiss&atilde;o necess&aacute;ria;</li>
<li>Linha 19: Imprime a URL para se logar pelo Facebook.</li>
</ul>
<p>Neste exemplo, (lembrando novamente, simples), postamos uma mensagem no mural do usu&aacute;rio, mas voc&ecirc; pode postar qualquer coisa (desde que seja possivel via a pr&oacute;pria aplica&ccedil;&atilde;o do facebook). D&ecirc; uma olhada na lista completa do que voc&ecirc; pode postar <a href="https://developers.facebook.com/docs/reference/api/post/">aqui</a>.</p>
<p>Com isso temos, basicamente, um sistema que permite que sua aplica&ccedil;&atilde;o, poste algo no mural do usu&aacute;rio, mediante a permiss&atilde;o do usu&aacute;rio.</p>
<p>Caso queira ver a &quot;aplica&ccedil;&atilde;o&quot; funcionando, d&ecirc; uma olhada no meu <a href="http://hboaventura.com/facebook_parte_2/index.php">site</a>. Para fazer o download dos fontes, <a href="http://blog.hboaventura.com/wp-content/uploads/2011/09/facebook_parte_2.zip">clique aqui</a></p>
<p>That&#39;s all folks, aguardem, mais artigos est&atilde;o por vir :)</p>
<p><strong>Links &uacute;teis</strong></p>
<ul>
<li><a href="https://developers.facebook.com/docs/reference/api/post/">https://developers.facebook.com/docs/reference/api/post/</a></li>
<li><a href="https://developers.facebook.com/docs/reference/api/permissions/">https://developers.facebook.com/docs/reference/api/permissions/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-2-atualizando-o-status-do-usuario/feed/</wfw:commentRss>
		<slash:comments>64</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Facebook ao seu site &#8211; parte 1 &#8211; Acessando o perfil público</title>
		<link>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-1-acessando-o-perfil-publico/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-1-acessando-o-perfil-publico/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 17:41:35 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=409</guid>
		<description><![CDATA[E l&#225; vamos n&#243;s mais uma vez para uma s&#233;rie de artigos. Ap&#243;s v&#225;rios pedidos,&#160;vamos finalmente abordar a t&#227;o aclamada API do Facebook. Esse artigo vai se estender por, hum, tantas partes quanto necess&#225;rias. Ou at&#233; eu ficar sem paci&#234;ncia. J&#225; aviso, este primeiro post ser&#225; mais curto, mas em compensa&#231;&#227;o, vou postar mais frequentemente, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.hboaventura.com/wp-content/uploads/2011/08/facebook.png" rel="" style="" target="" title=""><img alt="" class="alignleft size-full wp-image-416" height="216" src="http://blog.hboaventura.com/wp-content/uploads/2011/08/facebook.png" style="" title="Facebook" width="216" /></a><br />
E l&aacute; vamos n&oacute;s mais uma vez para uma s&eacute;rie de artigos. Ap&oacute;s v&aacute;rios pedidos,&nbsp;vamos finalmente abordar a t&atilde;o aclamada <a href="http://developers.facebook.com/docs/reference/api/">API do Facebook</a>. Esse artigo vai se estender por, hum, tantas partes quanto necess&aacute;rias. Ou at&eacute; eu ficar sem paci&ecirc;ncia. J&aacute; aviso, este primeiro post ser&aacute; mais curto, mas em compensa&ccedil;&atilde;o, vou postar mais frequentemente, visto que temos que abordar v&aacute;rias facetas da API.</p>
<h1>Iniciando a brincadeira</h1>
<p>Antes de mais nada, para podermos brincar com qualquer recurso da <a href="http://developers.facebook.com/docs/reference/api/">API do Facebook</a>, temos que <strong>necessariamente</strong> criar uma aplica&ccedil;&atilde;o no Facebook. Para isso, seguimos os seguintes passos:</p>
<ol>
<li>Acesse a p&aacute;gina inicial de <a href="https://developers.facebook.com/apps">Apps do Facebook</a> devidamente logado;</li>
<li>No canto direito superior, clique em + Create New App;</li>
<li>D&ecirc; um nome para a aplica&ccedil;&atilde;o (e tente adivinhar o captcha);</li>
<li>Ap&oacute;s isso, sua aplica&ccedil;&atilde;o j&aacute; est&aacute; funcionando. Voc&ecirc; pode adicionar uma imagem, alterar o nome. Mas por enquanto, somente isso j&aacute; est&aacute; &oacute;timo.</li>
</ol>
<p>Feito o cadastro, vamos precisar fazer o download da <a href="http://pt.wikipedia.org/wiki/Software_Development_Kit">SDK</a> do Facebook. Podemos fazer de duas maneiras:</p>
<ul>
<li>Clonando o reposit&oacute;rio do <a href="http://www.github.com/facebook/php-sdk">GitHub</a> (recomendado. Isso me lembra que tenho que fazer um artigo sobre Git)</li>
<li>Fazendo o download do pacote via a url <a href="https://github.com/facebook/php-sdk/zipball/master">https://github.com/facebook/php-sdk/zipball/master</a></li>
</ul>
<p>Com a aplica&ccedil;&atilde;o registrada e a SDK em m&atilde;os, podemos realmente nos divertir</p>
<h1>Configurando a SDK</h1>
<p>Para configurar a SDK, vamos precisar somente de duas coisas: <strong>App ID</strong> e <strong>App Secret</strong>. Ambas informa&ccedil;&otilde;es est&atilde;o dispon&iacute;veis na administra&ccedil;&atilde;o da sua recem criada aplica&ccedil;&atilde;o, em &quot;Summary&quot;.</p>
<p>Eu criei uma aplica&ccedil;&atilde;o chamada Paranoid Android e as informa&ccedil;&otilde;es dela s&atilde;o:</p>
<ul>
<li>App ID: 125178627581346</li>
<li>App secret: 9fcc6b62c0f23c337d8ecb9aec27d155</li>
</ul>
<p>Com essas informa&ccedil;&otilde;es em m&atilde;os, vamos ao que interessa!</p>
<p>Vamos criar um arquivo, vai se chamar index.php mesmo, estou sem imagina&ccedil;&atilde;o, e colocamos o seguinte c&oacute;digo nele:</p>
<pre class="php" name="code">    require &#39;facebook_sdk/facebook.php&#39;;
    $facebook = new Facebook(array(
        &#39;appId&#39;  => &#39;125178627581346&#39;,
        &#39;secret&#39; => &#39;9fcc6b62c0f23c337d8ecb9aec27d155&#39;
    ));
    $kidh0 = $facebook->api(&#39;/henrique.boaventura&#39;);
    echo &#39;Nome: &#39; . $kidh0['name'];
    echo &#39;Localiza&ccedil;&atilde;o &#39; . $kidh0['location']['name'];</pre>
<p>Explicando:</p>
<ul>
<li>Linha 1: Requisita a biblioteca do Facebook;</li>
<li>Linha 2: Criamos a inst&acirc;ncia da nossa aplica&ccedil;&atilde;o, setando as informa&ccedil;&otilde;es da nossa aplica&ccedil;&atilde;o (App ID e App secret);</li>
<li>Linha 6: Faz a chamada para a API, requisitando o perfil p&uacute;blico do usu&aacute;rio (aqui tamb&eacute;m pode ser o id do usu&aacute;rio);</li>
<li>Linha 7 e 8: Exibimos algumas informa&ccedil;&otilde;es do usu&aacute;rio.</li>
</ul>
<p>A API retorna um array para a vari&aacute;vel (no caso <code>$kidh0</code>) com todas as informa&ccedil;&otilde;es p&uacute;blicas do usu&aacute;rio.</p>
<p>E &eacute; somente isso, com 6 linhas de c&oacute;digo temos acesso ao perfil p&uacute;blico de qualquer usu&aacute;rio (logicamente, desde que o usu&aacute;rio compartilhe o seu perfil). &nbsp;</p>
<p>Para fazer o download do arquivo de exemplo (com HTML exibindo o perfil p&uacute;blico do usu&aacute;rio), <a href="http://blog.hboaventura.com/wp-content/uploads/2011/08/facebook_parte_1.zip">clique aqui</a>.</p>
<p>Esse artigo foi <del>bem</del> curto, mas nos pr&oacute;ximos, vamos nos aprofundar mais na API. See you there!</p>
<p><strong>Links &uacute;teis:</strong></p>
<ul>
<li><a href="http://www.github.com/facebook/php-sdk">http://www.github.com/facebook/php-sdk</a></li>
<li><a href="https://developers.facebook.com/docs/reference/api/">https://developers.facebook.com/docs/reference/api/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-facebook-ao-seu-site-parte-1-acessando-o-perfil-publico/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Javascript: Desktop Notifications</title>
		<link>http://blog.hboaventura.com/javascript-desktop-notifications/</link>
		<comments>http://blog.hboaventura.com/javascript-desktop-notifications/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 14:30:38 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[notifications]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=382</guid>
		<description><![CDATA[Então cá estamos novamente. Desta vez vamos falar um pouco sobre o que são Desktop Notifications, para o que são úteis, porque ainda temos que usar com uma certa parcimônia e alguns exemplos funcionais da API.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.hboaventura.com/wp-content/uploads/2011/07/javascript.jpg"><img alt="" class="alignleft size-medium wp-image-383" src="http://blog.hboaventura.com/wp-content/uploads/2011/07/javascript-300x225.jpg" style="margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; width: 250px; height: 188px; " title="javascript" /></a>Ent&atilde;o c&aacute; estamos novamente. Desta vez vamos falar um pouco sobre o que s&atilde;o <a href="http://dev.w3.org/2006/webapi/WebNotifications/">Desktop Notifications</a>, para o que s&atilde;o &uacute;teis, porque ainda temos que usar com uma certa parcim&ocirc;nia e alguns exemplos funcionais da API.</p>
<h3 style="display:block; clear:both;">O que s&atilde;o Desktop Notifications</h3>
<p>Vou assumir que toda alma que chega neste post tem um e-mail ou pelo menos sabe para que serve (just kidding :D). Bom,&nbsp;<a href="http://dev.w3.org/2006/webapi/WebNotifications/">Desktop Notifications</a>&nbsp;&eacute; uma maneira de integrar o navegador com o seu ambiente desktop. Quantos softwares voc&ecirc; j&aacute; instalou no seu SO (Sistema Operacional para os menos intimos) ou plugins para o seu navegador, s&oacute; para saber que tu recebeste um e-mail ou uma men&ccedil;&atilde;o no Twitter. Com Desktop Notications, nada disso &eacute; mais necess&aacute;rio, isso j&aacute; vem &quot;embutido&quot; no navegador.</p>
<h3>Para que servem?</h3>
<p>Bom, exemplos s&atilde;o v&aacute;rios, mas podemos citar:</p>
<ul>
<li>Integra&ccedil;&atilde;o com o Twitter (<a href="http://www.tweetdeck.com/chrome/">Tweetdeck for Chrome</a> j&aacute; faz o uso disse de forma magistral);</li>
<li>WebIM (Web Instant Messengers) &#8211; O <a href="http://www.imo.imk">imo.im</a> &nbsp;implementou as notifica&ccedil;&otilde;es quando a janela n&atilde;o est&aacute; em foco;</li>
<li>Notifica&ccedil;&atilde;o de e-mails &#8211; O <a href="http://www.gmail.com">GMail</a> j&aacute; tem o recurso e, at&eacute; onde sei, &eacute; o &uacute;nico a implementar;</li>
</ul>
<p>Estes s&atilde;o s&oacute; alguns exemplos funcionais de Desktop Notifications, mas existe uma gama enorme de outras coisas que podem ser feitas, ficando a cargo do desenvolvedor implementar.</p>
<h3>Ent&atilde;o porque o uso com parcim&ocirc;nia?</h3>
<p>J&aacute; perceberam que no mundo do desenvolvimento Web sempre tem um &quot;por&eacute;m&quot; na hist&oacute;ria? Infelizmente, aqui tamb&eacute;m n&atilde;o &eacute; uma excess&atilde;o :/ . Nativamente, apenas o motor <a href="http://www.webkit.org/">WebKit</a> tem o recurso. &Eacute;, nem o <a href="http://www.firefox.com">Firefox</a> e nem <a href="http://www.opera.com">Opera</a> ainda possuem o recurso, muito menos previs&atilde;o de suportar (#fail). O Internet Explorer, bom, deixa pra l&aacute;.</p>
<p>Ent&atilde;o temos que fazer um uso correto das notifications (vou trat&aacute;-las somente por notifications de agora em diante). Podemos traduzir isso como &quot;adicionar verifica&ccedil;&otilde;es e fallbacks&quot; para cada um desses safados que ainda n&atilde;o implementaram as notifications:</p>
<pre class="javascript" name="code">if (!window.webkitNotifications) {
    //fallback, mensagem, xingamento, etc
}
</pre>
<h3>Colocando a m&atilde;o na massa!</h3>
<p>Bom, n&atilde;o vamos chorar sobre o leite derramado e vamos usar o Chrome[http://www.google.com/chrome] (sim, ele usa o WebKit[http://www.webkit.org/], n&atilde;o sabia?) para testar as notifications.</p>
<p>Para usar as notifications na sua aplica&ccedil;&atilde;o, temos que ter no&ccedil;&atilde;o de tr&ecirc;s (na verdade quatro) chamadas para a API:</p>
<ul>
<li>window.webkitNotifications.checkPermission() &#8211; Retorna 0 se o dominio tem acesso as notifications ou 1 se n&atilde;o tiver ainda decidido e 2 caso tenha negado acesso;</li>
<li>window.webkitNotifications.requestPermission(callback) &#8211; Solicita acesso as notifications para o dominio. O callback &eacute; executado ap&oacute;s a tomada de decis&atilde;o;</li>
<li>window.webkitNotifications.createNotification(icon, title, text) &#8211; Retorna a instancia da notification. &Eacute; utilizado o m&eacute;todo show() para mostr&aacute;-la;</li>
<li>window.webkitNotifications.createHTMLNotification(link) &#8211; Faz a mesma coisa que createNotification, mas carrega um link na notification.</li>
</ul>
<p>Conhecendo essas chamadas, podemos montar um exemplo simples para demonstrar o potencial das notifications. No caso, vamos fazer um wrapper para gerenciar nossas notifications, e us&aacute;-la em um simples e simp&aacute;tico &quot;Bem vindo&quot; ao clicar em um bot&atilde;o (t&atilde;o anos 90)</p>
<pre class="javascript" name="code">Notification = {
    support: function(){
        if(window.webkitNotifications){
            return true;
        } else {
            return false;
        }
    },
    permission: function(){
        return window.webkitNotifications.checkPermission();
    },
    requestPermission: function(callback){
        window.webkitNotifications.requestPermission(function() {
            if (callback) {
                callback(window.webkitNotifications.checkPermission() == 0);
            }
        });
    },
    notify: function(icon, title, text, expires){
        if(Notification.permission() == 0){
            var notify = window.webkitNotifications.createNotification(icon, title, text);
            notify.show();
            if(expires){
                setTimeout(function(){
                        notify.cancel();
                    },
                    expires
                );
            }
        }
    }
}
</pre>
<p>Explicando:</p>
<ul>
<li>Linha 1 &#8211; Criamos o wrapper para as fun&ccedil;&otilde;es de notifica&ccedil;&atilde;o;</li>
<li>Linha 2 a 8 &#8211; Fun&ccedil;&atilde;o que verifica se o sistema tem suporte a notifications;</li>
<li>Linha 9 a 11 &#8211; Retorna a permiss&atilde;o para a p&aacute;gina (0 = Sim, 1 = N&atilde;o setado, 2 = N&atilde;o);</li>
<li>Linha 12 a 18 &#8211; Fun&ccedil;&atilde;o que solicita a permiss&atilde;o do usu&aacute;rio para mostrar notifica&ccedil;&otilde;es. Caso seja passado um callback, executa ele passando true como par&acirc;metro;</li>
<li>Linha 19 a 31 &#8211; Mostra o notify, com a op&ccedil;&atilde;o de fechar automaticamente a notification depois de certo tempo (expires, em ms).</li>
</ul>
<p>Bom, com nosso wrapper criado, &eacute; s&oacute; aplicar ele em nossas p&aacute;ginas. Veja um <a href="http://blog.hboaventura.com/wp-content/uploads/2011/07/notifications.html">demo</a>&nbsp;dele em funcionamento.</p>
<h3>Luz no fim do t&uacute;nel</h3>
<p>Pelo menos para os usu&aacute;rios do <a href="http://www.firefox.com">Firefox</a>, existem solu&ccedil;&otilde;es para &quot;emular&quot; as notifications, atrav&eacute;s de add-ons. O que eu achei melhor foi o <a href="http://code.google.com/p/ff-html5notifications/">HTML5 Notifications</a> que funcionou perfeitamente no meu ambiente (Ubuntu 11.04), s&oacute; demonstrando de uma maneira diferente (<a href="https://wiki.ubuntu.com/NotifyOSD">NotifyOSD</a>).&nbsp;</p>
<p>That&#39;s all folks, see you around :)</p>
<p>Mais links sobre o assunto:</p>
<ul>
<li><a href="http://dev.w3.org/2006/webapi/WebNotifications/">Web Notifications</a></li>
<li><a href="http://code.google.com/p/ff-html5notifications/">ff-html5notifications</a></li>
<li><a href="http://dev.chromium.org/developers/design-documents/desktop-notifications/api-specification">API &nbsp;Specification</a></li>
<li><a href="http://code.google.com/chrome/extensions/notifications.html">Notifications</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/javascript-desktop-notifications/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como evitar cache de CSS e Javascript</title>
		<link>http://blog.hboaventura.com/como-evitar-cache-de-css-e-javascript/</link>
		<comments>http://blog.hboaventura.com/como-evitar-cache-de-css-e-javascript/#comments</comments>
		<pubDate>Fri, 20 May 2011 14:57:31 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=361</guid>
		<description><![CDATA[Sauda&#231;&#245;es! O grande problema de todas as criaturas que fazem artigos sempre &#233; tempo. Meu tempo se divide ultimamente em cozinhar e trabalhar, ent&#227;o os artigos no blog tem ficado escassos. Hoje vamos mais uma vez tentar mudar isso. Cen&#225;rio Imagine a seguinte situa&#231;&#227;o: Seu site, com tudo funcional, em seu perfeito e equilibrado estado, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.hboaventura.com/wp-content/uploads/2011/05/img_css.jpg"><img alt="" class="alignleft size-full wp-image-374" height="150" src="http://blog.hboaventura.com/wp-content/uploads/2011/05/img_css.jpg" title="img_css" width="200" /></a></p>
<p>Sauda&ccedil;&otilde;es!</p>
<p>O grande problema de todas as criaturas que fazem artigos sempre &eacute; tempo. Meu tempo se divide ultimamente em cozinhar e trabalhar, ent&atilde;o os artigos no blog tem ficado escassos. Hoje vamos mais uma vez tentar mudar isso.</p>
<h3>Cen&aacute;rio</h3>
<p>Imagine a seguinte situa&ccedil;&atilde;o:<br />
	Seu site, com tudo funcional, em seu perfeito e equilibrado estado, precisa de uma altera&ccedil;&atilde;o, um novo recurso, ou algo parecido. Para isso, voc&ecirc; tem que alterar o seu CSS e seu Javascript. At&eacute; ai tudo bem, nada de mais, visto que &eacute; algo banal, altera&ccedil;&otilde;es s&atilde;o banais (NOT!), mas alguns usu&aacute;rios assiduos n&atilde;o est&atilde;o vendo essas altera&ccedil;&otilde;es feitas no sistema. O que diabos est&aacute; ocorrendo? Se chama cache.</p>
<h3>Cache</h3>
<p>Para os pouco iluminados, cache &eacute; mais ou menos como copiar uma m&uacute;sica no teu computador para evitar de sempre ter que ir na prateleira buscar, mas aplicado a inform&aacute;tica. No caso do CSS e do Javascript, ele guarda uma c&oacute;pia desses arquivos na m&aacute;quina do cliente. Quando esse cliente acessar o site novamente, ao inv&eacute;s de fazer o download do arquivo do site, ele usar&aacute; o arquivo em cache, evitando consumo de banda para o cliente e para o site. Essa c&oacute;pia tem uma data para expirar, mas em muitos casos, n&atilde;o podemos contar com todo esse tempo (e sorte).</p>
<h3>Evitando o Cache</h3>
<p>Agora que j&aacute; sabemos o que &eacute; Cache e como nosso browser usa ele, vamos aplicar isso no nosso cen&aacute;rio inicial. A pr&aacute;tica padr&atilde;o para isso &eacute; concatenar na URL do CSS/JS uma string, vamos iniciar com uma declara&ccedil;&atilde;o padr&atilde;o de um CSS (pode ser um JS, mas vou &nbsp;usar CSS para os testes):</p>
<pre class="html" name="code">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;main.css&quot; /&gt;</pre>
<p>Bom, se analisarmos usando alguma ferramenta (neste caso, o firebug), vamos ver que no primeiro acesso, ele faz o download do CSS, tudo normal, mas ao acessarmos pela segunda vez a mesma p&aacute;gina, ele n&atilde;o faz novamente o download do CSS e sim carrega ele do cache. Hum, j&aacute; era sabido que isso ia acontecer, mas dessa vez, vamos fazer com que ele recarregue o CSS, sem necessidade de limpar o cache:</p>
<pre class="html" name="code">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;main.css?nocache&quot; /&gt;</pre>
<p>Hey! Mas o CSS aceita par&acirc;metros como PHP?&nbsp;<br />
	N&atilde;o, n&atilde;o aceita, nem cogite deixar esse tipo de pensamento alocado no c&eacute;rebro. Ele n&atilde;o aceita par&acirc;metros, mas ele aceita a adi&ccedil;&atilde;o de conteudo &quot;como se fosse&quot; um par&acirc;metro.</p>
<p>Recarregamos a p&aacute;gina e analisamos novamente. Que maravilha, ele fez novamente o download do CSS como queriamos! But wait! se fizermos isso mais uma vez, l&aacute; vem o cache novamente para atrapalhar.&nbsp;</p>
<p>Isso acontece porque ao adicionarmos a string, ele vai procurar no cache um arquivo &quot;main.css?cache&quot; para o seu dominio e n&atilde;o vai encontrar, porque em cache estava o &quot;main.css&quot;, mas na segunda vez, ele vai encontrar e usar o cache novamente.</p>
<p>E agora? Eu quero que ele recarregue o CSS sempre que o usu&aacute;rio acessar o site. Como vamos fazer isso?&nbsp;</p>
<p>Aqui entra nosso amigo PHP para nos dar uma m&atilde;o (poderia ser em qualquer linguagem decente de programa&ccedil;&atilde;o). O que vamos fazer &eacute; adicionar como &quot;par&acirc;metro&quot; ao CSS um timestamp (da execu&ccedil;&atilde;o do script), usando a fun&ccedil;&atilde;o time do PHP assim:</p>
<pre class="php" name="code">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;main.css?&lt;?php echo time();?&gt;&quot; /&gt;</pre>
<p>Dessa maneira, sempre que o o usu&aacute;rio acessar o site, ele vai recarregar o CSS e sempre ter a &uacute;ltima vers&atilde;o.</p>
<p>Isso funciona, na maioria dos casos vai ser o suficiente, mas imaginem um site com milhares de acessos, cada usu&aacute;rio tendo que recarregar sempre o CSS/JS, o consumo de banda que isso geraria no servidor. That&#39;s not cool!</p>
<h3>Evitando o Cache (menos nocivo)</h3>
<p>Existe uma maneira menos nociva de evitar o cache, que &eacute; recarregar o CSS/JS somente quando ele tiver alguma altera&ccedil;&atilde;o, mantendo o cache at&eacute; quando for necess&aacute;rio recarreg&aacute;-lo.</p>
<p>Para isso, precisamos descobrir a data de altera&ccedil;&atilde;o do arquivo (l&aacute; vem o PHP de novo) e usarmos ele como &quot;par&acirc;metro&quot;:</p>
<pre class="php" name="code">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;main.css?&lt;?php echo filemtime(&#39;main.css&#39;); ?&gt; /&gt;</pre>
<p>Agora sim, ao inv&eacute;s de recarregar o CSS toda santa vez que o usu&aacute;rio acessar o site, isso &eacute; seletivo, somente quando h&aacute; uma mudan&ccedil;a no CSS, mudando o timestamp de altera&ccedil;&atilde;o do arquivo, ele ser&aacute; recarregado, consumindo somente a banda necess&aacute;ria, no momento certo!</p>
<p>N&atilde;o foi t&atilde;o dificil assim, podem admitir :)</p>
<p>Ficamos por aqui, aguardem not&iacute;cias!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/como-evitar-cache-de-css-e-javascript/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Twitter ao seu Site &#8211; Autenticação de Usuários</title>
		<link>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-autenticacao-de-usuarios/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-autenticacao-de-usuarios/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 12:41:02 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=339</guid>
		<description><![CDATA[Quem está vivo sempre aparece (clichê cretino, e um tanto enganoso se por acaso você acreditar em fantasmas, zumbis, etc&#8230;). Com essa afirmação, estamos aqui novamente para falar de&#8230; Twitter! Já falei que ia ser um artigo de somente 3 partes, extendi para uma 4ª parte extra. Mas ainda não deixei todos contentes, e mais [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-317" title="tweet_s" src="http://blog.hboaventura.com/wp-content/uploads/2010/09/tweet_s.jpg" alt="" width="210" height="174" />Quem está vivo sempre aparece (clichê cretino, e um tanto enganoso se por acaso você acreditar em fantasmas, zumbis, etc&#8230;). Com essa</p>
<p>afirmação, estamos aqui novamente para falar de&#8230; <a href="http://www.twitter.com">Twitter!</a></p>
<p>Já falei que ia ser um artigo de somente <a href="http://blog.hboaventura.com/tag/twitter/">3 partes</a>, extendi para uma <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-extra-mais-comandos-da-api/">4ª parte extra</a>. Mas ainda não deixei todos contentes, e mais uma vez vou espichar o artigo para uma 5ª parte e quem sabe dessa vez final (eu tenho vários outros assuntos legais para escrever também).</p>
<p>Dessa vez vamos aprender como usar a <a href="http://github.com/abraham/twitteroauth">biblioteca</a> do sr. <a href="http://abrah.am/">Abraham Williams</a> autenticar qualquer usuário que queira permitir o acesso a nossa aplicação.</p>
<p>Daqui em diante, vou considerar que você já viu os dois artigos anteriores que abordaram autenticação na <a href="http://dev.twitter.com">API do Twitter</a>. Caso não tenha lido eles ainda, faça-o agora!</p>
<ul>
<li><a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/">PHP: Integrando o Twitter ao seu Site – Parte 3 (Agora com OAuth)</a></li>
<li><a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-extra-mais-comandos-da-api/">PHP: Integrando o Twitter ao seu Site – Extra (Mais comandos da API)</a></li>
</ul>
<p>Agora que você já sabe de cor e salteado os outros artigos, vamos ver como autenticar um usuário para nossa aplicação poder acessar os dados<br />
dele.</p>
<h3>Ingredientes da receita</h3>
<p>Para o usuário permitir o acesso a nossa aplicação, primeiramente, precisamos de alguns dados do app criada na nossa conta do Twitter:</p>
<ul>
<li>Consumer Key;</li>
<li>Consumer Secret;</li>
<li>URL de retorno da autenticação (você já vai entender o porque).</li>
</ul>
<p>Também para você já preparar seu ambiente, vamos criar 3 arquivos:</p>
<ul>
<li>index.html (somente uma página simples com um link para autenticar o usuário);</li>
<li>config.php (define 3 constantes para evitar ficar digitando o tempo todo);</li>
<li>redirect.php (script que vai solicitar a autenticação e liberação);</li>
<li>callback.php (script que será chamada se o usuário se autenticar).</li>
</ul>
<p>Com esses dados em mãos, podemos continuar e fazer nossa aplicação, requisitar a permissão do usuário, lembrando que nenhum desses nomes é obrigatório, eu defini eles da maneira que eu achei mais apropriado e compreensivel (ou não!)</p>
<h3>Configurando a aplicação</h3>
<p>Bom, o arquivo index.html não é nada mais nada menos que um link para o arquivo redirect.php, portanto, nem vou me dar ao trabalho de explicá-lo.</p>
<p>Vamos começar então pelo config.php. Ele vai ser responsável por guardar as informações estáticas da nossa aplicação:</p>
<p><small>Há! antes que eu me esqueça, eu utilizei $_SESSION e constantes para guardar as informações de tokens que irão ser retornadas da requisição ao Twitter. Na sua aplicação, você muito provavelmente vai guardar isso em um banco de dados, assim espero!</small></p>
<pre name="code" class="php">define('CONSUMER_KEY',    'ELi0Wc1kMAuJyHJQ68AEg');
define('CONSUMER_SECRET', 'Vkf6oqNnckF3Tlf00BVzQkMYmcx8mkkI7MzpXixsjY');
define('OAUTH_CALLBACK',  'http://localhost/twitter/callback.php');</pre>
<p>Lembrando que a consumer_key e o consumer_secret vem da sua aplicação cadastrada no Twitter. A URL de callback pode ser qualquer URL, até mesmo uma URL local, pois ela vai ser o retorno da autenticação do Twitter. Com isso, só precisamos usar o require no inicio dos arquivos redirect.php e callback.php para usar as constantes.</p>
<h3>Requisitando autorização</h3>
<p>Dando continuidade a brincadeira, vamos para o redirect.php. Ele vai ser o responsável por montar uma URL com o token da aplicação, que irá para a página do Twitter. Ele fica da seguinte maneira:</p>
<pre name="code" class="php">session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

$request_token = $connection-&gt;getRequestToken(OAUTH_CALLBACK);

$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

$url = $connection-&gt;getAuthorizeURL($token);
header('Location: ' . $url);</pre>
<p>Explicando:</p>
<ul>
<li>Linha 1 &#8211; Inicio a sessão, só tem utilidade caso você não utilizar banco de dados;</li>
<li>Linhas 2 a 3 &#8211; Require da biblioteca e do arquivo de configuração;</li>
<li>Linhas 5 e 7 &#8211; Cria uma conexão e requisita um token temporário para a URL de callback;</li>
<li>Linhas 9 e 10 &#8211; Guarda os tokens na sessão;</li>
<li>Linha 12 &#8211; Gera a URL com o token para ser redirecionado para a autenticação do Twitter;</li>
<li>Linha 13 &#8211; O redirecionamento!</li>
</ul>
<p>Neste momento, se você acessar o redirect.php, você já vai ser redirecionado para o Twitter, pedindo sua senha, e depois, perguntando se você permite que a aplicação X se conecte a sua conta. Agora, vamos fazer o callback.php, que vai pegar o token do usuário e liberar o acesso.</p>
<h3>Callback</h3>
<p>O callback.php, vai pegar o token verificador e recuperar o token de acesso na API do Twitter. Sei que essa história de token pra cá, token pra lá, pode até ficar chata e complicada, mas c&#8217;est la vie.</p>
<pre name="code" class="php">session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

$access_token = $connection-&gt;getAccessToken($_REQUEST['oauth_verifier']);

$_SESSION['access_token'] = $access_token;

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

$content = $connection-&gt;get('account/verify_credentials');</pre>
<p>Desmistificando:</p>
<ul>
<li>Linha 1 &#8211; Inicio a sessão, só tem utilidade caso você não utilizar banco de dados;</li>
<li>Linhas 2 a 3 &#8211; Require da biblioteca e do arquivo de configuração;</li>
<li>Linhas 5 e 7 &#8211; Cria uma conexão com os tokens temporários recuperados no redirect.php e requisita o token de acesso do usuário;</li>
<li>Linha 9 &#8211; Guarda o token na sessão;</li>
<li>Linha 11 &#8211; Cria uma nova conexão, agora com o token de acesso, liberando o acesso da aplicação a conta do usuário;</li>
<li>Linha 12 &#8211; Teste para verificar se a permissão foi liberada com sucesso.</li>
</ul>
<p>Com isso, você já pode fazer qualquer coisa na conta do usuário, lógico, se ele tiver liberado o acesso da sua aplicação (dãh).</p>
<h3>Finalizando</h3>
<p>Esse é um exemplo bem simples, e muito diferente do que você virá a usar dentro da sua aplicação, mas conta como um aprendizado. Como disse anteriormente, em um ambiente de produção, o ideal é gravar os tokens todos em banco de dados, podendo assim usar o acesso liberado pelo usuário continuamente, não exigindo sempre a validação no Twitter.</p>
<p>Caso você queira fazer o download dos arquivos para testar, <a href="http://blog.hboaventura.com/wp-content/uploads/2011/01/twitter_oauth.zip">clique aqui</a>.</p>
<p>Alterem, criem e comentem. That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-autenticacao-de-usuarios/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Twitter ao seu Site &#8211; Extra (Mais comandos da API)</title>
		<link>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-extra-mais-comandos-da-api/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-extra-mais-comandos-da-api/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 14:14:58 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=327</guid>
		<description><![CDATA[Cá estamos nós novamente para mais um artigo sobre Twitter. Sei que disse que só seriam 3 partes, que ia finalizar com a autenticação na API, mas surgiram muitas dúvidas referente a como usar outros comandos da API, como Direct Messages, Excluir tweets e Retweets. Este artigo vai ser bem simples e direto ao ponto. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-292" title="twitter_bird" src="http://blog.hboaventura.com/wp-content/uploads/2010/04/twitter_bird.jpg" alt="" width="216" height="179" />Cá estamos nós novamente para mais um artigo sobre Twitter. Sei que disse que só seriam 3 partes, que ia finalizar com a autenticação na <a href="http://dev.twitter.com/doc">API</a>, mas surgiram muitas dúvidas referente a como usar outros comandos da <a href="http://dev.twitter.com/doc">API</a>, como Direct Messages, Excluir tweets e Retweets.</p>
<p>Este artigo vai ser bem simples e direto ao ponto. Juntei todas as ações que mais foram pedidas nos comentários e adicionei algumas que julguei que podem se tornar dúvidas mais adiante. Vamos partir do pré-suposto que você já leu o <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/">artigo anterior</a> (right?!) e já sabe tudo sobre como se autenticar na <a href="http://dev.twitter.com/doc">API</a> do Twitter. So, let&#8217;s code!</p>
<h3>Recuperando informações do Usuário</h3>
<p>Nada melhor para começar do que saber para quem se está enviando um tweet (a não ver que você seja um spammer, você já deve saber), afinal, informação nunca é demais. Vamos então recuperar os dados do usuário:</p>
<pre name="code" class="php">require_once('twitteroauth/twitteroauth.php');

$consumer_key = '******';
$consumer_secret = '******';
$oauth_token = '******';
$oauth_token_secret = '******';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret
);

$result = $connection-&gt;get(
    'users/show',
    array(
        'screen_name' =&gt; 'kidh0'
    )
);

$id = $result-&gt;id</pre>
<p>Isso vai me retornar o profile do usuário @kidh0 (eu mesmo, fique a vontade para me seguir <a href="http://www.twitter.com/kidh0">@kidh0</a>) com todas as informações referentes ao mesmo. Para acessar as informações, simplesmente use o $result como uma classe com atributos:</p>
<pre name="code" class="php">
//codigo necessario para autenticacao na API (vide parte 3 do artigo)
$id = $result-&gt;id;
$nome = $result-&gt;name;
$avatar = $result-&gt;profile_image_url;</pre>
<p>Aqui cabe uma observação: Sempre que você for recuperar uma informação (tweets, profile, direct messages), você deve usar o método &#8216;get&#8217; da classe TwitterOAuth. Já quando se for enviar alguma coisa (um update, uma direct), deve se usar o &#8216;post&#8217;. &#8220;Mas porque isso?&#8221; vocês devem estar se perguntando. Isso é porque o Twitter tem uma API <a href="http://pt.wikipedia.org/wiki/REST">REST</a>, e precisa que seja explicito o verbo HTTP para que a requisição seja feita sem problemas.</p>
<h3>Enviando/Removendo Direct Messages</h3>
<p>Agora que já temos as informações do usuário, vamos começar a comunicação com ele. Primeiramente, vamos nos manter no anonimato e mandar Direct Messages.<br />
Para enviar uma DM, você vai precisar necessariamente de 2 coisas: ou nome do usuário para quem você vai enviar a DM (tipo @kidh0) ou o ID do usuário, e a mensagem propriamente dita. Para facilitar, vou usar somente o usuário:</p>
<pre name="code" class="php">
$result = $connection-&gt;post(
    'direct_messages/new',
    array(
        'screen_name' =&gt; 'kidh0',
        text' =&gt; 'O que vamos fazer essa noite Cérebro?'
    )
);</pre>
<p>Dentro da variável $result, estará toda a informação referente a DM enviada, para acessar as informações, siga o mesmo padrão que usamos antes.<br />
Lembrando que para enviar uma DM, o usuário deve obrigatoriamente seguir você.</p>
<p>Para remover, é mais simples que enviar. Vamos recuperar a última DM e deletá-la:</p>
<pre name="code" class="php">
//recupera as 20 ultimas DM
$result = $connection-&gt;get(
    'direct_messages/sent',
    array(
    )
);

//pegamos a ultima enviada
$id = $result[0]-&gt;id;
$dm = $connection-&gt;post(
    'direct_messages/destroy/' . $id,
    array(
    )
);</pre>
<p>Voilá, DM deletada!</p>
<h3>Enviando um Retweet</h3>
<p>Nossa, eu ia &#8220;aportuguesar&#8221; a palavra, mas doeu aos olhos. Bom, para retweetar um tweet é bem simples, você só vai precisar&#8230; rufem os tambores&#8230; do ID do tweet :D.<br />
Digamos que você queira retweetar o meu tweet &#8220;code is mighter than the sword #devlife&#8221;. Bom, o ID deste tweet é 25681189229, para descobrir o ID, você deve usar recurso &#8220;statuses/user_timeline&#8221;, explicado no <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/">artigo anterior</a>. Tendo em mãos o ID:</p>
<pre name="code" class="php">$id = 25681189229;
$result = $connection-&gt;post(
    'statuses/retweet/' . $id,
    array(
    )
);</pre>
<h3>Deletando um tweet</h3>
<p>Quantas vezes você já tweetou algo errado, ou chegou em casa de cabeça quente e usou o famoso #prontofalei e depois se arrependeu? Para remover um tweet, assim como para retweetá-lo (garanto que já deve ter no aurélio essa palavra), você precisa só do ID do tweet:</p>
<pre name="code" class="php">$id = 13823697837;
$result = $connection-&gt;post(
    'statuses/destroy/' . $id,
    array(
    )
);</pre>
<p>Pronto, sem mais dores de cabeça referentes a um tweet embriagado. A não ser que quem não devesse ler, foi mais rápido que você.</p>
<h3>Concluindo</h3>
<p>Existem ainda dezenas de outros recursos a serem utilizados na <a href="http://dev.twitter.com/doc">API</a> do Twitter, listei aqui alguns dos mais pedidos. Conforme necessidade, vou acrescentando outros aqui, mas por enquanto, ficarão somente estes. Por hoje é só pessoal, drive safely!</p>
<p>Alguns links interessantes:</p>
<ul>
<li><a href="http://dev.twitter.com/doc">Twitter API Documentation</a></li>
<li><a href="http://pt.wikipedia.org/wiki/REST">REST</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-extra-mais-comandos-da-api/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Twitter ao seu Site – Parte 3 (Agora com OAuth)</title>
		<link>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 12:22:58 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=315</guid>
		<description><![CDATA[Yes! I&#8217;m alive! Depois de desaparecer por praticamente 4 meses (se você não me segue no twitter, é claro), cá estou eu novamente, tomando as rédeas para terminar de uma vez esse jornada em 3 partes. Esta etapa deveria ter como finalidade, conforme o primeiro artigo, o desenvolvimento de uma biblioteca que agregasse as funções [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-317" title="tweet_s" src="http://blog.hboaventura.com/wp-content/uploads/2010/09/tweet_s.jpg" alt="" width="216" height="179" />Yes! I&#8217;m alive!</p>
<p>Depois de desaparecer por praticamente 4 meses (se você não me segue no <a title="Home do meu twitter" href="http://www.twitter.com/kidh0">twitter</a>, é claro), cá estou eu novamente, tomando as rédeas para terminar de uma vez esse jornada em 3 partes.</p>
<p>Esta etapa deveria ter como finalidade, conforme o primeiro artigo, o desenvolvimento de uma biblioteca que agregasse as funções que foram desenvolvidas nos primeiros dois artigos, mas as coisas mudaram um pouco de figura. Visto que o <a title="Twitter" href="http://www.twitter.com">Twitter</a> recentemente parou de dar suporte a Basic Auth à sua API, muitas pessoas me pediram para que este terceiro (e último) artigo mudasse para como se autenticar na API usando <a title="Site do OAuth" href="http://oauth.net/">OAuth</a>. Como sou fácil de se convencer, resolvi mudar o artigo final para atender essa nova demanda.</p>
<p>O que nós vamos ver daqui em diante é o passo a passo de como gerar os tokens necessários para se autenticar no <a title="Twitter" href="http://www.twitter.com">Twitter</a>, usá-los junto com <a title="Site do OAuth" href="http://oauth.net/">OAuth</a> para se autenticar e enviar/receber os tweets através da API.</p>
<p>Para aqueles que estão praguejando agora e esperavam pela biblioteca que integraria todos os recursos, sugiro dar uma olhada nesses projetos, que, basicamente, fazem o que iríamos fazer aqui (pra que retrabalho, right?):</p>
<ul>
<li><a href="http://emmense.com/php-twitter/">PHP Twitter</a></li>
<li><a href="http://www.phpclasses.org/package/4075-PHP-Set-and-retrieve-Twitter-user-status.html">My Twitter</a></li>
<li><a href="http://github.com/jdp/twitterlibphp">TwitterLibPHP</a></li>
</ul>
<h2>Parte 3: Usando OAuth para acessar a API do Twitter</h2>
<p>Antes de mais nada, vamos explicar o que diabos é <a title="Site do OAuth" href="http://oauth.net/">OAuth</a>. Mas não vá imaginando grandes coisas. O foco principal não é detalhar e esmiuçar o <a title="Site do OAuth" href="http://oauth.net/">OAuth</a>, e sim usa-lo para acessar a API do <a title="Twitter" href="http://www.twitter.com">Twitter</a>).</p>
<h3>OAuth</h3>
<p>Basicamente, OAuth (Open Authorization) é um padrão aberto que permite que os usuários compartilhem seus dados entre sites, sem a necessidade usar seu usuário e senha. Ele se baseia no uso de tokens, que transitam entre os sites, permitindo acesso a recursos especificos por um determinado tempo.</p>
<h3>Gerando os tokens (a.k.a. pedindo pro Twitter liberar o acesso)</h3>
<p>Primeiramente, vamos gerar os tokens necessários para acessar a API (ou você achou que aquela abominação de colocar o usuário e senha do artigo anterior ia ser definitiva?). Para isso, acesse o <a href="http://dev.twitter.com/">Twitter Developers</a> e clique em &#8220;Register an app&#8221;.</p>
<p>Será solicitado seu usuário e senha e aparecerá a tela para Registrar uma nova aplicação. Neste formulário, para o nosso uso, é importante que seja selecionado em Application Type a opção &#8220;Browser&#8221; (dãh) e em Default Access Type, a opção &#8220;Read &amp; Write&#8221; (no nosso exemplo, vamos enviar e receber tweets). Preencha o resto dos campos com os dados da sua aplicação, mas não precisa se preocupar se a Callback URL é valida (lembrando, para o nosso exemplo em especifico).</p>
<p>Feito o cadastro, a página seguinte tem 2 informações necessárias para nosso exemplo: &#8220;Consumer key&#8221; e &#8220;Consumer secret&#8221;.</p>
<p>No menu a direita, no link &#8220;My Access Token&#8221;, tem as duas últimas informações necessárias para continuarmos: &#8220;Access Token (oauth_token)&#8221; e &#8220;Access Token Secret (oauth_token_secret)&#8221;.</p>
<p>Aqui cabe uma explicação.</p>
<p>Nossa aplicação é simples e visa o simples acesso aos nossos próprios tweets ou tweets de nossa aplicação. Justamente por essa simplicidade que não vamos ver como obter o Access Token e o Access Token Secret remotamente (não neste artigo, quem sabe mais adiante). Aplicações tipo <a href="http://www.twitpic.com">TwitPic</a> e o <a href="http://www.twitcam.com">TwitCam</a> fazem uso desses tokens e os recuperam remotamente (Lembra? Allow/Deny?) evitando de digitar usuários e senha em aplicações de terceiros.</p>
<p>Bom, depois da explicação, vamos continuar a brincadeira. Já estamos em posse de tudo que precisamos para colocar as mãos em código (estavam ansiosos não?), então pra que ficar esperando, let&#8217;s go!</p>
<h3>Mãos a obra</h3>
<p>A partir de agora é jogo rápido, codificar é sempre mais fácil do que falar (digitar no caso, eu acho).</p>
<p>Eu não vejo porque de reinventar a roda, já existem várias bibliotecas que fazem o trabalho pesado, eu vou usar para o nosso exemplo, uma feita por <a href="http://abrah.am/">Abraham Williams</a>, chamada <a href="http://github.com/abraham/twitteroauth">OAuth Twitter PHP</a>, que faz muito bem o que se propõem, é de fácil uso, e foi uma das primeiras que eu achei (just kidding :D).</p>
<p>Faça o <a href="http://github.com/abraham/twitteroauth/downloads">download</a> da versão mais recente da biblioteca (na data de criação deste artigo, era a 0.2.0-beta3) e descompacte o diretório &#8220;twitteroauth&#8221; dentro da sua aplicação.</p>
<p>Feito isso, vamos criar o script que vai fazer a conexão com a API:</p>
<pre name="code" class="php">require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret
);

$result = $connection-&gt;get(
    'account/verify_credentials',
    array()
);

if(property_exists($result, 'error')){
    echo 'Ooops. Deu erro';
} else {
    echo 'Tudo tranquilo';
}</pre>
<p>Explicando:</p>
<ul>
<li>Linha 1: Require para a biblioteca do Twitter OAuth;</li>
<li>Linha 3 a 6: Simples atribuição dos tokens a variáveis (parece ficar mais fácil de visualizar);</li>
<li>Linha 8 a 13: Criando a instância da classe TwitterOAuth usando os parâmetros levantados anteriormente;</li>
<li>Linha 15 a 18: Uso o método get da classe TwitterOAuth para recuperar os dados da conta do Twitter;</li>
<li>Linha 20 a 24: Simples verificação a verificação foi feita com sucesso.</li>
</ul>
<p>O método get tem como parâmetros o recurso e os parâmetros a ser passados para a API. Para este exemplo, usei o recurso &#8220;account/verify_credentials&#8221;, que basicamente trás informações sobre o usuário. A lista completa de recursos pode ser vista <a href="http://dev.twitter.com/doc">aqui</a>.</p>
<h3>Recuperando os tweets</h3>
<p>Partindo do pressuposto que já está tudo certo e você está autorizado na API, vamos brincar mais um pouco.<br />
No <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-1/">primeiro artigo</a> da série, mostrei como recuperar de maneiras mais simples (RSS, basicamente) os tweets do usuário. Agora que já estamos mais profissionais no assunto, vamos usar a API para recuperar esses dados. É bem simples:</p>
<pre name="code" class="php">require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret
);

$result = $connection-&gt;get(
    'statuses/user_timeline',
    array()
);

echo '&lt;ol&gt;';
foreach($result as $node){
    printf('&lt;li&gt;&lt;a href="%s"&gt;%s&lt;/a&gt;&lt;/li&gt;',
        'http://twitter.com/' . $node-&gt;user-&gt;screen_name. '/status/' . $node-&gt;id,
        $node-&gt;text
    );
}
echo '&lt;/ol&gt;';</pre>
<p>A Explicação também é simples: Eu adaptei o exemplo do primeiro post para ao invés de percorrer um XML ele percorrer o resultado da consulta à API. Com isso ele vai montar a mesma lista com os Tweets.</p>
<h3>Enviando um tweet</h3>
<p>No <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-2/">segundo artigo</a>, utilizamos cURL para acessar a API e enviar tweets, passando o usuário e senha. Isso não é legal, e é evil. Agora podemos usar o método &#8220;post&#8221; para enviar os tweets, basicamente temos que mudar o recurso e passar a mensagem como parametro:</p>
<pre name="code" class="php">require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret
);

$result = $connection-&gt;post(
    'statuses/update',
    array(
        'status' =&gt; 'Text of status here',
    )
);</pre>
<p>Rápido, fácil e indolor. Assim que as coisas devem ser!</p>
<p>Com isso você já tem uma boa base para criar aplicações no seu site, interagindo com a API do Twitter. Como complemento recomendo fortemente ler a documentação da <a href="http://dev.twitter.com/">Twitter Developers</a>, que tem muita coisa boa pra ser aproveitada.</p>
<p>Pessoal, fico por aqui, até a próxima e boa diversão!</p>
<p>Links:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/OAuth">OAuth</a>;</li>
<li><a href="http://dev.twitter.com/">Twitter Developers</a>;</li>
<li><a href="http://blog.evandavey.com/2010/02/how-to-php-oauth-twitter.html">How to PHP OAuth Twitter</a>.</li>
</ul>
<p>Créditos da imagem do &#8220;mano&#8221; twitter &#8211; <a href="http://www.twitter.com/k4v3rn4">Luciano Fontoura</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-%e2%80%93-parte-3-agora-com-oauth/feed/</wfw:commentRss>
		<slash:comments>146</slash:comments>
		</item>
		<item>
		<title>PHP: Integrando o Twitter ao seu Site &#8211; Parte 2</title>
		<link>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-2/</link>
		<comments>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-2/#comments</comments>
		<pubDate>Wed, 12 May 2010 02:22:36 +0000</pubDate>
		<dc:creator>Henrique Boaventura</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.hboaventura.com/?p=297</guid>
		<description><![CDATA[Continuando o artigo anterior, hoje vamos dar mais um passo na integração do twitter ao seu site. Neste artigo vou mostrar como podemos enviar tweets direto do seu site usando a biblioteca cURL do PHP. Se você não está familiarizado com essa biblioteca, não se preocupe, vamos dar um jeito de fazer parte da familia [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-292" title="twitter_bird" src="http://blog.hboaventura.com/wp-content/uploads/2010/04/twitter_bird.jpg" alt="" width="210" height="174" />Continuando o artigo anterior, hoje vamos dar mais um passo na integração do <a title="Home do Twitter" href="http://www.twitter.com">twitter</a> ao seu site. Neste artigo vou mostrar como podemos enviar tweets direto do seu site usando a biblioteca <a href="http://www.php.net/manual/en/book.curl.php">cURL</a> do <a href="http://www.php.net">PHP</a>.</p>
<p>Se você não está familiarizado com essa biblioteca, não se preocupe, vamos dar um jeito de fazer parte da familia :D</p>
<h2>Parte 2: Atualizando sua timeline</h2>
<p>Como diria a bruxa do desenho do Pica-Pau (lembre-se, desenho!): &#8220;E lá vamos nós!&#8221;. Para começar, uma explicação básica do que é a biblioteca cURL e seu processo de instalação.</p>
<h3>cURL</h3>
<p>cURL(Client URL Reques Library) na <a href="http://en.wikipedia.org/wiki/CURL">wikipedia</a>: &#8220;cURL é um projeto de sofware que fornece uma biblioteca e uma ferramenta de linha de comando para transferir dados usando vários protocolos&#8221;. Ele nos permite, basicamente, fazer requisições para uma URL e recuperar o resultado dessa requisição. Podemos também adicionar parâmetros a ela.</p>
<p>O PHP tem uma biblioteca para usar o CURL. A instalação é bem simples. No Ubuntu basta digitar a seguinte no terminal:</p>
<pre class="text" name="code">sudo apt-get update &amp;&amp; sudo apt-get install curl php5-curl</pre>
<p>Com isso você tem tanto a ferramenta para linha de comando quanto a biblioteca para PHP instaladas na sua máquina.</p>
<p>Um teste bem simples para ver o cURL funcionando é digitar o seguinte no terminal:</p>
<pre class="text" name="code">curl http://www.hboaventura.com</pre>
<p>O retorno vai ser o código-fonte do meu site no seu terminal. Não vou me estender muito na cURL, tem bastante conteúdo na web, just <a href="http://www.google.com/search?client=ubuntu&amp;channel=fs&amp;q=curl&amp;ie=utf-8&amp;oe=utf-8">google</a> it!</p>
<h3>Usando o php-curl para enviar tweets</h3>
<p>Com o ambiente pronto, podemos agora focar na integração com o PHP que o pacote php5-curl adiciona ao nosso server. Basicamente, para enviar um tweet, você vai precisar:</p>
<ul>
<li>seu usuário (d&#8217;oh);</li>
<li>sua senha (tinha dúvidas sobre isso ainda?);</li>
<li>a mensagem que você quer tweetar (até vou procurar no dicionário se isso já virou um verbete);</li>
</ul>
<p>Assim como no outro <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-1/">artigo</a>, a explicação é maior do que o código propriamente dito. Com esses dados a mão, o que temos que fazer é usar algumas funções do <a href="http://www.php.net/manual/en/book.curl.php">php-cURL</a> para &#8220;embuti-los&#8221; na requisição. Vamos ao que importa (código!):</p>
<pre class="php" name="code">$usuario = 'kidh0';
$senha = 'hahaNoWay!';
$mensagem = 'Wow! Meu primeiro tweet via API';

$url = 'http://twitter.com/statuses/update.xml';

$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_POST, true);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, 'status='.$mensagem);
curl_setopt($curl_handle, CURLOPT_USERPWD, $usuario.':'.$senha);
$resultado = curl_exec($curl_handle);
curl_close($curl_handle);
</pre>
<p>Explicando a coisa toda:</p>
<ul>
<li>Linhas 1 a 3: Basicamente coloquei em atributos os dados necessários para a requisição;</li>
<li>Linha 5: URL para qual é feita a requisição (envio do tweet). Note que o arquivo requisitado é um <a href="http://en.wikipedia.org/wiki/XML">XML</a>, por isso o retorno é um <a href="http://en.wikipedia.org/wiki/XML">XML</a>, mas a <a href="http://api.twitter.com">API</a> do Twitter também aceita o formato <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>, retornando, obviamente, uma string <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>;</li>
<li>Linha 7: Inicia uma nova sessão e retorna o handler cURL para ser usado com as outras funções, <a href="http://www.php.net/manual/en/function.curl-init.php">leia mais;</a>* Linha 9: Seta a requisição para ser um POST HTTP;</li>
<li>Linha 10: Ao setar para true, retornará o resultado de <a href="http://www.php.net/manual/en/function.curl-exec.php">curl_exec()</a> como uma string, se estiver false, vai jogar na tela direto;</li>
<li>Linha 11: Seta para 30 o número de segundos para esperar enquanto tenta conectar;</li>
<li>Linha 12: Adiciona um campo para o POST chamado status com o conteudo da variável $mensagem;</li>
<li>Linha 13: Seta o usuário e senha para a validação da requisição;</li>
<li> Linha 14: Atribui a variável $resultado o resultado da requisição. Vale lembrar aqui que o retorno, em caso de sucesso, vai ser um <a href="http://en.wikipedia.org/wiki/XML">XML</a> com todas os atributos do status. Em caso de erro, retornará a mensagem referente;</li>
<li>Linha 15: Fecha a conexão, mas não é necessário;</li>
</ul>
<p>Para manipular a variável $resultado (lógico, se você optou por retornar um <a href="http://en.wikipedia.org/wiki/XML">XML</a>) podemos usar nosso bom amigo <a href="http://www.php.net/manual/en/book.simplexml.php">SimpleXML</a> que foi usado no post <a href="http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-1/">anterior</a>).</p>
<p>Com isso temos uma simples mas funcional integração de envio de tweets direto do seu site para o Twitter, prático e rápido.</p>
<p>No próximo artigo (e final, at least!), vamos fazer uma classe para trabalhar com o que vimos até agora, colocando um plus a mais :D. Até o próximo artigo!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

