Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: kekoman en 28 de Diciembre de 2009, 12:26:55 pm
-
Buenas, la mayoría de las personas que viven en España conocen la famosa red social tuenti. En el tuenti hay un chat que fue añadido hace un par de meses y que usa un servidor XMPP.
(http://lcp.s3.amazonaws.com/are16ocean%2Ff%2F07e7833088368c28c8b4914abb290c09.jpg)
En este tutorial os voy a enseñar como conectarse al chat de tuenti usando la libreria xmpphp (http://code.google.com/p/xmpphp/)
Un pequeño ejemplo:
<?php
include("xmpp.php");
$conn = new XMPPHP_XMPP('xmpp1.tuenti,com', 5222, 'username', 'password', 'xmpphp', 'tuenti.com', $printlog=False, $loglevel=LOGGING_INFO);
$conn->connect();
$conn->processUntil('session_start');
$conn->disconnect();
?>
Nos falta poner nuestro usuario y contraseña, pero el chat de tuenti usa un PLAIN METHOD para el login y por lo tanto solo debemos poner una clave que tiene la siguiente estructura:
idusuario@host?idusuario?cookietuenti
por ejemplo:
66171907@xmpp9.tuenti.com?66171907?NjYxNzE5MDc6YTdmYzdjY2Q9ZhVkYzA3ZDY5Y0QyZWFhNzJkYmQ2NDY1MTI2MTg2NjUwMA
Y todo esto codificado en base64, por lo tanto tenemos que editar la librería XMPP y en la linea 282 de XMPP.php sustituimos esto:
if ($this->password) {
$this->send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" . base64_encode("\x00" . $this->user . "\x00" . $this->password) . "</auth>");
} else {
$this->send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'/>");
}
por esto:
$this->log->log("Attempting Auth...");
$id = reset(explode(':', base64_decode($this->password)));
$coo = base64_decode('eHh4eHh4eHhAeG1wcDkudHVlbnRpLmNvbQB4eHh4eHh4eABjb29raWU');
$coo = str_ireplace('xxxxxxxx', $id, $coo);
$coo = str_ireplace('cookie', $cookie, $coo);
$coo = base64_encode($coo);
$this->send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" . $coo . "</auth>");
Ahora para iniciar sesión en el chat necesitamos el cookie sid de tuenti.com. Para no estar buscando el cookie en las opciones de nuestro navegador podemos escribir en la barra de direcciones cuando estemos en tuenti.com: javascript:alert(document.cookie); y copiamos la cookie sid sin el punto y coma y el igual y nuestro codigo quedaria asi:
<?php
include("xmpp.php");
$conn = new XMPPHP_XMPP('xmpp1.tuenti,com', 5222, NULL, 'NjI5ODUwNDU6MDRiMDRmNjBlZTZmOGNhZGQxY2MxNzU3MGFmZDM2N2Y6MTI2MTk5NjU3Mg', 'xmpphp', 'tuenti.com', $printlog=False, $loglevel=LOGGING_INFO);
$conn->connect();
$conn->processUntil('session_start');
$conn->message('66171907', 'This is a test message!');
$conn->disconnect();
?>
Para enviar un mensaje:
$conn->message('66171907', 'This is a test message!');
Mas ejemplos y descargar la libreria: http://code.google.com/p/xmpphp/
Un saludo!
-
Que bueno :O un karma + :)
-
buenisimo! + karma
-
Una pregunta, como se supoone que me registro en tuenti?
-
te tiene que invitar alguien jeje
-
te tiene que invitar alguien jeje
O.o! quien me invita JIJI "davidgg_963@hotmail.com"
-
Muy bueno kekoman, es muy curioso, te doy karma+! :)
Saludos
-
Segun he visto, los servidores son xmpp1.tuenti.com, talk.google.com, ¿Como se los servidores? ¿Como se "hace" uno? :S
-
El unico problema es que hay varios servidores xmpp1.tuenti.com, xmpp2.tuenti.com, xmpp3.tuenti.com .........! Y no funcionan todos con todos los usuarios :-[
Segun he visto, los servidores son xmpp1.tuenti.com, talk.google.com, ¿Como se los servidores? ¿Como se "hace" uno? :S
Ni idea :D Entra en esta pagina para mas informacion http://xmpp.org/software/servers.shtml
Un saludo y gracias por las karmas!
-
pues no se podria hacer algo con un for para verificar si el usuario esta registrado en ese servidor?
-
si! tienes razon. no lo habia pensado jeje
-
El chat de tuenti son varios servidores (Jabber) y una librería js que actúa de Cliente Jabber.
Un inconveniente, no se ve el nombre de los usuarios conectados, se veria la ID puesto que la id es el usuario xD
De todos modos, es un buen sistema para conectarse ;)
-
Un inconveniente, no se ve el nombre de los usuarios conectados, se veria la ID puesto que la id es el usuario xD
Menos mal que yo ya lo habia pensado jeje!
<?php
function get_info_user($id, $type='nombre') {
$ch = curl_init();
$exp = explode('@xmpp', $id);
$id = $exp[0];
curl_setopt($ch, CURLOPT_URL, 'http://m.tuenti.com/?m=profile&user_id='.$id);
curl_setopt ($ch, CURLOPT_COOKIEFILE, getcwd().'/cookie.txt');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
switch($type) {
case 'nombre':
$n = explode('<div class="h">', $html);
$n2 = reset(explode('</div>', $n[1]));
return $n2."($id)";
break;
case 'img':
$img = explode('id="profile_img" src="', $html);
$img2 = reset(explode('" alt', $n[1]));
return $img2;
break;
}
}
?>
-
Quien quiera una invitacion que me mande un MP
-
El codigo lo he mejorado mucho y ya solo con poner tu nombre de usuario de tuenti y la contraseña vale, nisiquiera hay que complicarse buscando cual es el servidor xmpp que tuenti no asigna. Enseguida voy a crear un tema nuevo publicando el codigo mejorado.
Un saludo!
-
Buenas,
¿Alguien ha conseguido conectarse y obtener la lista de usuarios conectados y enviar mensajes?
Si es así, agradecería que pasaran el código o me ayudaran, ya que no consigo hacerlo funcionar.
Gracias.
-
yo si que lo he conseguido hace unas semanas, pero el problema es que el codigo lo tengo en casa :) y ahora estoy en el trabajo. cuando llego a casa lo miro y te paso el codigo :D
-
yo si que lo he conseguido hace unas semanas, pero el problema es que el codigo lo tengo en casa :) y ahora estoy en el trabajo. cuando llego a casa lo miro y te paso el codigo :D
Muchisimas gracias, te lo agradezco mucho. ;)
-
A propósito, tu código puede obtener la lista de amigos conectados? :O
-
No es mi codigo :) XMPPHP si que puede hacerlo, de echo hize un chat que lo hacia y te lo mostraba en vivo, pero solo me faltaba dos cositas y he tirado la toalla :P
-
Ah , entiendo. Bueno pues cuando tengas tiempo ya lo compartirás :)
-
Con el siguiente codigo puedes extraer los usuarios conectados/desconectados y los mensajes :P
while(!$conn->disconnected) {
$payloads = $conn->processUntil(array('message', 'presence', 'end_stream', 'session_start'));
foreach($payloads as $event) {
$pl = $event[1];
switch($event[0]) {
case 'message':
print "---------------------------------------------------------------------------------\n";
print "Message from: {$pl['from']}\n";
if($pl['subject']) print "Subject: {$pl['subject']}\n";
print $pl['body'] . "\n";
print "---------------------------------------------------------------------------------\n";
$conn->message($pl['from'], $body="Thanks for sending me \"{$pl['body']}\".", $type=$pl['type']);
if($pl['body'] == 'quit') $conn->disconnect();
if($pl['body'] == 'break') $conn->send("</end>");
break;
case 'presence':
print "Presence: {$pl['from']} [{$pl['show']}] {$pl['status']}\n";
break;
case 'session_start':
$conn->presence($status="Cheese!");
break;
}
}
}
-
El código está muy bien, pero tengo problemas con el:
Fatal error: Cannot access protected property XMPPHP_XMPP::$disconnected in C:\AppServ\www\tuentichat\sample.php on line 5
¿A que se debe?
-
cambia la propiedad discconect de private a public en el archivo XMLStream.php
-
Sí! Era eso.
Creo que los de Tuenti han modificado alguna propiedad, ya que el código ya no funciona. :(
Estoy utilizando tu versión modificada para Tuenti Chat y este es mi código:
<?php
include("XMPPHP/XMPP.php");
$conn = new XMPPHP_XMPP(NULL, 5222, '*****', '*****', 'xmpphp', NULL, $printlog=True, $loglevel=LOGGING_INFO);
$conn->connect();
while(!$conn->disconnected) {
$payloads = $conn->processUntil(array('message', 'presence', 'end_stream', 'session_start'));
foreach($payloads as $event) {
$pl = $event[1];
switch($event[0]) {
case 'message':
print "---------------------------------------------------------------------------------\n";
print "Message from: {$pl['from']}\n";
if($pl['subject']) print "Subject: {$pl['subject']}\n";
print $pl['body'] . "\n";
print "---------------------------------------------------------------------------------\n";
$conn->message($pl['from'], $body="Thanks for sending me \"{$pl['body']}\".", $type=$pl['type']);
if($pl['body'] == 'quit') $conn->disconnect();
if($pl['body'] == 'break') $conn->send("</end>");
break;
case 'presence':
print "Presence: {$pl['from']} [{$pl['show']}] {$pl['status']}\n";
break;
case 'session_start':
$conn->presence($status="Cheese!");
break;
}
}
}
?>
Y lo único que hace es cargar una página en blanco :S
-
Buenas.
Sigue funcionando esto?
Si es así alguien seria tan amable de pasarme lo que tenga o algún ejemplo funcional, quiero realizar una página para acceder desde moviles que no tienen la aplicación de tuenti disponible y así acceder al chat.
También si sigue funcionando probare a realizar algo para pc.
Un saludo y gracias.
EDITO: Debería de haber posteado en este hilo: http://www.phperos.net/foro/index.php?topic=5676.0 perdon por el fallo.
-
K+ :D