Форум сайта python.su
Работаю с протоколом ICQ в библиотеке Twisted.
class B(oscar.BOSConnection):
capabilities = [oscar.CAP_CHAT]
...
def connectionLost(self, reason):
print reason
...
class OA(oscar.OscarAuthenticator):
BOSClass = B
protocol.ClientCreator(reactor, OA, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.run()
[Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion.]
def connectionLost(self, reason):
print reason
reactor.stop()
Офлайн
Читай сорцы, там есть ответы на все твои вопросы, на вскидку, не проверял:
factory = protocol.ReconnectingClientFactory()
factory.protocol = lambda: oscar.OscarAuthenticator(SN, PASS, icq=icqMode)
reactor.connectTCP(host, port, factory)
Отредактировано (Фев. 5, 2012 19:57:36)
Офлайн
bwЭто не будет работать хотя бы потому, ReconnectingClientFactory реализован для клиента, и вызывается совсем другими методами.
p.s. И не надо говорить что НЕ РАБОТАЕТ, смотрим ошибку, traceback, сорцы и говорим ПОЧЕМУ не работает.
Офлайн
эм, разве не
def connectionLost(self, connector, reason):
connector.connect()
Офлайн
slav0nicconnectionLost не принимает аргумент connector )
эм, разве не
Код:
def connectionLost(self, connector, reason):
connector.connect()
про “ … реализован для клиента”, что-то не совсем понял чем это плохо %)
Отредактировано (Фев. 7, 2012 14:46:20)
Офлайн
Вот код бота:
#!/usr/bin/python
# -*- coding: windows-1251 -*-
from twisted.words.protocols import oscar
from twisted.internet import reactor, protocol
uin = "номер аськи"
passwort = "пароль"
hostport = ('login.icq.com', 5238)
class B(oscar.BOSConnection):
capabilities = [oscar.CAP_CHAT]
def initDone(self):
self.requestSelfInfo().addCallback(self.gotSelfInfo)
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("TEST!")
self.setIdleTime(0)
self.clientReady()
self.setAway()
def receiveMessage(self, user, multiparts, flags):
print "\n< From: ", user.name
print "< Message: ", unicode(multiparts[0][0], 'utf-16_be').encode('cp1251')
command = unicode(multiparts[0][0], 'utf-16_be').encode('cp1251').lower().split(' ')
PREF = "!"
if command[0] == (PREF+"comm"):
self.sendMessage(user.name, 'Ты заюзал комманду !comm')
else:
self.sendMessage(user.name, 'Низнаю такой комманды, юзай комманду !comm')
def connectionLost(self, reason):
print reason
class OA(oscar.OscarAuthenticator):
BOSClass = B
protocol.ClientCreator(reactor, OA, uin, passwort, icq=1).connectTCP(*hostport)
reactor.run()
from twisted.internet.protocol import Protocol, ReconnectingClientFactory
from sys import stdout
host = 'login.icq.com'
port = 5238
class Echo(Protocol):
def dataReceived(self, data):
stdout.write(data)
class EchoClientFactory(ReconnectingClientFactory):
def startedConnecting(self, connector):
print 'Started to connect.'
def buildProtocol(self, addr):
print 'Connected.'
print 'Resetting reconnection delay'
self.resetDelay()
return Echo()
def clientConnectionLost(self, connector, reason):
print 'Lost connection. Reason:', reason
ReconnectingClientFactory.clientConnectionLost(self, connector, reason) # Здесь мы будем коннектиться (при потере соединения) до тех пор, пока не подключимся.
def clientConnectionFailed(self, connector, reason):
print 'Connection failed. Reason:', reason
ReconnectingClientFactory.clientConnectionFailed(self, connector,
reason)
from twisted.internet import reactor
reactor.connectTCP(host, port, EchoClientFactory())
reactor.run()
Отредактировано (Фев. 7, 2012 16:54:04)
Офлайн
Проблему решил одной строчкой кода :) При срабатывании ConnectionLost создаю протокол заного через CallLater, если соединение не установлено, то вызывается ConnectionFailed который рекурсивно создаёт протокол с помощью CallLater до успешного подключения.
Отредактировано (Фев. 9, 2012 17:10:15)
Офлайн