<?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/"
	>

<channel>
	<title>Poesía binaria</title>
	<atom:link href="http://totaki.com/poesiabinaria/feed/" rel="self" type="application/rss+xml" />
	<link>http://totaki.com/poesiabinaria</link>
	<description>Programación, Tecnología y Software Libre</description>
	<pubDate>Sat, 04 Feb 2012 08:36:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Coloreando código con GeSHi</title>
		<link>http://totaki.com/poesiabinaria/2012/02/coloreando-codigo-con-geshi/</link>
		<comments>http://totaki.com/poesiabinaria/2012/02/coloreando-codigo-con-geshi/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 08:36:48 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[cache]]></category>

		<category><![CDATA[codigo]]></category>

		<category><![CDATA[color]]></category>

		<category><![CDATA[GeSHi]]></category>

		<category><![CDATA[herramientas]]></category>

		<category><![CDATA[lineas]]></category>

		<category><![CDATA[muestra]]></category>

		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1534</guid>
		<description><![CDATA[
			
				
			
		
Cuando queremos publicar código fuente por Internet (como en esta web), debemos hacer que los usuarios se sientan bien con el código y que sea agradable de leer. Además del indentado, es de agradecer la introducción de colores, que separen palabras clave, identifiquen cadenas, funciones de biblioteca, funciones propias, números y demás elementos que encontramos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Fcoloreando-codigo-con-geshi%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Fcoloreando-codigo-con-geshi%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/geshi.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/geshi-300x223.jpg" alt="geshi" title="geshi" width="300" height="223" class="aligncenter size-medium wp-image-1535" /></a>Cuando queremos publicar código fuente por Internet (como en esta web), debemos hacer que los usuarios se sientan bien con el código y que sea agradable de leer. Además del indentado, es de agradecer la introducción de colores, que separen palabras clave, identifiquen cadenas, funciones de biblioteca, funciones propias, números y demás elementos que encontramos en un fragmento de código.</p>
<p>Por Internet, podemos encontrar una biblioteca muy útil para este propósito: <a href="http://qbnz.com/highlighter/index.php" class="extlink" target="_blank">GeSHi</a>. Vamos a intentar hacer algo sencillo con ella.</p>
<p>Para instalarla simplemente tenemos que descargarla y descomprimirla en uno de los directorios de nuestra web (no tiene por qué ser el principal), a continuación vamos a hacer un pequeño programa que mostrará el código fuente de un fichero PHP. Suponemos que geshi.php está situado en el mismo directorio que este ejemplo:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<span class="co1">// Basado en los ejemplos de la página oficial</span><br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;geshi.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$codigo</span><span class="sy0">=</span><a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="st_h">'mi_programa.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$ges</span><span class="sy0">=</span><span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$codigo</span><span class="sy0">,</span> <span class="st_h">'php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$ges</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Con este pequeño ejemplo, se mostrará de forma coloreada el código seleccionado, aunque es conveniente el uso de cachés, es decir, es una buena idea almacenar el código coloreado, es decir, el contenido que devuelve <strong>$ges->parse_code()</strong> en un archivo aparte y cargar directamente este archivo en la siguiente petición de la página. Por ejemplo:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<span class="kw1">include_once</span> <span class="st_h">'geshi.php'</span><span class="sy0">;</span> <br />
<br />
<span class="kw2">function</span> color_source_file<span class="br0">&#40;</span><span class="re0">$source_file</span><span class="sy0">,</span> <span class="re0">$language</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$source_cache</span><span class="sy0">=</span><span class="st_h">'cache/'</span><span class="sy0">.</span><a href="http://www.php.net/basename"><span class="kw3">basename</span></a><span class="br0">&#40;</span><span class="re0">$source_file</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'_'</span><span class="sy0">.</span><span class="re0">$language</span><span class="sy0">.</span><span class="st_h">'.cache'</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">@</span><a href="http://www.php.net/filemtime"><span class="kw3">filemtime</span></a><span class="br0">&#40;</span><span class="re0">$source_cache</span><span class="br0">&#41;</span><span class="sy0">&lt;</span>filemtime<span class="br0">&#40;</span><span class="re0">$source_file</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$geshi</span><span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="re0">$source_file</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$language</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$highlighted_source</span><span class="sy0">=</span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; file_put_contents<span class="br0">&#40;</span><span class="re0">$source_cache</span><span class="sy0">,</span> <span class="re0">$highlighted_source</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$highlighted_source</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">return</span> <a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="re0">$source_cache</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">$source</span> <span class="sy0">=</span> <span class="st_h">'mi_programa.php'</span><span class="sy0">;</span><br />
<br />
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> color_source_file<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Este código es capaz de guardar en un fichero el html generado por GeSHi en un archivo de caché (se guardará en un directorio llamado cache, el nombre del fichero será el mismo que el espeficado y su formato será [nombre]_[lenguaje].cache . La decisión se toma en base a las fechas de modificación de los archivos. Si el archivo de caché no existe (por eso la @ para que no devuelva fallos PHP) o su fecha de modificación es anterior a la fecha de modificación del archivo fuente, se generará un nuevo archivo de caché y se devolverá el código coloreado. Si no, se devolverá el código coloreado leyendo directamente del archivo de caché.</p>
<h4>Activar números de línea</h4>
<p>Lo podemos hacer así:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$ges</span><span class="sy0">-&gt;</span><span class="me1">enable_line_numbers</span><span class="br0">&#40;</span>GESHI_FANCY_LINE_NUMBERS<span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<!-- Easy AdSense V2.82 -->
<!-- Post[count: 2] -->
<div class="ezAdsense adsense adsense-midtext" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-8801914383539770";
/* Poesía Binaria Publi 234x60 */
google_ad_slot = "3016322508";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p>Si ponemos GESHI_FANCY_LINE_NUMBERS cada 5 líneas saldrá el número en negrita, si ponemos GESHI_NORMAL_LINE_NUMBERS no sucederá así.</p>
<h4>Resaltar líneas</h4>
<p>Para resaltar líneas, debemos crear un array con los números de línea que queremos resaltar:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$lineas</span><span class="sy0">=</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">5</span><span class="sy0">,</span><span class="nu0">6</span><span class="sy0">,</span><span class="nu0">7</span><span class="sy0">,</span><span class="nu0">43</span><span class="sy0">,</span><span class="nu0">53</span><span class="sy0">,</span><span class="nu0">54</span><span class="br0">&#41;</span></div></td></tr></tbody></table></div>
<p>Y luego escribir:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$ges</span><span class="sy0">-&gt;</span><span class="me1">hightlight_lines_extra</span><span class="br0">&#40;</span><span class="re0">$lineas</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<h4>Personalizando los estilos</h4>
<p>Para ello podemos utilizar CSS. Por defecto GeSHi personaliza el style=&#8221;" de cada etiqueta, aunque genera mucho código html que podemos ahorrar. Para ello, podemos utilizar lo siguiente:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$ges</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
file_put_contents<span class="br0">&#40;</span><span class="st_h">'codigo.css'</span><span class="sy0">,</span> <span class="re0">$ges</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Así crearemos un archivo .css que contendrá todos los estilos que puede tener un código fuente en un determinado lenguaje (en el cual hemos inicializado la clase), luego podemos incluir ese CSS ya generado en nuestro html resultante, y cambiar los colores, tipos de letra, etc.</p>
<p>GeSHi tiene muchísimas más opciones, para saber más, basta con un vistazo a la documentación oficial (en inglés) para descubrir todas las posibilidades de esta clase.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Fcoloreando-codigo-con-geshi%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/02/coloreando-codigo-con-geshi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux en &#8220;Conspiración en la Red&#8221;</title>
		<link>http://totaki.com/poesiabinaria/2012/02/linux-en-conspiracion-en-la-red/</link>
		<comments>http://totaki.com/poesiabinaria/2012/02/linux-en-conspiracion-en-la-red/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:08:57 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[antitrust]]></category>

		<category><![CDATA[bill]]></category>

		<category><![CDATA[gates]]></category>

		<category><![CDATA[gnome]]></category>

		<category><![CDATA[hackers]]></category>

		<category><![CDATA[icaza]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[mcnealy]]></category>

		<category><![CDATA[miguel]]></category>

		<category><![CDATA[robins]]></category>

		<category><![CDATA[scott]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[tim]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1481</guid>
		<description><![CDATA[
			
				
			
		

En España, se la conoce como &#8220;Hackers 3: Conspiración en la red&#8221;, aunque no tiene mucho de tercera parte; o sólo &#8220;Conspiración en la red&#8221;, en Europa también se llama &#8220;Conspiracy.com&#8221; y en EEUU, su título original es &#8220;Antitrust&#8220;. Es una de esas películas que hace varios guiños linuxeros, aunque aparezca un Tim Robins disfrazado [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Flinux-en-conspiracion-en-la-red%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Flinux-en-conspiracion-en-la-red%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust1.jpeg"><img class="aligncenter size-medium wp-image-1483" title="linux_antitrust1" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust1-300x204.jpg" alt="linux_antitrust1" width="300" height="204" /></a></p>
<p>En España, se la conoce como &#8220;Hackers 3: Conspiración en la red&#8221;, aunque no tiene mucho de tercera parte; o sólo &#8220;Conspiración en la red&#8221;, en Europa también se llama &#8220;Conspiracy.com&#8221; y en EEUU, su título original es &#8220;<a href="http://www.imdb.com/title/tt0218817/" class="extlink" target="_blank">Antitrust</a>&#8220;. Es una de esas películas que hace varios guiños linuxeros, aunque aparezca un Tim Robins disfrazado de Bill Gates.</p>
<p>En el fotograma que vemos al principio del post, podemos ver claramente un escritorio <a href="http://www.gnome.org/" class="extlink" target="_blank">Gnome</a>, con sus iconos característicos justo en el minuto 2:15; además de muchas pantallas de Gnome y mucho código HTML en los títulos de crédito podemos encontrar una terminal donde ejecutan &#8220;ps&#8221;:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust11.jpeg"><img class="aligncenter size-medium wp-image-1484" title="linux_antitrust11" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust11-300x130.jpg" alt="linux_antitrust11" width="300" height="130" /></a>En el minuto 51:42 y pocos segundos después, podemos ver en una imagen de una cámara (que sale en un tono azulado, excepto un sombrero rojo (<a href="http://www.redhat.com/" class="extlink" target="_blank">Red Hat</a>), y un minuto más tarde se ve cómo verifica los dispositivos de almacenamiento montados con mount:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust2.jpeg"><img class="aligncenter size-medium wp-image-1485" title="linux_antitrust2" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/linux_antitrust2-300x144.jpg" alt="linux_antitrust2" width="300" height="144" /></a></p>
<p>En general, la película tiene muchos guiños al software libre, como dicen en <a href="http://www.fayerwayer.com/2009/12/linux-en-peliculas-y-series-kde-lleva-la-ventaja/" class="extlink" target="_blank">FayerWayer</a>, podemos ver entre otras cosas:</p>
<ul>
<li>A <a href="http://es.wikipedia.org/wiki/Miguel_de_Icaza" class="extlink" target="_blank">Miguel de Icaza</a>, fundador del proyecto Gnome, entregando un premio a uno de los protagonistas.</li>
<li><a href="http://en.wikipedia.org/wiki/Scott_McNealy" class="extlink" target="_blank">Scott McNealy</a>, CEO de Sun en 2001, entregando otro premio.</li>
<li>y muchas cosas más.</li>
</ul>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F02%2Flinux-en-conspiracion-en-la-red%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/02/linux-en-conspiracion-en-la-red/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Publicando en Facebook como página para mantener a nuestros fans</title>
		<link>http://totaki.com/poesiabinaria/2012/01/publicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/publicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 20:15:01 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[mensajes]]></category>

		<category><![CDATA[oficial]]></category>

		<category><![CDATA[página]]></category>

		<category><![CDATA[publicar]]></category>

		<category><![CDATA[red]]></category>

		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1522</guid>
		<description><![CDATA[
			
				
			
		

Si administras una página de Facebook, esto te interesa, ya que puedes gestionar las publicaciones de forma automática, por ejemplo, si tienes muchas cosas que publicar y quieres hacerlo de manera escalonada, para no hacerlo todo seguido y mantener alerta a tus seguidores.
Para poder poner en práctica todo esto, te recomiendo leer estos artículos anteriores:

Creando [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/poesiabinaria.png"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/poesiabinaria-300x200.jpg" alt="poesiabinaria" title="poesiabinaria" width="300" height="200" class="aligncenter size-medium wp-image-1523" /></a></p>
<p>Si administras una página de Facebook, esto te interesa, ya que puedes gestionar las publicaciones de forma automática, por ejemplo, si tienes muchas cosas que publicar y quieres hacerlo de manera escalonada, para no hacerlo todo seguido y mantener alerta a tus seguidores.</p>
<p>Para poder poner en práctica todo esto, te recomiendo leer estos artículos anteriores:</p>
<ul>
<li><a href="http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/">Creando una aplicación para Facebook paso a paso</a></li>
<li><a href="http://totaki.com/poesiabinaria/2012/01/escribiendo-en-muros-desde-nuestra-aplicacion-de-facebook/">Escribiendo en muros desde nuestra aplicación de Facebook</a></li>
<li><a href="http://totaki.com/poesiabinaria/2012/01/publicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline/">Publicando mensajes en Facebook sin que el usuario esté ahora mismo en la web</a>.</li>
</ul>
<h3>Estudiando el tema</h3>
<p>El problema de administrar páginas, es que tienes que estar identificado como estas, y además, hacerlo en modo offline. Por otra parte, las páginas tienen sus administradores y éstos son los usuarios que se pueden identificar en aplicaciones.<br />
Facebook hace todo esto a través de palabras de acceso (access tokens), cuando un usuario se identifica en una aplicación se genera un token único para ese usuario y éste durará un tiempo, durante ese tiempo, la aplicación podrá realizar las acciones que el usuario le ha dado permiso para hacer. </p>
<p>En el caso de las páginas, debemos generar un access token que valga para la página en cuestión que queremos manejar. Ese access token debemos pasárselo a la llamada a la API para publicar.</p>
<h3>Obteniendo los access tokens de las páginas que administro</h3>
<p>Para ello hay que hacer la llamada a la API /me/accounts, con lo que obtendremos un listado completo de las páginas que administramos, ID de páginas (para poder realizar las publicaciones) y los access tokens necesarios para publicar en nombre de esas páginas.</p>
<!-- Easy AdSense V2.82 -->
<!-- Post[count: 4] -->
<div class="ezAdsense adsense adsense-midtext" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-8801914383539770";
/* Poesía Binaria Publi 234x60 */
google_ad_slot = "3016322508";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p>Podemos modificar el programa que teníamos para identificarnos (index.php) de la siguiente manera (<a href="http://totaki.com/poesiabinaria/2012/01/publicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline/">facebook_ext está para descarga en un post anterior</a>):</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxx'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'facebook_ext.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co1">// Definimos constantes</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NEEDED_PERMISSIONS<span class="sy0">,</span> &nbsp;<span class="st_h">'publish_stream,offline_access,manage_pages'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Definimos códigos de error</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NOT_INSTALLED<span class="sy0">,</span> &nbsp; &nbsp; &nbsp;<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NO_PERMISSIONS<span class="sy0">,</span> &nbsp; &nbsp; <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> FacebookExtended<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
try<br />
<span class="br0">&#123;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$sesion</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'Aplicación no instalada'</span><span class="sy0">,</span> NOT_INSTALLED<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Usuario: &quot;</span><span class="sy0">.</span><span class="re0">$sesion</span><span class="sy0">.</span><span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$permissions</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">askForPermissions</span><span class="br0">&#40;</span>NEEDED_PERMISSIONS<span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$permissions</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'No tengo permisos suficientes'</span><span class="sy0">,</span> NO_PERMISSIONS<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/me/accounts'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span> <br />
catch <span class="br0">&#40;</span>FacebookException <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Error de Facebook: &quot;</span><span class="sy0">.</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;: &quot;</span><span class="sy0">.</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NOT_INSTALLED<span class="sy0">:</span> <br />
&nbsp; &nbsp; &nbsp; <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">loginUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NO_PERMISSIONS<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">loginUser</span><span class="br0">&#40;</span>NEEDED_PERMISSIONS<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">case</span> MALFORMED_ARRAY<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">default</span><span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Ocurrió un error no identificado&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Con este código, pediremos permiso para administrar páginas, para uso offline y para publicar mensajes en nombre del usuario. Cuando estemos identificados, nos devolverá un array con los nombres de las páginas, los ID y los access tokens. El array dentrá la siguiente forma:</p>
<blockquote><p>Array<br />
(<br />
    [data] => Array<br />
        (<br />
            [0] => Array<br />
                (<br />
                    [name] => Nombre de página 1<br />
                    [access_token] => xxxxxxx<br />
                    [category] => Website<br />
                    [id] => 123456789<br />
                )</p>
<p>            [1] => Array<br />
                (<br />
                    [name] => Nombre de página 2<br />
                    [access_token] => xxxxxxx2<br />
                    [category] => Website<br />
                    [id] => 987654321<br />
                )<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br />
            [n] => Array<br />
                (<br />
                    [name] => Nombre de página N<br />
                    [access_token] => xxxxxxxn<br />
                    [category] => Website<br />
                    [id] => 918273645<br />
                )<br />
        )<br />
)
</p></blockquote>
<p>Se mostrarán todas las páginas que administramos. Ahora tendremos que anotar el ID de la página con la que queremos publicar y el access token para copiarlos en el código del programa encargado de publicar.</p>
<h3>Publicando como si fuéramos una página de Facebook</h3>
<p>Para hacer la publicación tenemos que hacer una llamada a /ID_de_página/feed especificando el access token con el que queremos publicar:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxx'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'facebook_ext.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> FacebookExtended<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
try<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="co1">// ID de la página que queremos editar. La podemos ver en la URL de Facebook de la página</span><br />
&nbsp; <span class="re0">$destino</span><span class="sy0">=</span><span class="nu0">189639191053576</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$access_token</span><span class="sy0">=</span><span class="st_h">'XXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$public</span><span class="sy0">=</span><span class="st_h">'Probando mensajes automáticos con el modo offline'</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$destino</span><span class="sy0">.</span><span class="st_h">'/feed'</span><span class="sy0">,</span> <span class="st_h">'post'</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'access_token'</span> <span class="sy0">=&gt;</span> <span class="re0">$access_token</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'message'</span> <span class="sy0">=&gt;</span> <span class="re0">$public</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<br />
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Ocurrió un error&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Facil, ¿no? Si trabajamos un poco con todo esto podemos conseguir automatizar los mensajes que se van a publicar en Facebook desde las páginas que gestionamos.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/publicando-en-facebook-como-pagina-para-mantener-a-nuestros-fans/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Publicando mensajes en Facebook sin que el usuario esté ahora mismo en la web [ modo offline ]</title>
		<link>http://totaki.com/poesiabinaria/2012/01/publicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/publicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 08:55:58 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Descarga disponible]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[acceso]]></category>

		<category><![CDATA[desconectado]]></category>

		<category><![CDATA[graph]]></category>

		<category><![CDATA[offline]]></category>

		<category><![CDATA[publicar]]></category>

		<category><![CDATA[red]]></category>

		<category><![CDATA[tiempo]]></category>

		<category><![CDATA[usuario]]></category>

		<category><![CDATA[vida]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1517</guid>
		<description><![CDATA[
			
				
			
		

Una de las grandes utilidades que nos da Facebook por si creamos una aplicación de escritorio, o una aplicación web que publique posts de nuestro blog automáticamente en nuestro muro, son los mensajes Offline, con este modo, no es necesario que un usuario esté identificado realmente en Facebook, aunque, debemos tener cuidado a la hora [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/enchufe.jpg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/enchufe-300x214.jpg" alt="enchufe" title="enchufe" width="300" height="214" class="aligncenter size-medium wp-image-1518" /></a></p>
<p>Una de las grandes utilidades que nos da Facebook por si creamos una aplicación de escritorio, o una aplicación web que publique posts de nuestro blog automáticamente en nuestro muro, son los mensajes Offline, con este modo, no es necesario que un usuario esté identificado realmente en Facebook, aunque, debemos tener cuidado a la hora de trabajar con la aplicación, los usuarios nos han dado permiso para publicar en su nombre contenidos que nosotros generamos, por lo que debemos evitar que se pueda acceder a la publicación de contenidos directamente. Es decir, lo que voy a mostrar ahora es un mero ejemplo de cómo se haría, aunque muestro un programa que es lo más inseguro del mundo, ya que, cualquiera que entre en la dirección web especificada podrá escribir en Facebook con nuestro ID de usuario.</p>
<h3>Creando la aplicación y practicando la publicación</h3>
<p>Para esto, hay dos posts anteriores que te recomiendo leer si no lo has hecho ya:</p>
<ul>
<li><a href="http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/">Creando una aplicación de Facebook, paso a paso</a></li>
<li><a href="http://totaki.com/poesiabinaria/2012/01/escribiendo-en-muros-desde-nuestra-aplicacion-de-facebook/">Escribiendo en muros desde nuestra aplicación de Facebook</a></li>
</ul>
<h3>Creando dos interfaces</h3>
<p>Por un lado necesitamos la interfaz que conecta con Facebook, tal y como la hemos hecho ya en el post anterior, desde aquí se pedirá permiso para poder publicar mensajes, y para poder acceder de forma offline. Este será nuestro index.php en los ejemplos (aunque podemos cambiarlo por cualquier página que destinemos a la identificación en Facebook).</p>
<p>Por otro lado, necesitamos el script que realmente va a publicar texto en Facebook, este script no debe identificarse en el sistema, sólo debe enviar la publicación (será en el ejemplo publica.php)</p>
<p>El código fuente completo podrás verlo y descargarlo al final del post.</p>
<h3>Pidiendo permiso</h3>
<p>Para escribir en Facebook con el modo offline, debemos pedir el permiso, concretamente el permiso <strong>offline_access</strong>. Con este permiso la palabra clave que nos da acceso con el usuario elegido no caducará (las claves normales, sin offline access, tienen una caducidad limitada, aunque funcionarán durante un tiempo (¿minutos?) aunque el usuario haya dejado de estar activo). </p>
<p>Para manejar los permisos de Facebook de una mejor forma, he extendido la clase Facebook con algunos métodos que nos ayudarán a la hora de pedir permisos:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
&nbsp; <span class="co4">/**<br />
&nbsp; &nbsp;*************************************************************<br />
&nbsp; &nbsp;* @file facebook_ext.php<br />
&nbsp; &nbsp;* @brief Extensión de la clase Facebook que permite manejar<br />
&nbsp; &nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;algunas opciones de forma más intuitiva.<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
&nbsp; &nbsp;* @version<br />
&nbsp; &nbsp;* @date 14 ene 2012<br />
&nbsp; &nbsp;* Historial de cambios:<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;*************************************************************/</span><br />
<br />
<span class="kw1">require</span> <span class="br0">&#40;</span><span class="st_h">'facebook.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">class</span> FacebookExtended <span class="kw2">extends</span> Facebook<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw2">private</span> <span class="re0">$permissions</span><span class="sy0">=</span><span class="kw2">false</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$config</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="re0">$config</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw2">function</span> askForPermission<span class="br0">&#40;</span><span class="re0">$ext_perm</span><span class="sy0">,</span> <span class="re0">$uid</span><span class="sy0">=</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$uid</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$uid</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">permissions</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">permissions</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$uid</span><span class="sy0">.</span><span class="st_h">'/permissions'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">permissions</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">permissions</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">permissions</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$ext_perm</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw2">function</span> askForPermissions<span class="br0">&#40;</span><span class="re0">$ext_perms</span><span class="sy0">,</span> <span class="re0">$uid</span><span class="sy0">=</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$permArray</span> <span class="sy0">=</span> <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span><span class="sy0">,</span> <span class="re0">$ext_perms</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$permissionsOk</span><span class="sy0">=</span><span class="kw2">true</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$nElems</span><span class="sy0">=</span><a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$permArray</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">&lt;</span> <span class="re0">$nElems</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$ext_perm</span><span class="sy0">=</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$permArray</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$ext_perm</span><span class="sy0">!=</span><span class="st_h">''</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Internal debug */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* echo $i.'-'.$this-&gt;askForPermission($ext_perm, $uid).&quot;&lt;br&gt;&quot;; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$permissionsOk</span><span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">askForPermission</span><span class="br0">&#40;</span><span class="re0">$ext_perm</span><span class="sy0">,</span> <span class="re0">$uid</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$permissionsOk</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$permissionsOk</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw2">function</span> loginUser<span class="br0">&#40;</span><span class="re0">$permissions</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$permissions</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$loginUrl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'scope'</span><span class="sy0">=&gt;</span><span class="re0">$permissions</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$loginUrl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Location: '</span><span class="sy0">.</span><span class="re0">$loginUrl</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Esta clase, se encargará de preguntar por los permisos que necesitamos de forma automática (en realidad fue como se explicó en el post anterior, aunque cuando tenemos que preguntar por varios permisos nuestro código puede crecer bastante).</p>
<!-- Easy AdSense V2.82 -->
<!-- Post[count: 6] -->
<div class="ezAdsense adsense adsense-midtext" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-8801914383539770";
/* Poesía Binaria Publi 234x60 */
google_ad_slot = "3016322508";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p>Ahora, para pedir permiso haremos lo sigueinte:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$permissions</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">askForPermissions</span><span class="br0">&#40;</span><span class="st_h">'publish_stream,offline_access'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$permissions</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'No tengo permisos suficientes'</span><span class="sy0">,</span> NO_PERMISSIONS<span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>La excepción podemos crearla como queramos, yo he seguido la técnica del post anterior, que podréis observar mejor con el código completo, lo que está claro es que el código no debe continuar pasado este punto, y debemos pedir los permisos necesarios. Además, a la hora de pedir los permisos, con la clase que hemos visto anteriormente, podemos hacer lo siguiente:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">loginUser</span><span class="br0">&#40;</span><span class="st_h">'publish_stream,offline_access'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Con lo que también nos ahorramos unas líneas de código.</p>
<p>También, para publicar en nombre de los usuarios debemos obtener un Access Token, es una palabra de acceso única que identifica al usuario de Facebook en nuestra aplicación y nos permite interactuar, para ver esta palabra debemos hacer:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getAccessToken</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<h3>Publicando contenido</h3>
<p>Para publicar contenido, ahora hemos creado el archivo publica.php que sólo publicará contenido en el muro, con este archivo tenemos que tener especial cuidado, ya que en este caso, cualquiera podrá publicar contenido nada más accediendo al archivo (Código fuente de publica.php):</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'Rellenar con nuestra API key'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'Rellenar con nuestra API secret'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'facebook_ext.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> FacebookExtended<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
try<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$destino</span><span class="sy0">=</span><span class="st0">&quot;gaspy&quot;</span><span class="sy0">;</span> &nbsp; &nbsp; <span class="co1">// O el nombre de usuario que queramos usar</span><br />
&nbsp; <span class="re0">$public</span><span class="sy0">=</span><span class="st_h">'Probando mensajes automáticos con el modo offline'</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$access_token</span><span class="sy0">=</span><span class="st_h">'palabra que vimos cuando nos autorizamos, muy laarga'</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$destino</span><span class="sy0">.</span><span class="st_h">'/feed'</span><span class="sy0">,</span> <span class="st_h">'post'</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'access_token'</span> <span class="sy0">=&gt;</span> <span class="re0">$access_token</span><span class="sy0">,</span> <span class="st_h">'uid'</span> <span class="sy0">=&gt;</span> <span class="re0">$destino</span><span class="sy0">,</span> <span class="st_h">'message'</span> <span class="sy0">=&gt;</span> <span class="re0">$public</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<br />
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Ocurrió un error&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Ahora, para publicar contenido, en la llamada a la API debemos especificar:</p>
<ul>
<li>uid = UID con la que queremos publicar, es decir, el usuario en nombre de quién hablamos.</li>
<li>message = Mensaje que queremos publicar</li>
<li>access_token = Palabra de acceso</li>
</ul>
<p>Es más, podemos publicar en el muro o la página de quien queramos con esta técnica, igual que hacíamos antes, pero en este caso, lo hacemos sin que tengamos que estar identificados como ese usuario.</p>
<h3>Código fuente de index.php</h3>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'Rellenar con nuestra API key'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'Rellenar con nuestra API secret'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'facebook_ext.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Definimos códigos de error</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NOT_INSTALLED<span class="sy0">,</span> &nbsp; &nbsp; &nbsp;<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NO_PERMISSIONS<span class="sy0">,</span> &nbsp; &nbsp; <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>MALFORMED_ARRAY<span class="sy0">,</span> &nbsp; <span class="nu0">90</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> FacebookExtended<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
try<br />
<span class="br0">&#123;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$sesion</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'Aplicación no instalada'</span><span class="sy0">,</span> NOT_INSTALLED<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Usuario: &quot;</span><span class="sy0">.</span><span class="re0">$sesion</span><span class="sy0">.</span><span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$permissions</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">askForPermissions</span><span class="br0">&#40;</span><span class="st_h">'publish_stream,offline_access'</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$permissions</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'No tengo permisos suficientes'</span><span class="sy0">,</span> NO_PERMISSIONS<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;No tienes que hacer nada, cierra esta ventana.&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span> <br />
catch <span class="br0">&#40;</span>FacebookException <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Error de Facebook: &quot;</span><span class="sy0">.</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;: &quot;</span><span class="sy0">.</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NOT_INSTALLED<span class="sy0">:</span> <br />
&nbsp; &nbsp; &nbsp; <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">loginUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NO_PERMISSIONS<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">loginUser</span><span class="br0">&#40;</span><span class="st_h">'publish_stream,offline_access'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">case</span> MALFORMED_ARRAY<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">default</span><span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Ocurrió un error no identificado&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Para descargar el código fuente: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/modoofflinetar.bz2'>modooffline.tar.bz2 (1.7Kb)</a><br />
Hay que incluir la API de Facebook para que funcione y sustituir $api_key y $api_sec por nuestra API Key y API secret respectivamente.</p>
<p>Foto: <a href="http://www.flickr.com/photos/39747297@N05/5229733647/" class="extlink" target="_blank">Samuel M. Livingston</a> (Flickr)</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fpublicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/publicando-mensajes-en-facebook-sin-que-el-usuario-este-ahora-mismo-en-la-web-modo-offline/feed/</wfw:commentRss>
		</item>
		<item>
		<title>KDE en Héroes</title>
		<link>http://totaki.com/poesiabinaria/2012/01/kde-en-heroes/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/kde-en-heroes/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 18:02:27 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[ali]]></category>

		<category><![CDATA[heroes]]></category>

		<category><![CDATA[kde]]></category>

		<category><![CDATA[kopete]]></category>

		<category><![CDATA[larter]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1476</guid>
		<description><![CDATA[
			
				
			
		
Una nueva entrega de software libre en películas y televisión. Esta vez podemos ver un entorno KDE y el uso de Kopete por parte de Niki Sanders, el personaje que encarna Ali Larter en Heroes:
Podemos ver este fotograma en el minuto 7 segundo 10 del primer capítulo de la serie titulado &#8220;Génesis&#8221;. Podemos ver bajo [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fkde-en-heroes%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fkde-en-heroes%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una nueva entrega de software libre en películas y televisión. Esta vez podemos ver un entorno KDE y el uso de Kopete por parte de Niki Sanders, el personaje que encarna <a href="http://www.imdb.com/name/nm0005123/" class="extlink" target="_blank">Ali Larter</a> en <a href="http://www.imdb.com/title/tt0813715/" class="extlink" target="_blank">Heroes</a>:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/kde_heroes.jpeg"><img class="aligncenter size-medium wp-image-1477" title="kde_heroes" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/kde_heroes-300x240.jpg" alt="kde_heroes" width="300" height="240" /></a>Podemos ver este fotograma en el minuto 7 segundo 10 del primer capítulo de la serie titulado &#8220;Génesis&#8221;. Podemos ver bajo el vídeo una ventana de Kopete, que veremos unos segundos más tarde con más claridad:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/kde_heroes1.jpeg"><img class="aligncenter size-medium wp-image-1478" title="kde_heroes1" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/kde_heroes1-300x240.jpg" alt="kde_heroes1" width="300" height="240" /></a></p>
<p>Descubierto en: <a href="http://linuxontv.blogspot.com/2011/10/kde-on-heroes.html" class="extlink" target="_blank">http://linuxontv.blogspot.com/2011/10/kde-on-heroes.html</a></p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fkde-en-heroes%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/kde-en-heroes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Guardando un informe en nuestros proyectos PHP</title>
		<link>http://totaki.com/poesiabinaria/2012/01/guardando-un-informe-en-nuestros-proyectos-php/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/guardando-un-informe-en-nuestros-proyectos-php/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 16:16:38 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[backtace]]></category>

		<category><![CDATA[debug]]></category>

		<category><![CDATA[depurar]]></category>

		<category><![CDATA[errores]]></category>

		<category><![CDATA[indicar]]></category>

		<category><![CDATA[informe]]></category>

		<category><![CDATA[programas]]></category>

		<category><![CDATA[texto]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1490</guid>
		<description><![CDATA[
			
				
			
		

Muchas veces, los proyectos en PHP crecen y crecen, y pueden ocurrir múltiples errores, tanto a la hora de crearlos como cuando ya están entregados al cliente final y debemos ofrecer soporte.
Por eso es importante ser rápido localizando los errores, y, siempre que la página, o el programa no haga algo como debe, debería tomar [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fguardando-un-informe-en-nuestros-proyectos-php%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fguardando-un-informe-en-nuestros-proyectos-php%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/130120125882.jpg"><img class="aligncenter size-medium wp-image-1491" title="130120125882" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/130120125882-300x294.jpg" alt="130120125882" width="300" height="294" /></a></p>
<p>Muchas veces, los proyectos en PHP crecen y crecen, y pueden ocurrir múltiples errores, tanto a la hora de crearlos como cuando ya están entregados al cliente final y debemos ofrecer soporte.</p>
<p>Por eso es importante ser rápido localizando los errores, y, siempre que la página, o el programa no haga algo como debe, debería tomar nota de qué ha pasado, cómo ha sido y de los datos involucrados con el fin de poder solventar el problema. Tengo que decir que debemos ser inteligentes con estos criterios, ya que un usuario malintencionado puede hacernos perder todo el espacio que tengamos disponible en nuestro servidor provocando errores; por ejemplo un script que funcione en Ajax y no se le hayan entregado los parámetros necesarios, puede ser útil saberlo en tiempo de desarrollo, pero no cuando el proyecto esté funcionando en la web, puede que incluso un motor de búsqueda mal entrenado se dedique a entrar en ese script y tumbarnos el programa.</p>
<p>Para hacer un informe, lo más fácil es hacerlo en un fichero de texto (podemos crear un XML sin mucho esfuerzo más, aunque va a ser algo que sólo vamos a leer nosotros y como mucho los administradores de la página, en muchos casos a los administradores no les dejaremos verlo).</p>
<p>Para esto, yo dispongo de una clase con funciones para guardar un informe de errores:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; <span class="co1">// Activa la depuración</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st_h">'__debug'</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Activa la visualización de los errores (sólo para modo desarrollo)</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st_h">'__debug_v'</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">class</span> my_logger<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw2">private</span> <span class="re0">$base_path</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co4">/** Sólo actuaremos si __debug es verdadero &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>__debug<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st_h">'__debug_file'</span><span class="sy0">,</span> <span class="st_h">'my_log.log'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&quot;__gf_dateformat_log&quot;</span><span class="sy0">,</span> <span class="st0">&quot;d/m/Y H:i&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Si ejecutamos el programa desde consola. El directorio actual es PWD</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$base_path</span><span class="sy0">=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">elseif</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'PWD'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$base_path</span><span class="sy0">=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'PWD'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$base_path</span><span class="sy0">=</span><span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp;<br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="co4">/**<br />
&nbsp;******************************************************************<br />
&nbsp;* @brief Escribir mensaje de error en pantalla<br />
&nbsp;*<br />
&nbsp;* To-do: Posibilidad de crear plantillas para este error desde el archivo de configuración<br />
&nbsp;*<br />
&nbsp;* @param $emsj &nbsp; &nbsp;Mensaje de error<br />
&nbsp;* <br />
&nbsp;* @return Nada<br />
&nbsp;*<br />
&nbsp;******************************************************************/</span><br />
&nbsp; <span class="kw2">private</span> <span class="kw2">function</span> displayerror<span class="br0">&#40;</span><span class="re0">$emsj</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="st_h">'&lt;br /&gt;&lt;span style=&quot;color: yellow;&quot;'</span><span class="sy0">.</span><a href="http://www.php.net/wordwrap"><span class="kw3">wordwrap</span></a><span class="br0">&#40;</span><span class="st_h">'DEP: '</span><span class="sy0">.</span><span class="re0">$h</span><span class="sy0">-&gt;</span><span class="me1">T</span><span class="br0">&#40;</span><span class="re0">$msj</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="nu0">70</span><span class="sy0">,</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'&lt;/span&gt;&lt;br /&gt;'</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="co4">/**<br />
&nbsp;******************************************************************<br />
&nbsp;* @brief Extrae el nombre de una función o un método de un array <br />
&nbsp;* de backtrace<br />
&nbsp;*<br />
&nbsp;* @param $bt_data &nbsp;Array de backtrace<br />
&nbsp;* @param $index &nbsp; &nbsp;Índice del array<br />
&nbsp;*<br />
&nbsp;* @return Array[3]={linea, Función o método (clase::metodo), fichero}<br />
&nbsp;*<br />
&nbsp;******************************************************************/</span><br />
&nbsp; <span class="kw2">private</span> <span class="kw2">function</span> backtrace_function <span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$bt_data</span><span class="sy0">,</span> <span class="re0">$index</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$bt_single</span><span class="sy0">=</span><span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$bt_data</span><span class="br0">&#91;</span><span class="re0">$index</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>?<span class="re0">$bt_data</span><span class="br0">&#91;</span><span class="re0">$index</span><span class="br0">&#93;</span><span class="sy0">:</span><span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$bt_single</span><span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* No data, no function */</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$function</span><span class="sy0">=</span><span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'function'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>?<span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'function'</span><span class="br0">&#93;</span><span class="sy0">:</span><span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$class</span><span class="sy0">=</span><span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>?<span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span><span class="sy0">:</span><span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$funcname</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="re0">$class</span><span class="br0">&#41;</span>?<span class="br0">&#40;</span><span class="re0">$class</span><span class="sy0">.</span><span class="st_h">'::'</span><span class="sy0">.</span><span class="re0">$function</span><span class="br0">&#41;</span><span class="sy0">:</span><span class="re0">$function</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="re0">$file</span><span class="sy0">=</span><a href="http://www.php.net/str_replace"><span class="kw3">str_replace</span></a><span class="br0">&#40;</span><span class="st_h">'path'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'file'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'line'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$funcname</span><span class="sy0">,</span> <span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$file</span><span class="sy0">.</span><span class="st_h">' ('</span><span class="sy0">.</span><span class="re0">$funcname</span><span class="sy0">.</span><span class="st_h">', '</span><span class="sy0">.</span><span class="re0">$bt_single</span><span class="br0">&#91;</span><span class="st_h">'line'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">')'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="co4">/**<br />
&nbsp;******************************************************************<br />
&nbsp;* @brief Genera un fragmento de un error complejo. A menudo, esto<br />
&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;incluye información del backtrace u otras cosas.<br />
&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;Este método debe ser llamado desde preg_replace_callback()<br />
&nbsp;*<br />
&nbsp;* @param $data Datos enviados por preg_replace_callback()<br />
&nbsp;*<br />
&nbsp;* @return En qué se tiene que convertir la cadena enviada.<br />
&nbsp;*<br />
&nbsp;******************************************************************/</span><br />
&nbsp; <span class="kw2">private</span> <span class="kw2">function</span> complexError<span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">writelog</span><span class="br0">&#40;</span><span class="st_h">'%%where%%: No se ha llamado desde preg_replace_callback(); Origen: &quot;%%origen%%&quot;'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$btrace</span><span class="sy0">=</span><a href="http://www.php.net/debug_backtrace"><span class="kw3">debug_backtrace</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st_h">'where'</span><span class="sy0">:</span> <br />
&nbsp; &nbsp; <span class="re0">$wdata</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">backtrace_function</span> <span class="br0">&#40;</span><span class="re0">$btrace</span><span class="sy0">,</span> <span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* Nivel 0: complexError; Nivel 1:preg_replace_callback(); Nivel 2: writelog; &nbsp;Nivel 3: wlog(); Nivel 4: El que queremos */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$wdata</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st_h">'origen'</span><span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="re0">$wdata</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">backtrace_function</span> <span class="br0">&#40;</span><span class="re0">$btrace</span><span class="sy0">,</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* Nivel 3: dónde llamamos a la función */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$wdata</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st_h">'-origen'</span><span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="re0">$wdata</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">backtrace_function</span> <span class="br0">&#40;</span><span class="re0">$btrace</span><span class="sy0">,</span> <span class="nu0">6</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* Nivel 3: dónde llamamos a la función */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$wdata</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st_h">'--origen'</span><span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="re0">$wdata</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">backtrace_function</span> <span class="br0">&#40;</span><span class="re0">$btrace</span><span class="sy0">,</span> <span class="nu0">7</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* Nivel 3: dónde llamamos a la función */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$wdata</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw2">default</span><span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">writelog</span><span class="br0">&#40;</span><span class="st_h">'%%where%%: No se encuentra la palabra clave: &quot;'</span><span class="sy0">.</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'&quot;'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="co4">/**<br />
&nbsp;******************************************************************<br />
&nbsp;* @brief Escribimos un mensaje en el log.<br />
&nbsp;*<br />
&nbsp;* @param $error &nbsp; &nbsp; Error a escribir<br />
&nbsp;* @param $display &nbsp; Mostrar error en pantalla (sólo si __debug_v vale true)<br />
&nbsp;*<br />
&nbsp;* @return false para usarlo como return de alguna función<br />
&nbsp;*<br />
&nbsp;******************************************************************/</span><br />
&nbsp; <span class="kw2">function</span> writelog<span class="br0">&#40;</span><span class="re0">$error</span><span class="sy0">,</span> <span class="re0">$display</span><span class="sy0">=</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>__debug<span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="re0">$error</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$errorw</span><span class="sy0">=</span><a href="http://www.php.net/preg_replace_callback"><span class="kw3">preg_replace_callback</span></a><span class="br0">&#40;</span><span class="st_h">'/%%(.*?)%%/'</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'complexError'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$error</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$log_f</span> <span class="sy0">=</span> <a href="http://www.php.net/fopen"><span class="kw3">fopen</span></a><span class="br0">&#40;</span>__debug_file<span class="sy0">,</span> <span class="st0">&quot;a+&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/fputs"><span class="kw3">fputs</span></a><span class="br0">&#40;</span><span class="re0">$log_f</span><span class="sy0">,</span> <a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span>__gf_dateformat_log<span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot; - &quot;</span><span class="sy0">.</span><span class="re0">$errorw</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/fclose"><span class="kw3">fclose</span></a><span class="br0">&#40;</span><span class="re0">$log_f</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>__debug_v<span class="br0">&#41;</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span><span class="re0">$display</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">displayerror</span><span class="br0">&#40;</span><span class="re0">$errorw</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$log</span> <span class="sy0">=</span> <span class="kw2">new</span> my_logger<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> wlog<span class="br0">&#40;</span><span class="re0">$error</span><span class="sy0">,</span> <span class="re0">$display</span><span class="sy0">=</span><span class="kw2">false</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'log'</span><span class="br0">&#93;</span><span class="sy0">-&gt;</span><span class="me1">writelog</span><span class="br0">&#40;</span><span class="re0">$error</span><span class="sy0">,</span> <span class="re0">$display</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> genera_error<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; wlog<span class="br0">&#40;</span><span class="st0">&quot;Genero un error nada más empezar y digo dónde está <span class="es6">%%</span>where<span class="es6">%%</span> llamado por <span class="es6">%%</span>origen<span class="es6">%%</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> original<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; genera_error<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
original<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Cada vez que encontramos un error, podemos llamar a wlog() para guardar el informe del error que se guardará en un archivo de texto.</p>
<p>Mientras estamos desarrollando la aplicación podemos definir __debug_v a true para visualizar algunos errores (que previamente enviaremos con wlog(&#8221;error&#8221;, true)).</p>
<p>Además, a la hora de enviar un error, disponemos de las palabras clave %%where%%, %%origen%%, %%-origen%% y %%&#8211;origen%% para identificar automáticamente en qué función se ha producido el error, desde qué línea se llama así como la función desde donde se llama a la que provoca el error, y la anterior&#8230;</p>
<p>Si utilizamos la opción para averiguar automáticamente dónde está el error (la alternativa sería escribir el nombre de la función en el texto del error) tardará un tiempo en ejecutarse, ya que estamos escrudiñando dónde se ha producido, estamos haciendo un backtrace. De hecho la función PHP que genera ese informe es <a href="http://es2.php.net/manual/es/function.debug-backtrace.php" class="extlink" target="_blank">debug_backtrace()</a> y nos resultará de gran ayuda para la depuración de nuestras aplicaciones.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fguardando-un-informe-en-nuestros-proyectos-php%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/guardando-un-informe-en-nuestros-proyectos-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Escribiendo en muros desde nuestra aplicación de Facebook</title>
		<link>http://totaki.com/poesiabinaria/2012/01/escribiendo-en-muros-desde-nuestra-aplicacion-de-facebook/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/escribiendo-en-muros-desde-nuestra-aplicacion-de-facebook/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 08:43:03 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[llamada]]></category>

		<category><![CDATA[muro]]></category>

		<category><![CDATA[paginas]]></category>

		<category><![CDATA[permisos]]></category>

		<category><![CDATA[publicar]]></category>

		<category><![CDATA[publish_stream]]></category>

		<category><![CDATA[stream_publish]]></category>

		<category><![CDATA[tablon]]></category>

		<category><![CDATA[usuarios]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1505</guid>
		<description><![CDATA[
			
				
			
		
 Uno de los usos más extendidos de las aplicaciones de Facebook es el de escribir en el propio muro o en el muro de nuestros amigos. Vamos a hacer un ejemplo de esto utilizando la Graph API de Facebook, a través de la biblioteca oficial que ellos nos dejan en GitHub.  Para empezar [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fescribiendo-en-muros-desde-nuestra-aplicacion-de-facebook%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fescribiendo-en-muros-desde-nuestra-aplicacion-de-facebook%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website3.jpeg"><img class="aligncenter size-medium wp-image-1506" title="fb_website3" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website3-300x95.jpg" alt="fb_website3" width="300" height="95" /></a> Uno de los usos más extendidos de las aplicaciones de Facebook es el de escribir en el propio muro o en el muro de nuestros amigos. Vamos a hacer un ejemplo de esto utilizando la Graph API de Facebook, a través de la biblioteca oficial que<a href="https://github.com/facebook/php-sdk/tree/master/src" class="extlink" target="_blank"> ellos nos dejan en GitHub</a>.  Para empezar a crear la aplicación os recomiendo leer <a href="http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/">este post anterior</a> donde se dice paso a paso cómo se debe crear y cómo empezar a escribir código.</p>
<h3>Pedir permiso para publicar</h3>
<p>Antes de nada, debemos pedir permiso para publicar en el muro del usuario, para pedir permiso, lo podemos hacer en el mismo momento que ejecutamos el método <em>getLoginUrl()</em> pasando como parámetro un array cuyo único elemento será &#8217;scope&#8217; y su valor serán los permisos requeridos separados por comas. Por ejemplo:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'scope'</span> <span class="sy0">=&gt;</span> <span class="st_h">'publish_stream'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>El permiso que debemos pedir para poder publicar en los muros de Facebook es <strong>stream_publish</strong>.  Por otra parte, puede que ya hayamos identificado la aplicación con anterioridad, por lo que al estar dentro del sistema no hacemos llamada a getLoginUrl(), para ello debemos comprobar los permisos de que disponemos y eso lo hacemos con una llamada a la API a /usuario/permissions:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/me/permissions'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Lo que nos devolverá un array con los permisos que dispone la aplicación, el array tendrá un elemento ['data'] que será otro array, cuyo elemento [0] contendrá otro array con los permisos:</p>
<blockquote><p>Array ( [data] => Array ( [0] => Array ( [installed] => 1, [publish_stream] =>1 ) ) )</p></blockquote>
<!-- Easy AdSense V2.82 -->
<!-- Post[count: 8] -->
<div class="ezAdsense adsense adsense-midtext" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-8801914383539770";
/* Poesía Binaria Publi 234x60 */
google_ad_slot = "3016322508";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website2.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website2-300x107.jpg" alt="fb_website2" title="fb_website2" width="300" height="107" class="aligncenter size-medium wp-image-1510" /></a></p>
<h3>Publicar un mensaje en mi muro</h3>
<p>Para publicar un mensaje en mi muro, debemos hacer una llamada a /usuario/feed y enviar por post la información referente al mensaje deseado:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/me/feed'</span><span class="sy0">,</span> <span class="st_h">'post'</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'message'</span> <span class="sy0">=&gt;</span> <span class="re0">$mensaje</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<h3>Código fuente demo</h3>
<p>En este código fuente, he integrado excepciones para controlar los posibles errores (No identificado, No tengo permisos, Facebook me ha devuelto un array incorrecto), en este caso, los errores de identificación son salvables, pero los demás no. Para probar este código, debes cambiar la $api_key y la $api_sec:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'facebook.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Definimos códigos de error</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NOT_INSTALLED<span class="sy0">,</span> &nbsp; &nbsp; &nbsp;<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>NO_PUBLISH_STREAM<span class="sy0">,</span> &nbsp;<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span>MALFORMED_ARRAY<span class="sy0">,</span> &nbsp; <span class="nu0">90</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> Facebook<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
try<br />
<span class="br0">&#123;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$sesion</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'Aplicación no instalada'</span><span class="sy0">,</span> NOT_INSTALLED<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Usuario: &quot;</span><span class="sy0">.</span><span class="re0">$sesion</span><span class="sy0">.</span><span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="co1">// Obtenemos los permisos del usuario</span><br />
&nbsp; <span class="re0">$permissions</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$sesion</span><span class="sy0">.</span><span class="st_h">'/permissions'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$permissions</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'Facebook ha devuelto un array mal formado'</span><span class="sy0">,</span> MALFORMED_ARRAY<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$permissions</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'publish_stream'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'No tengo permiso publish_stream'</span><span class="sy0">,</span> NO_PUBLISH_STREAM<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$mensaje</span><span class="sy0">=</span><span class="st_h">'Probando la publicación de mensajes en Facebook...'</span><span class="sy0">;</span><br />
&nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/189639191053576/feed'</span><span class="sy0">,</span> <span class="st_h">'post'</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'message'</span> <span class="sy0">=&gt;</span> <span class="re0">$mensaje</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NOT_INSTALLED<span class="sy0">:</span> <br />
&nbsp; &nbsp; &nbsp; <span class="re0">$login_url</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Location: '</span><span class="sy0">.</span><span class="re0">$login_url</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> NO_PUBLISH_STREAM<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$login_url</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'scope'</span><span class="sy0">=&gt;</span><span class="st_h">'publish_stream'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Location: '</span><span class="sy0">.</span><span class="re0">$login_url</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">case</span> MALFORMED_ARRAY<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">default</span><span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Ocurrió un error no identificado&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<h3>Publicando en otros muros y páginas</h3>
<p>Para publicar en el muro de otros usuarios, simplemente tenemos que sustituir la dirección de la llamada a la API donde publicamos de /me/feed a /usuario/feed donde usuario es el texto que aparece al acceder en la dirección de la página principal de Facebook de alguno de nuestros amigos (también puede ser su ID de usuario, pero ya es difícil de obtener).</p>
<p>Para publicar en páginas debemos sustituir el /usuario/feed por /id_de_pagina/feed donde el ID de la página es el número que aparece en la dirección de la página en cuestión, si por ejemplo, la URL de la página de Facebook de este blog es:https://www.facebook.com/pages/Poesía-Binaria/<strong>189639191053576</strong> ; la id de la página es la que está en negrita.</p>
<p>Sólo teniendo el permiso publish_stream ya podemos publicar con el nombre de usuario que tenemos actualmente en cualquier lado dentro de Facebook.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fescribiendo-en-muros-desde-nuestra-aplicacion-de-facebook%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/escribiendo-en-muros-desde-nuestra-aplicacion-de-facebook/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux en Alias</title>
		<link>http://totaki.com/poesiabinaria/2012/01/linux-en-alias/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/linux-en-alias/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 16:05:45 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[alias]]></category>

		<category><![CDATA[compilación]]></category>

		<category><![CDATA[consola]]></category>

		<category><![CDATA[garner]]></category>

		<category><![CDATA[gnu]]></category>

		<category><![CDATA[jeniffer]]></category>

		<category><![CDATA[kde]]></category>

		<category><![CDATA[serie]]></category>

		<category><![CDATA[television]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1467</guid>
		<description><![CDATA[
			
				
			
		
En la serie Alias, en el episodio 11 de la segunda temporada &#8220;Un Escalón Más Alto&#8221;, o &#8220;A Higher Echelon&#8221;, podemos ver este fotograma (casi en el minuto 17), en el que vemos un escritorio KDE y una terminal abierta.
Por otra parte, a lo largo del capítulo, se pueden ver varias pantallas como esta, en [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Flinux-en-alias%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Flinux-en-alias%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/alias_kde.jpeg"><img class="aligncenter size-medium wp-image-1470" title="alias_kde" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/alias_kde-300x240.jpg" alt="alias_kde" width="300" height="240" /></a>En la serie <a href="http://www.imdb.com/title/tt0285333/" class="extlink" target="_blank">Alias,</a> en el episodio 11 de la segunda temporada &#8220;Un Escalón Más Alto&#8221;, o &#8220;A Higher Echelon&#8221;, podemos ver este fotograma (casi en el minuto 17), en el que vemos un escritorio KDE y una terminal abierta.</p>
<p>Por otra parte, a lo largo del capítulo, se pueden ver varias pantallas como esta, en las que de fondo, si entornamos un poco los ojos, se está compilando con cc y con un argumento: &#8220;-D_GNU_SOURCE</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/alias_kde2.jpeg"><img class="aligncenter size-medium wp-image-1468" title="alias_kde2" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/alias_kde2-300x240.jpg" alt="alias_kde2" width="300" height="240" /></a><a href="http://www.imdb.com/title/tt0285333/"><br />
</a></p>
<p>Fuente: <a href="http://groups.google.com/group/comp.windows.x.kde/msg/3100d0f3062fac2a" class="extlink" target="_blank">http://groups.google.com/group/comp.windows.x.kde/msg/3100d0f3062fac2a</a></p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Flinux-en-alias%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/linux-en-alias/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Creando una aplicación para Facebook (paso a paso)</title>
		<link>http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 08:29:11 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[app]]></category>

		<category><![CDATA[application]]></category>

		<category><![CDATA[cambios]]></category>

		<category><![CDATA[canvas]]></category>

		<category><![CDATA[crear]]></category>

		<category><![CDATA[create]]></category>

		<category><![CDATA[enlace]]></category>

		<category><![CDATA[graph]]></category>

		<category><![CDATA[identificacion]]></category>

		<category><![CDATA[lienzo]]></category>

		<category><![CDATA[localización]]></category>

		<category><![CDATA[nombre]]></category>

		<category><![CDATA[usuario]]></category>

		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1453</guid>
		<description><![CDATA[
			
				
			
		

He decidido hacer esta guía porque Facebook anda cambiando los métodos para hacer aplicaciones y varias partes de su API. Los chicos de Facebook no paran de meter y sacar cosas y no dejan la página quieta. Después de hacer varias guías para &#8220;publicar definitivamente&#8221; en Facebook, van y cambian la forma de hacerlo.
Aunque parece [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fcreando-una-aplicacion-para-facebook-paso-a-paso%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fcreando-una-aplicacion-para-facebook-paso-a-paso%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/monitor_poesia.jpg"><img class="aligncenter size-medium wp-image-1454" title="monitor_poesia" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/monitor_poesia-300x300.jpg" alt="monitor_poesia" width="300" height="300" /></a></p>
<p>He decidido hacer esta guía porque Facebook anda cambiando los métodos para hacer aplicaciones y varias partes de su API. Los chicos de Facebook no paran de meter y sacar cosas y no dejan la página quieta. Después de hacer varias guías para &#8220;publicar definitivamente&#8221; en Facebook, van y cambian la forma de hacerlo.</p>
<p>Aunque parece que se han estabilizado, todos estos cambios han sido para llegar a la Graph API, se ha quedado bien hecha y estable, y yo creo que es posible aprender mucho de ella.</p>
<p>Aunque en esta guía empezaré desde el principio, desde que se crea la aplicación, paso a paso, ya que actualmente crear una aplicación vale para muchas cosas, no sólo para algo que resida dentro de Facebook sino para webs o clientes que funcionan fuera de Facebook e interactúan con la red social.</p>
<p>He de decir también que esta guía está hecha en Enero de 2012, por lo que si entras aquí en el futuro, puede que hayan hecho otro <em>cambios definitivo</em> más en Facebook.</p>
<h3>Primer paso: Crear la App</h3>
<p>Para ello debemos dirigirnos a <a href="https://developers.facebook.com/apps" class="extlink" target="_blank">https://developers.facebook.com/apps</a>. Éste será nuestro <strong>centro de control</strong> de aplicaciones, donde podremos ver y editar los datos de éstas. Allí encontraremos en la parte superior de la página:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_create_app.jpg"><img class="aligncenter size-medium wp-image-1455" title="facebook_create_app" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_create_app-300x61.jpg" alt="facebook_create_app" width="300" height="61" /></a></p>
<p>Pulsamos sobre <strong>Create New App</strong>, tras ello veremos un diálogo como este:</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_create_app_dialog.jpg"><img class="aligncenter size-medium wp-image-1456" title="facebook_create_app_dialog" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_create_app_dialog-300x115.jpg" alt="facebook_create_app_dialog" width="300" height="115" /></a>En el que en:</p>
<ul>
<li><strong>App Display Name</strong> debemos decir el nombre de nuestra aplicación, o si es una aplicación para identificarnos en una página, el nombre de la página. Es un nombre que la identifique.</li>
<li><strong>App Namespace</strong> es el nombre que tiene nuestra aplicación en la URL de aplicaciones de Facebook. Es decir <em>https://apps.facebook.com/AppNamespace</em> . Dependiendo del ámbito de nuestra aplicación (si es accesible a través de Facebook.com o no) rellenaremos este campo o no.</li>
</ul>
<p>Si continuamos, a veces la web de Facebook dará un error (comprobado el 7 de Enero de 2012), por lo que podemos volver a la página de las aplicaciones y continuar.</p>
<p>En la configuración de la aplicación, le damos a Edit Settings, y saldrá una pantalla así:</p>
<!-- Easy AdSense V2.82 -->
<!-- Post[count: 10] -->
<div class="ezAdsense adsense adsense-midtext" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-8801914383539770";
/* Poesía Binaria Publi 234x60 */
google_ad_slot = "3016322508";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_app_basica.jpg"><img class="aligncenter size-medium wp-image-1458" title="facebook_app_basica" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/facebook_app_basica-300x167.jpg" alt="facebook_app_basica" width="300" height="167" /></a></p>
<p>Aquí podremos rellenar el Namespace (mencionado antes), el mail de contacto y el dominio donde está alojada la aplicación (muy importante, ya que si la aplicación no está en el dominio indicado, no funcionará; además de la categoría de nuestra aplicación.</p>
<p>Por otra parte, arriba vemos la <strong>App ID</strong> y la <strong>App Secret</strong>. La primera es el identificador de nuestra aplicación, y la segunda una clave secreta que no se debe compartir con nadie para que la aplicación pueda interactuar con Facebook, algo así como el nombre de usuario y contraseña de nuestra aplicación. (Yo lo he puesto aquí, pero en realidad lo he regenerado varias veces).</p>
<p>La aplicación que crearemos servirá para enlazar una página web con Facebook y poder utilizar esa información, para eso debemos rellenar el apartado <strong>App Domain</strong> (por ejemplo minutodecaos.com), con el dominio donde estén alojadas las páginas de la aplicación, si no, la aplicación no estará autorizada y, un poco más abajo <strong>Site URL</strong> con la dirección exacta donde estará alojada nuestra aplicación.</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website.jpeg"><img class="aligncenter size-medium wp-image-1497" title="fb_website" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website-300x47.jpg" alt="fb_website" width="300" height="47" /></a></p>
<h3>Código fuente de la App</h3>
<p>Es hora de crear nuestra aplicación en PHP. Lo primero que tenemos que hacer es descargarnos los archivos de la API desde <a href="https://github.com/facebook/php-sdk/tree/master/src" class="extlink" target="_blank">esta dirección, dentro de GitHub</a>. En principio trabajaremos en la web en modo local, por lo que creamos un directorio en nuestro disco duro (proyectos/facebook/tests/ dentro de mi home) Y descomprimimos los archivos dentro del directorio de nuestro proyecto. Aunque no es estrictamente necesario, yo lo he descomprimido dentro de lib/facebook, por lo que esos archivos estarán en $HOME/proyectos/facebook/tests/lib/facebook; y creamos el siguiente index.php (que luego subiremos al servidor junto con los ficheros de biblioteca de Facebook) :</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="re0">$api_key</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxx'</span><span class="sy0">;</span><br />
<span class="re0">$api_sec</span> <span class="sy0">=</span> <span class="st_h">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="sy0">;</span><br />
<br />
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'lib/facebook/facebook.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$facebook</span> <span class="sy0">=</span> <span class="kw2">new</span> Facebook<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'appId'</span> &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$api_key</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'secret'</span> <span class="sy0">=&gt;</span> <span class="re0">$api_sec</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'cookie'</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span> <span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$sesion</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<span class="kw1">else</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;No estamos identificados en Facebook &quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$login_url</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st_h">'&lt;a href=&quot;'</span><span class="sy0">.</span><span class="re0">$login_url</span><span class="sy0">.</span><span class="st_h">'&quot;&gt;Click para identificarte&lt;/a&gt;'</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Este código nos mostrará, la primera vez que entremos: &#8220;No estamos identificados en Facebook. Click aquí para identificarte&#8221;, eso no significa que no hayamos entrado a la página de Facebook, significa que la página web no te ha identificado como usuario y de ser autorizada, por eso hacemos click en la pantalla anterior y aparecerá lo siguiente:<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website1.jpeg"><img class="aligncenter size-medium wp-image-1498" title="fb_website1" src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/01/fb_website1-300x114.jpg" alt="fb_website1" width="300" height="114" /></a></p>
<h3>Login automático</h3>
<p>Si no queremos mostrar el enlace para identificarnos en la aplicación, podemos utilizar el siguiente código:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&quot;</span><span class="sy0">;</span><br />
<span class="kw1">else</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp;<span class="re0">$login_url</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">getLoginUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Location: '</span><span class="sy0">.</span><span class="re0">$login_url</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<h3>Mostrando datos de usuario, o cogiéndolos</h3>
<p>En la parte de &#8220;Estamos identificados en Facebook&#8221;, podemos hacer:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$sesion</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Estamos identificados en Facebook&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Usuario: &quot;</span><span class="sy0">.</span><span class="re0">$sesion</span><span class="sy0">.</span><span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="re0">$userData</span> <span class="sy0">=</span> <span class="re0">$facebook</span><span class="sy0">-&gt;</span><span class="me1">api</span><span class="br0">&#40;</span><span class="st_h">'/me'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <a href="http://www.php.net/nl2br"><span class="kw3">nl2br</span></a><span class="br0">&#40;</span><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$userData</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Con estas líneas podemos ver información del usuario que está actualmente identificado en nuestra aplicación, y podremos utilizar los datos del array $userData:</p>
<ul>
<li>['name'] - Nombre completo del usuario</li>
<li>['first_name'] - Nombre</li>
<li>['last_name'] - Apellidos</li>
<li>['link'] - Enlace a la página del usuario en Facebook</li>
<li>['username'] - Nombre de usuario de Facebook</li>
<li>['about'] - Frase personal</li>
<li>['gender'] - Género</li>
<li>y mucho más que podemos ver cuando ejecutamos el ejemplo anterior</li>
</ul>
<p>Ahora en Facebook, siempre que queramos acceder a información tanto de páginas, grupos, usuarios, etc, sólo tenemos que acceder a través de la llamada a api(&#8217;/localizacion&#8217;), con la palabra especial /me, como hemos visto para el usuario actual. Esto nos puede ayudar a identificarnos en nuestra web, sin pedir usuario, ni contraseña, a través de la Graph Api.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2Fcreando-una-aplicacion-para-facebook-paso-a-paso%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/creando-una-aplicacion-para-facebook-paso-a-paso/feed/</wfw:commentRss>
		</item>
		<item>
		<title>5 Aplicaciones que me salvan día a día</title>
		<link>http://totaki.com/poesiabinaria/2012/01/5-aplicaciones-que-me-salvan-dia-a-dia/</link>
		<comments>http://totaki.com/poesiabinaria/2012/01/5-aplicaciones-que-me-salvan-dia-a-dia/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 15:23:30 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[aplicaciones]]></category>

		<category><![CDATA[bsd]]></category>

		<category><![CDATA[dia]]></category>

		<category><![CDATA[Emacs]]></category>

		<category><![CDATA[grisbi]]></category>

		<category><![CDATA[hotot]]></category>

		<category><![CDATA[keepassx]]></category>

		<category><![CDATA[keepnote]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[programas]]></category>

		<category><![CDATA[salvar]]></category>

		<category><![CDATA[vivir]]></category>

		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1493</guid>
		<description><![CDATA[
			
				
			
		
Son pequeñas aplicaciones sin las cuales no podría salir adelante día a día. Aunque a veces no las mime demasiado y no les haga mucho caso, deberían saber que son importantes para mí, para mi vida online y yo informático. He intentado establecer un orden, pero todas ellas son muy importantes, por lo que ocuparían [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2F5-aplicaciones-que-me-salvan-dia-a-dia%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2F5-aplicaciones-que-me-salvan-dia-a-dia%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Son pequeñas aplicaciones sin las cuales no podría salir adelante día a día. Aunque a veces no las mime demasiado y no les haga mucho caso, deberían saber que son importantes para mí, para mi vida online y yo informático. He intentado establecer un orden, pero todas ellas son muy importantes, por lo que ocuparían todas la primera posición:</p>
<ol>
<li>
<h3><a href="http://keepnote.org/" class="extlink" target="_blank">Keepnote</a></h3>
<p>Es un software muy completo y ligero para tomar notas, clasificarlas y buscar dentro de ellas. De todos los que he probado es el que mejor sensación me ha dejado con respecto a su facilidad de uso, velocidad y características. Disponible en Linux, Mac y Windows</li>
<li>
<h3><a href="http://www.keepassx.org/" class="extlink" target="_blank">KeepassX</a></h3>
<p>Es un gran programa para anotar nuestras contraseñas y anotaciones para cualquier tipo de identificación electrónica (webs, banca online, routers, etc). Puedes ordenar las contraseñas por categorías, asignarles iconos, buscarlas, etc. Es muy fácil de utilizar, y guarda la información cifrada para que nadie más que tú pueda verla. Disponible para Linux, Mac y Windows</li>
<li>
<h3><a href="http://www.grisbi.org/index.es.html" class="extlink" target="_blank">Grisbi</a></h3>
<p>Un software para organizar mi economía personal, saber cuánto dinero tengo en la cartera y en el banco, quién me debe y a quién le debo. Es muy completo y funciona en Linux, Mac y Windows.</li>
<li>
<h3><a href="http://www.gnu.org/software/emacs/" class="extlink" target="_blank">Emacs</a></h3>
<p>Llamadme friki, pero es mi editor de texto / IDE favorito para programar. Con multitud de opciones, automatizable, personalizable y todo a mano, aunque para aprender fue algo difícil en principio, una vez que sabes las cuatro cosas básicas, todo va sobre ruedas, y cada día me gusta más (excepto la opción deshacer, pero bueno, nadie es perfecto). Funciona en Linux, Mac, Windows, *BSD, Solaris y algunos más</li>
<li>
<h3><a href="http://hotot.org/" class="extlink" target="_blank">Hotot</a></h3>
<p>Un cliente para Twitter muy ligero, cómodo e intuitivo. Hay muchos clientes para <em>microbloguear</em>, pero con éste es con el que me siento más cómodo. Disponible para Linux, Mac, Windows y Chrome, aunque para Windows y Mac es bastante inestable aún.</li>
</ol>
<p>En algunos de estos proyectos, y en otros más intento colaborar de diferentes formas, aunque a veces no en la medida que me gustaría, por falta de tiempo, como pasa siempre:</p>
<ul>
<li>Clicks en la publicidad de sus webs oficiales</li>
<li>Perfeccionamiento de traducciones</li>
<li>Haciendo que más gente los utilice</li>
<li>Reportando bugs</li>
<li>Sugiriendo características</li>
</ul>
<p>Y vosotros, ¿cómo colaboráis con vuestros proyectos preferidos? ¿Cuáles son esos 5 programas sin los que no podríais vivir?</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F01%2F5-aplicaciones-que-me-salvan-dia-a-dia%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/01/5-aplicaciones-que-me-salvan-dia-a-dia/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

