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




