Establecer/Obtener información de usuario de un servidor xmpp: python

Soy nuevo en python y estoy tratando de crear un script de prueba de python para probar diferentes acciones en mi servidor XMPP. Ya pude probar el inicio de sesión de mi usuario y ahora quiero obtener la información que el servidor está enviando (estrofa) y establecer nueva información.

He leído varias webs y no me quedo muy claro con toda esta información. La fuente principal ha sido smoothxmpp.com.

Tengo mi estrofa:

<iq type='get' to= 'chat.net'  id='id1'>
  <aa xmlns='http://myweb.com' />
</iq>

<iq type='result' to= 'chat.net'  id='id1'>
  <aa xmlns='http://myweb.com' >
    <name>My name as included in sent mails<name>
  <lang>en</lang>
    <mail>My mail as included in sent mails</mail>
  </aa>
</iq>

Quiero obtener la información y también configurar uno de los parámetros (digamos el nombre), pero no sé cómo.

class user_info(sleekxmpp.stanza.Iq):

    self.get_query()

Debo hacerlo en python. Cualquier ayuda apreciada

preguntado el 22 de mayo de 12 a las 17:05

1 Respuestas

Lo que quiere hacer es crear una clase de estrofa personalizada para su estrofa. Aquí hay uno que funcionará para el ejemplo que tiene:

from sleekxmpp import Iq
from sleekxmpp.xmlstream import ElementBase, register_stanza_plugin

class AA(ElementBase):
    name = 'aa'
    namespace = 'http://myweb.com'
    plugin_attrib = 'aa'
    interfaces = set(['name', 'lang', 'mail'])
    sub_interfaces = interfaces

register_stanza_plugin(Iq, AA)

Ok, entonces, ¿qué hace todo eso? El name campo especifica que la etiqueta raíz del objeto XML es 'aa', y namespace especifica el espacio de nombres de la etiqueta raíz; obvio hasta ahora espero.

La plugin_attrib El campo es el nombre que se puede usar para acceder a esta estrofa desde la estrofa principal. Por ejemplo, ya debería estar familiarizado con la forma en que puede utilizar iq['type'] or iq['from'] para extraer datos de una estrofa Iq. Con plugin_attrib establecido en "aa", entonces puedes usar iq['aa'] para obtener una referencia al contenido de AA.

La interfaces set es el conjunto de nombres clave que proporciona esta estrofa para extraer información, al igual que trabajar con diccionarios. Por ejemplo, una estrofa Iq tiene 'a', 'de', 'tipo', etc. en su conjunto de interfaces. Por defecto, acceder y modificar estas claves creará o modificará atributos del elemento principal de la estrofa. Entonces, en este punto, tu estrofa se comportaría así:

aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com' name='foo' />"

Ahora, para asignar claves de interfaz a subelementos en lugar de atributos, deben estar en el sub_interfaces colocar. Así que al establecer sub_interfaces = interfaces el ejemplo anterior ahora funcionaría así:

aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com'><name>foo</name></aa>"

Si necesita algo más avanzado, también puede definir métodos de la forma get_* / set_* / del_* donde * es el nombre de la interfaz que luego se usará para extraer o modificar datos.

Entonces, todos juntos, podrán hacer:

iq = Iq()
# ... set iq parameters
iq.enable('aa')  # Add an initial, empty aa element.
try:
    resp = iq.send()
    print(resp['aa']['name'])
    # ..., etc
except XMPPError:
    print('There was an error')

Además, no olvide que tenemos la sala de chat smooth@conference.jabber.org para obtener ayuda con SleekXMPP si la necesita.

contestado el 22 de mayo de 12 a las 18:05

Primero, tnx Lance por esta respuesta detallada. Realmente me ayudó a juntar ideas de toda la información que estaba leyendo. Intenté algo con su información + lo que encontré en línea y obtuve esto: 'clase OO (ElementBase): nombre = 'aa' espacio de nombres = 'miweb.com' plugin_attrib = 'aa' interfaces = set(['name', 'lang', 'mail']) sub_interfaces = interfaces def getMail(self): presente = self.xml.find('{%s}mail' %self .namespace) return presente ' No hace nada - BarbSchael

Me preguntaba si tengo que "llamar" de alguna manera a la clase de AA en mi principal. Si es así, cómo… Porque entonces probé esto: aa = AA() iq.enable('aa') try: resp = iq.send() print(resp['aa']['name] excepto XMPPError: print ('Hay un error') Y tampoco pasa nada. ¡Gracias de nuevo! Saludos, - BarbSchael

Primero, no olvide la llamada a register_stanza_plugin(Iq, AA). El ejemplo final de arriba estaría destinado a ejecutarse en el controlador de eventos para el evento session_start, después de enviar la presencia inicial y solicitar la lista. El ejemplo echo_client.py sirve como un buen punto de partida para eso. Sólo hay una pequeña corrección que debe hacerse. En lugar de iq = Iq(), debería ser iq = self.Iq(), donde self es la instancia de ClientXMPP. - lanza fuerte

Gracias Lance, con tu respuesta y algunos enlaces con scripts (escritos por ti jeje) he logrado realizar el Get/Set! Ahora estoy trabajando en escribir los métodos específicos para tener un guión más organizado para mi prueba. ¡Gracias de nuevo! - BarbSchael

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.