Showing posts with label Facebook. Show all posts
Showing posts with label Facebook. Show all posts

Thursday, June 6, 2019

Mostrar algunos datos de Facebook usando jQuery

La librería jQuery posee una serie de funciones simples que facilitan la forma en que podemos acceder a los datos de un feed en forma Json. La función getJSON es uno de esos métodos simplificados donde, en principio, bastaría colocar la dirección URL a leer.
$.getJSON('URL_A_LEER', function(variable) {
// aca hacemos algo con los datos
});
Usando esa función, podríamos leer cierta información que nos da Facebook, por ejemplo, algunos datos relativos a una página web o a las entradas de Blogger tales como la cantidad de Me Gusta que tiene, las veces que fue compartida, etc.

Esos datos son accesibles en esta dirección:

http://api.ak.facebook.com/restserver.php?v=1.0&method=links.getStats&urls=URL_PAGINA&format=json

así que podemos crear un script que la lea y luego, interpretar lso datos para mostrarlos en un DIV cualquiera que agregamos ahí donde quisiéramos verlo:
<div id="FBejemplo"></div>
y lluego, debajo de eso, podríamos poner el script para leer los datos de la página donde nos encontremos:
<script>
var jsonUrl = "http://api.ak.facebook.com/restserver.php?v=1.0&method=links.getStats&urls="+location.href+"&format=json&callback=?";
$.getJSON(jsonUrl, function(data) {
// armamos la salida de esos datos
var salida = "Me Gusta: " + data[0].like_count); // la cantidad de Me Gusta de esa página
salida+ = "Comentarios: " + data[0].comment_count); // la cantidad de comentarios de Facebook
salida+ = "Compartido: " + data[0].share_count); // la cantidad de veces que fue compartida
// y la escribimos
$("#FBejemplo").html(salida);
});
</script>
Hay otros datos accesibles tales como data[0].click_count, data[0].commentsbox_count y un dato general que suma todas las interacciones: data[0].total_count

No hace falta que los datos sean de la página que estamos viendo, podrían ser de cualquier otra, por ejemplo, acá se muestra lo que devuelve Facebook cuando coloco la URL del home:

Thursday, May 16, 2019

Crear un gadget de Facebook usando Json (3)

Voy a insistir en que la forma de mostrar los datos que leemos de un feed usando Json es subjetiva y podemos hacer casi cualquier cosa, sólo hay que saber cuáles son y aprender la forma de manipularlos, armando la salida de modo personal (más información: 1, 2)

En este último ejemplo, vamos a tratar de diferenciar el contenido y mostrarlo de distinto ¿Qué contenido? Por ejemplo trataremos a las imágenes que subimos a Facebook de modo diferenciado, mostrándolas más grandes o con un formato especial ¿Cómo podríamos hacer esto? leyendo el HTML y verificando la dirección URL de esas imágenes; una posibilidad:
var externo = elHtml.indexOf("safe_image.php");
La variable externo tendrá un valor mayor o igual a cero si dentro del contenido se encuentra ese texto que indica que la imagen no la hemos subido nosotros sino que es externa, ya sea porque lo que compartimos es un enlace o un video así que, si se trata de ese tipo de entradas, armaré un DIV de un tipo; por el contrario, si no se encuentra ese texto y hay una imagen, esa imagen la hemos subido nosotros y la URL es algo así:
https://fbcdn-photos-a.akamaihd.net/......./xxxxxxx_s.jpg
Donde el _s final indica que el tamaño de la imagen es pequeño (small) y es el dato que contiene el feed; mide 130 pixeles de ancho; si cambio _s por _n vería la imagen original con su tamaño normal, lo mismo si pasaría si usara _b..

Podría usar esas pero son muy grandes así que elegiré una intermedia y cambiare _s por _a que me dará una imagen de 180 pixeles de ancho.

¿Cómo haría eso? Por ejemplo, de este modo:
laImagen = laImagen.replace("_s.jpg","_a.jpg")
No son las únicas alternativas; _t es una miniatura de 75 pixeles, _o nos devuelve una imagen de 540 pixeles y _q o _x también tienen 180 pixeles ¿Por qué? No sé. Habrá que preguntarles a ellos.

Ahora que tengo todos los pedazos y un lio bárbaro en al cabeza, me dedico a armar la función y ver qué sale:
<,script type='text/javascript'>,
//<,![CDATA[

function extraer_imagen(htmltag) {
var s, a, b, c, d;
var imagen = "";
s = htmltag;
a = s.indexOf("<img");
b = s.indexOf("src=\"",a);
c = s.indexOf("\"",b+5);
d = s.substr(b+5,c-b-5);
if((a!=-1)&&(b!=-1)&&(c!=-1)&&(d!="")) {
imagen = d;
}
return imagen;
}

function feedFacebook(json) {
var entry, mensaje, enlace, elResumen, elHtml, externo, laImagen;
var salida = "";
for (var i = 0; i < json.responseData.feed.entries.length; i++) {
entry = json.responseData.feed.entries[i];

// los datos del feed
mensaje = entry.title;
enlace = entry.link;
elResumen = entry.contentSnippet;
elHtml = entry.content;

// los datos que verifico
externo = elHtml.indexOf("safe_image.php");
laImagen = extraer_imagen(elHtml);

// y voy armando la salida
salida += "<div class='cadaitem'>";

if(externo!=-1) {

// enlaces
salida += "<div class='titulo'><a href='" + enlace + "' target='_blank' >" + mensaje + "</a></div>";
salida += "<div class='contenido enlace'>";
salida += "<img src='" + laImagen + "'/>";
salida += "<p>" + elResumen + "</p>";
salida += "</div>";
salida += "<div class='clear'></div>";

} else {

// imágenes
salida += "<div class='contenido imagen'>";
if(laImagen) {
laImagen = laImagen.replace("_s.jpg","_a.jpg");
salida += "<a href='" + enlace + "' target='_blank'><img src='" + laImagen + "'/></a>";
if(mensaje) { salida += "<span>" + mensaje + "</span>"; }
if(elResumen) { salida += "<span>" + elResumen + "</span>"; }

}
salida += "</div>";

}
salida += "</div>";

}
document.getElementById('divFACEpage').innerHTML=salida;
}

//]]>,
<,/script>,
El resto es un poco de CSS:
<,style>,
#divFACEpage {
margin: 0 auto;
width: 250px;
}
.cadaitem {
background-color: #FFF;
font-family: Tahoma;
font-size: 13px;
margin-bottom: 5px;
}
.cadaitem .clear {
clear:both;
padding:10px;
}
.cadaitem .contenido.enlace {
width:250px;
}
.cadaitem .titulo {
overflow: hidden;
padding: 10px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
word-wrap: normal;
}
.cadaitem .titulo a {
color:DeepSkyBlue;
font-weight:bold;
}
.cadaitem .contenido.enlace img {
float: left;
max-width: 100px;
padding: 0 10px;
}
.cadaitem .contenido.enlace p {
color: #666;
float: right;
font-size: 11px;
overflow: hidden;
padding-right: 10px;
width: 120px;
word-wrap: break-word;
}
.cadaitem .contenido.imagen {
position:relative;
}
.cadaitem .contenido.imagen img {
display: block;
margin: 0 auto;
padding: 20px 0;
}
.cadaitem .contenido.imagen:hover span {
display: block;
}
.cadaitem .contenido.imagen span {
background-color: rgba(0, 0, 0, 0.5);
border-radius: 10px;
color: #FFF;
display: none;
font-size: 11px;
margin: 0 20px;
padding: 10px;
position: absolute;
text-align: center;
top:30%;
width: 200px;
}
<,/style>,

Wednesday, May 15, 2019

Crear un gadget de Facebook usando Json (2)

En la primera parte hablaba de crear un gadget a partir de los datos de un feed de Facebook pero ¿cómo se diseña el gadget? Tal como se diseña un post, usando HTML y haciendo que sea la función el que escriba esos códigos. Para esto no hay un solo método, hay muchas formas; yo uso siempre el mismo, creo una variable de texto, voy "sumando" las distintas etiquetas y cuando termina el bucle, la "escribo" en el DIV.

El resto, es subjetivo; me imagino un gadget que colocaré en la sidebar así que será "angosto" y estaría más interesado en mostrar imágenes que en mostrar textos así que, para complicarme la vida, debería "detectar" esas imágenes y separarlas de los textos. Usaré sólo cuatro datos: entry.title, entry.link, entry.content y entry.contentSnippet; no me meteré con la fecha que requiere códigos más largos para formatearlas de manera "razonable" y quisiera mantener todo lo más simple posible para concentrarme en lo que realmente me parece importante aunque, como dije, todo esto es absolutamente subjetivo y esa es justamente lo verdaderamente interesante de Json, que con los mismos datos, podemos armar cosas completamente distintas.

¿Por que no pensar primero el modelo que quisiera que se viera escribiendo el HTML tal como haría en una entrada? Un ejemplo:
<div class='cadaitem'>
<div class='titulo'>
<a href='URL_entrada' target='_blank' > ... el texto del mensaje ... </a>
</div>
<div class='contenido'>
<img src='URL_imagen'/>
<p> ... aquí pondría el resumen ... <p>
</div>
</div>
Bastaría establecer las reglas de estilo CSS para cada cosa u ordenarlas de cualquier otro modo y luego, usar eso en la función, agregando los datos correspondientes:
salida += "<div class='cadaitem'>";
salida += "<div class='titulo'>";
salida += "<a href='"+enlace+"' target='_blank' >"+mensaje+"</a>";
salida += "</div>";
salida += "<div class='contenido'>";
salida += "<img src='"+laImagen+"'/>";
salida += "<p>"+elResumen+"<p>";
salida += "</div>";
salida += "</div>";
Pero ... me falta laImagen; debo "encontrarla" dentro del contenido (entry.content) y para eso, usaré una función extra que es la misma que usamos en Blogger para detectar al primera imagen de las entradas:
function extraer_imagen(htmltag) {
var s, a, b, c, d;
var imagen = "";
s = htmltag;
a = s.indexOf("<img");
b = s.indexOf("src=\"",a);
c = s.indexOf("\"",b+5);
d = s.substr(b+5,c-b-5);
if((a!=-1)&&(b!=-1)&&(c!=-1)&&(d!="")) {
imagen = d;
}
return imagen;
}
Así que en mi función, la variable laImagen será:
var elHtml = entry.content;
var laImagen = extraer_imagen(elHtml);
o directamente:
laImagen = extraer_imagen(entry.content);

Monday, May 13, 2019

Crear un gadget de Facebook usando Json (1)

Muchas veces hablamos de los feeds de un sitio web ¿que son? En realidad, nada especial, son, como todo lo que vemos en internet, archivos de alguna clase, una serie de "números" ordenados de alguna forma que los navegadores interpretan y nos muestran de acuerdo a ciertas reglas universales; el resultado, será una imagen, un video, un texto o ... un feed.

Ese "orden" en que está escrito, define su contenido. Un feed es un archivo de tipo XML, es decir, un texto con etiquetas especiales que es generado por el servidor (Blogger, YouTube, Twitter o cualquier otro) y que contiene los datos de nuestro blog o de un sitio determinado; bien podría decirse que es un "resumen" del contenido de un sitio que nos permite acceder a esa información y visualizarla directamente en el navegador o, lo que es más común, utilizando algún software especial.

Si colocamos la URL de un feed en la mayoría de los navegadores, estos lo interpretarán y mostrarán su contenido como si fuera una página web minimizada. Chrome, por el contrario, mostrará su código, es decir, el texto del archivo cosa que también podemos ver en todos los otros, si les solicitamos ver el código fuente de la pagina.

Si hacemos eso, veremos una serie de etiquetas que dependerán del formato de ese archivo de feeds ya que hay varios sistemas (Atom, RSS2) algunos más simples y otros mucho más complejos pero, lo básico es siempre similar. Cada entrada se encuentra contenida entre las etiquetas <item> </item> o <entry> </entry> dentro de la cual hay otras con el título, la fecha, el autor, etc.
<entry>
<title> xxxxxxx </title>
<link> xxxxxxx </link>
<published> xxxxxxx </published>
<content> xxxxxxx </content>
</entry>
Todo es teoria ya que, en realidad, si bien hay una cierta normalización de esos datos, cada sistema puede (y lo hace) agregar etiquetas o atributos especiales; por eso es que muchos de ellos incluyen documentación extra donde nos dicen cuáles son los datos y cómo debemos interpretarlos. Para eso, para interpretarlos, se usan diferentes lenguajes; en Blogger, las cosas no son tan fáciles ya que sólo podemos usar JavaScript que tiene sus limitaciones y es ahí donde entra a jugar el misterioso Json que es una palabrita que vemos constantemente y a través de la cual se arman la gran mayoría de los gadgets que utilizamos.

En este caso, podríamos decir que Json que no es otra cosa que un ese mismo archivo de feeds, "re-armado" con un formato diferente adaptado, justamente, para que podamos leerlo con JavaScript. Cuando solicitamos que se cargue un archivo de feeds en formato Json, lo que obenemos es una serie de variables ordenadas con el contenido y leerlas es fácil, el problema está en "saber" cuales son esas variables ya que pueden ser muy variadas.

Una herramienta que ayuda en este asunto es el llamado Google Ajax Feed API ya que nos simplifica la tarea, interpretando los datos de los distintos feeds y enviándonos datos que tienen siempre la misma estructura por lo tanto, podemos leer cualquier feed y mostrarlo como se nos de la gana.

Vamos a ver un ejemplo concreto, intentaremos mostrar nuestra página de Facebook ya que esta, dispone de un feed ¿cuál es? algo como esto:
https://www.facebook.com/feeds/page.php?format=atom10&id=XXXXXXXXXX
donde XXXXXXXXXX es el ID de nuestra página que es el que nos muestra el navegador cuando entramos en ella:
https://www.facebook.com/pages/Vagabundia/215401628483231
https://www.facebook.com/pages/Gem-BLOG/395197195477
¿No tiene un ID y sólo tiene un nombre? busquen el emlace a Notificaciones que se ve en la parte superior y copien el enlace; el ID son los números que siguen a id=:
http://www.facebook.com/Infinitos.Magazine
http://www.facebook.com/notifications?id=151205601565278
Vamos al grano. Necesitamos el script que tiene dos partes, la llamada al API de Google y una función que interpretará y mostrará los datos en un DIV con cierto ID. La función la ponemos en cualquier parte, por ejemplo, antes de </head>:
<,script type='text/javascript'>,
//<,![CDATA[
function feedFacebook(json) {
var entry, mensaje, enlace, elResumen;
var salida = "";
for (var i = 0; i < json.responseData.feed.entries.length; i++) {
entry = json.responseData.feed.entries[i];
var mensaje = entry.title;
var enlace = entry.link;
var elResumen = entry.contentSnippet;
salida += "<p>" ;
salida += mensaje + "<br/>";
salida += enlace + "<br/>";
salida += elResumen + "<br/>";
salida += "</p>";
}
document.getElementById('divFACEpage').innerHTML=salida;
}
//]]>,
<,/script>,
Luego, donde queramos que se muestre el resultado, un DIV vacío:
<div id="divFACEpage"></div>
Y debajo, el script que llama al API de Google:
<,script type='text/javascript'>,
//<,![CDATA[
var URLFEED = "https://www.facebook.com/feeds/page.php?format=atom10&id=XXXXXXXXXX";
var NUMFEED = 5;
var archivofeeds = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num="+NUMFEED+"&output=json&q="+encodeURIComponent(URLFEED)+"&callback=feedFacebook";
var nuevo = document.createElement('script');
nuevo.setAttribute('type', 'text/javascript');
nuevo.setAttribute('src', archivofeeds);
document.getElementsByTagName('head')[0].appendChild(nuevo);
//]]>,
<,/script>,
¿Qué hace esta última? cargar el script con el API de Google indicándole la dirección del feed (URLFEED), la cantidad de entradas que queremos leer (NUMFEED) y el nombre de la función que interpretará esos datos (callback=feedFacebook)

Justamente, es esta función lo que hará la diferencia ya que, los datos serán siempre los mismos y lo que luego variará es la forma en que los mostremos. La función es un bucle que va leyendo item por item guardándolos en una variable a la que llamamos entry; como esos datos son un array, accedemos a ellos con el nombre de la variable, un punto y el nombre del dato en si mismo. El API nos dará los siguiente datos:

entry.title es el título del item (el título de una entrada de un blog o, en este caso, el mensaje que hayamos agregado) y corresponde al contenido de la etiqueta <title>
entry.link es la dirección URL de ese item y corresponde al contenido de la etiqueta <link>
entry.content es el contenido HTML de la entrada, etiquetas <content> <summary> o <description>
entry.contentSnippet es un resumen de ese mismo contenido, en formato de texto plano, es decir, sin etiquetas HTML
entry.publishedDate es la fecha en un formato similar a este "20 May 2019 10:20:30 -0300"
entry.author es el nombre del autor y en este ejemplo no existe
entry.description es un texto adicional o subtítulo que tampoco existe
entry.categories es la lista de etiquetas que tampoco existe

En este ejemplo, simplemente guardamos algunos de esos datos en otras variables y los mostramos así nomás, uno debajo del otro; el mensaje, la URL y el resumen:

Obviamente, nada especial pero, en realidad, eso es todo lo que necesitamos; sabiendo cuales son los datos, podemos armar nuestros propios gadgets, diseñando el formato en que quisiéramos mostrarlos.

Monday, April 15, 2019

El plugin Recommendations Bar para Facebook

Recommendations bar es un nuevo plugin social de Facebook que se encuentra en estado beta es decir, podemos usarlo pero aún está en desarrollo y puede tener algún tipo de problema eventual o sufrir algún cambio en el futuro. Por ahora, aparentemente, sólo será visible para desarrolladores.

En principio, lo que hace es establecer nuevos métodos para permitir que los usuarios compartan artículos en sus perfiles.

El plugin se adosa siempre a la parte inferior página, quedado fijo a derecha o izquierda y apenas se carga, se colapsa para transformarse en un botón con el texto Me Gusta o Recomendar y un ícono extra que permite expandirlo:

Recommendations Bar para Facebook

Por defecto, veremos un enlace diciendo Social Reading is Off; si hacemos click en él, se abrirá la típica ventana de Facebook solicitando autorización para que el plugin interactue con nuestra cuenta. De ahí en más, el usuario sólo deberá hacer click en Recomendar para que la entrada sea publicada en su perfil de Facebook.

Recommendations Bar para Facebook
Recommendations Bar para Facebook

Es importante aclarar que nuestra plantilla debe incluir la etiqueta META correspondiente porque sino, no funcionará:
<meta property="og:type" content="article"/>
El plugin se agrega como cualquier otro usando código XFMBL así que debemos tener esto inmediatamente después de <body>
<div id="fb-root"></div>
<script>
//<![CDATA[
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/es_ES/all.js#xfbml=1&appId=APP_ID";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
//]]>
</script>
Con eso, ya podemos agregar la etiqueta correspondiente de modo simple:
<fb:recommendations-bar action='recommend' />
o incluyendo opciones como la URL del sitio:
<fb:recommendations-bar action='recommend' site='http://vagabundia.blogspot.com/'/>
Cuando vemos la página de los desarroladores, uno de los datos que podemos modificar es URL of the article pero, desconozco a que hace referencia y por l oque probé, no parece necesario ya que toma siempre la direccion de la página donde estemos.

Hay otros parámetros configurables:

Trigger indica la forma en que se lanzará el plugin, por defecto dice onvisible y puede seleccionare un valor (X%) o manual
Verb to display es el texto a mostrar (Recomendar o Me Gusta)
Side es left o right, la posición donde se mostrará
Domain es el dominio de nuestro blog

Tambien hablan de read_time, ref, num_recommendations y max_age que no son muy claras pero, con las que se agregan por defecto es más que suficiente para la mayoría de los sitios.

¿Y donde poner esto en la plantilla? En cualquier parte porque siempre se mostrará fijo en al parte inferior; probablemente, lo mejor es condicionarlo para que sólo funcione en las entradas individuales:
<b:if cond='data:blog.pageType == "item"'>
<fb:recommendations-bar action='recommend' site='http://vagabundia.blogspot.com/'/>
</b:if>
No es el el único plugin en modo beta, en este momento también hay otro llamado Add to timeline pero, no puedo decir nada de él porque me ha resultado confuso de entender su funcionamiento y para qué sirve