AIM client code for Python?

Jason Scheirer jason.scheirer at
Tue Dec 16 23:56:02 CET 2008

On Dec 16, 9:54 am, Joe Strout <j... at> wrote:
> I'd like to write an AIM bot in Python.  I found and tried
> <>, but it doesn't work for me:
> Connecting...
> Traceback (most recent call last):
>    File "", line 17, in <module>
>      bot.go()
>    File "/Users/jstrout/Documents/Python-Dev/AIMbot/", line 62,  
> in go
>      self.process_loop()
>    File "/Users/jstrout/Documents/Python-Dev/AIMbot/", line 156,  
> in process_loop
>      event = self.recv_event()
>    File "/Users/jstrout/Documents/Python-Dev/AIMbot/", line 230,  
> in recv_event
>      dtemp = self._socket.recv(buflen - len(data))
> socket.error: (54, 'Connection reset by peer')
> I wrote to the author a week ago, but never got a reply.  It could be  
> as simple as changing the server addresses in, currently:
> TOC_SERV_AUTH = ("", 29999 )
> TOC_SERV = ( "", 9898 )
> ...but I don't understand AIM well enough to know the correct values  
> (and was rather hoping that I wouldn't have to).
> Does anyone know how to get Py-TOC to work, or have another Python TOC  
> implementation to suggest?
> Thanks,
> - Joe

What I did once to get a bot working was to use Pidgin, and
communicate with the instance of Pidgin over D-Bus. This has the happy
side effect of making the bot multi-protocol and handling all the
connection drop issues and the like, as well as allowing for you to
intervene in conversations.

class HookForAccount(object):
    def __init__(self, usernames=None):
        if usernames is not None:
            if isinstance(usernames, basestring):
                usernames = [usernames]
            usernames = set([x.lower() for x in usernames])
        bus = dbus.SessionBus()
        obj = bus.get_object("im.pidgin.purple.PurpleService",
        self.purple = dbus.Interface(obj,
        self.accountids = set()
        for account in self.purple.PurpleAccountsGetAllActive():
            if usernames is None or
self.purple.PurpleAccountGetUsername(account).lower() in usernames:
                print self.purple.PurpleAccountGetUsername(account)

    def got_im(self, code, screenname, message, conversation_id,

if __name__ == "__main__":
    HookForAccount(sys.argv[1:] or None)
    loop = gobject.MainLoop()

More information about the Python-list mailing list