Код:
#!/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()