Search code examples
pythonxmppgoogle-talk

How can I retrieve a Google Talk users Status Message


I'd like to be able to retrieve a users Google Talk Status Message with Python, it's really hard to find documentation on how to use some of the libraries out there.


Solution

  • I don't have anything to hand with xmpp installed, but here's some old code I had lying around that might help you. You'll want to update the USERNAME/PASSWORD to your own values for test purposes.

    Things to note: users logged in to Google Talk get a random presence string on their userid: that doesn't matter if you are trying to get the status of some other user, but if you want to write some code so want to communicate with yourself you need to distinguish the user logged in from GMail or a GTalk client from the test program. Hence the code searches through the userids.

    Also, if you read the status immediately after logging in you probably won't get anything. There's a delay in the code because it takes a little while for the status to become available.

    """Send a single GTalk message to myself"""
    
    import xmpp
    import time
    
    _SERVER = 'talk.google.com', 5223
    USERNAME = '[email protected]'
    PASSWORD = 'whatever'
    
    
    def sendMessage(tojid, text, username=USERNAME, password=PASSWORD):
        jid = xmpp.protocol.JID(username)
        client = xmpp.Client(jid.getDomain(), debug=[])
        #self.client.RegisterHandler('message', self.message_cb)
        if not client:
          print 'Connection failed!'
          return
        con = client.connect(server=_SERVER)
        print 'connected with', con
        auth = client.auth(jid.getNode(), password, 'botty')
        if not auth:
          print 'Authentication failed!'
          return
        client.RegisterHandler('message', message_cb)
        roster = client.getRoster()
        client.sendInitPresence()
        if '/' in tojid:
            tail = tojid.split('/')[-1]
            t = time.time() + 1
            while time.time() < t:
                client.Process(1)
                time.sleep(0.1)
                if [ res for res in roster.getResources(tojid) if res.startswith(tail) ]:
                    break
            for res in roster.getResources(tojid):
                if res.startswith(tail):
                    tojid = tojid.split('/', 1)[0] + '/' + res
    
        print "sending to", tojid
        id = client.send(xmpp.protocol.Message(tojid, text))
        t = time.time() + 1
        while time.time() < t:
            client.Process(1)
            time.sleep(0.1)
        print "status", roster.getStatus(tojid)
        print "show", roster.getShow(tojid)
        print "resources", roster.getResources(tojid)
        client.disconnect()
    
    def message_cb(session, message):
        print ">", message
    
    sendMessage(USERNAME + '/Talk', "This is an automatically generated gtalk message: did you get it?")