Код:
#!/usr/bin/python
# -*- coding: cp1251 -*- 
from twisted.words.protocols import oscar 
from twisted.internet import protocol, reactor 
from urllib import quote 
import urllib2 
import re 
import MySQLdb 
import sys 
import time 
import md5
 
SN = '' 
PASS = '' 
icqMode = 1 
hostport = ('login.icq.com', 5190) 
infoMessage = "This is pyBot version 0.00001" 
too_much = "Sorry but you can send only 1 requests per 10 seconds"

class B(oscar.BOSConnection):  
   capabilities = [oscar.CAP_CHAT]  	
   
   def initDone(self):
       self.requestSelfInfo().addCallback(self.gotSelfInf  o) 
       self.requestSSI().addCallback(self.gotBuddyList)

   def gotSelfInfo(self, user):
       print user.__dict__
       self.name = user.name

   def gotBuddyList(self, l):
       print l  	
       self.activateSSI()
       self.setProfile("""Fuck on this""")
       self.setIdleTime(0)
       self.clientReady()
 	
   def receiveMessage(self, user, multiparts, flags):
       message = multiparts[0][0]  	
       if message == '!reg':    
           self.reg(user.name)  	
       if message.startswith('!weather') and self.check(user.name):    
          message, town = message.split()           
          self.sendMessage(user.name, self.weather(town), wantAck = 0, autoResponse = 0, offline = 0)    
       if message.startswith('!info') and self.check  (user.name):
           self.sendMessage(user.name, infoMessage, wantAck = 0, autoResponse = 0, offline = 0)
       if message.startswith('!md5') and self.check(user.name):
           message, md5_val = message.split()
           self.sendMessage(user.name, self.md5_conv(md5_val), wantAck = 0, autoResponse = 0, offline = 0)

   def check(self, uin):
       if (self.check_uin(uin) and self.last_req(uin)):
           return True

   def check_uin(self, uin):
       try: 
           conn = MySQLdb.connect(host= "", user = "", passwd = "", db = "")
       except MySQLdb.Error, e:
           print "Error", e  	
       try:
           cursor = conn.cursor()
           cursor.execute("""SELECT * FROM users WHERE uin='%s'""" % uin)      
           result = [row[0] for row in cursor.fetchall()]
           if not result:
               print "You not registred in service"
           else:
               return True
       except MySQLdb.Error, e:
          print "Error", e
       cursor.close()
       conn.commit()
       conn.close()

   def md5_conv(self, value):
       m = md5.new(value)
       return m.hexdigest()
 	
   def weather(self, town):
       url = 'http://pogoda.rbc.ru/search?search='
       hex_town = quote(town)
       res = urllib2.urlopen(url+hex_town).read()
       day = re.search("<p class='today'><b>(.*)</b>", res, re.M)
       if day:
           return day.group(1)
       else:
           return "Town not found"

   def last_req(self, uin): 
       try:
           conn = MySQLdb.connect(host = "", user = "", passwd = "", db = "")
       except MySQLdb.Error, e:
           print "Error", e
       try:
           cursor = conn.cursor()
           cursor.execute("""SELECT last_req FROM users WHERE uin=%s""" % uin)
           result = [row[0] for row in cursor.fetchall()]
           result = int(time.time() - result[0])
           cursor.execute("""UPDATE users SET last_req=%f WHERE uin='%s'""" % (time.time(), uin))
           if (result > 10):
               return True
           else:
               self.sendMessage(uin, too_much, wantAck = 0, autoResponse = 0, offline = 0)            
       except MySQLdb.Error, e:
           print "Error", e
           cursor.close()
           conn.commit()
           conn.close()

   def reg(self, uin):
       try:
           conn = MySQLdb.connect(host = "", user = "", passwd = "", db = "")
       except MySQLdb.Error, e:
           print "Error %d: %s" % (e.args[0], e.args[1])
           sys.exit(1)
       try:
           cursor = conn.cursor()
           cursor.execute("""SELECT * FROM users WHERE uin='%s'""" % uin)      
           result = [row[0] for row in cursor.fetchall()]
           if result:
               self.sendMessage(uin, "You already registred in this service", wantAck = 0, autoResponse = 0, offline = 0)
           else:
               cursor.execute("""INSERT INTO users (uin, last_req) VALUES ('%s', '%s')""" % (uin,time.time()))
               print "Number of rows inserted: %d" % cursor.rowcount
               cursor.close()
       except MySQLdb.Error, e:
           print "Error %d: %s" % (e.args[0], e.args[1])
           sys.exit(1)
           conn.commit()
           conn.close()
class OA(oscar.OscarAuthenticator):
   BOSClass = B  protocol.ClientCreator(reactor, OA, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.run()