Форум сайта python.su
Всем здравствуйте. Я новичок, только пару курсов в специалисте по питону прошёл, немного теории есть, но вот с практикой совсем грустно, по этому есть пара вопросов. Есть у меня проект на php, который работает как “серверное приложение”, т.к. работа с icq/jabber на php реализована, мягко говоря, не очень, а уведомления к системе, помимо почтовых прикрутить нужно. Решено было написать некий im gateway и поднять его у себя на сервере, что бы пересылка уведомлений велась через него. В итоге имею 2 вопроса:
1. Каким образом можно реализовать передачу данных скрипту? Наверное его нужно поднимать в качестве демона, что бы он слушал определённый порт и реагировать на поступающую туда информацию. Но я в этом совсем не бум-бум, по этому даже пока не знаю в какую сторону гуглить, так что буду благодарен за советы.
2. В общем то пока самый главный вопрос - пока нчал так сказать “с конца”: отправка сообщений пользователям. Взял twisted, покрутил, поглядел пример, в итоге есть небольшой кусок кода, который отправляет нужное сообщение на нужный номер аськи, так что осталось только передать в него данные, но - пока он реагирует только на сообщение на его номер icq (т.е. работа в режиме отвечающего бота, как описано 100500 раз в гуглах), а вот как его “в ручную” заставить отправить сообщение я что то понять не могу. Где и как вызывает функция receiveMessage() для отправки сообщения и какие параметры туда передаются я, пока, понять не могу (я так подозреваю что всё это тянется из нутров самого twisted, по этому как с этим работать - я не знаю).
Прошу сильно не пинать ножками, это для меня первая практическая работа на питоне.
Для наглядности - код:
#!/usr/bin/env python
# -*- coding: utf8 -*-
try:
from twisted.words.protocols import oscar
from twisted.internet import protocol, reactor
except:
print 'Import Error!!!\n'
import os
import sys
import datetime
SN = '653470894'
PASS = '###'
hostport = ('login.icq.com', 5238)
icqMode = 1
SendTo = '163797502'
msg = 'test message'
class Bot(oscar.BOSConnection):
capabilities = [oscar.CAP_CHAT]
def initDone(self):
print "Connection (%s) to server: %s:%s\n" % (SN, hostport[0], hostport[1])
self.requestSelfInfo().addCallback(self.gotSelfInfo)
self.requestSSI().addCallback(self.gotBuddyList)
def gotSelfInfo(self, user):
self.name = user.name
def gotBuddyList(self, l):
self.activateSSI()
self.setProfile("""ICQ Gateway by KorP""")
self.setIdleTime(0)
self.clientReady()
def receiveMessage(self, user, multiparts, flags):
print datetime.datetime.now()
print user
self.sendMessage(SendTo, msg)
class BotAuth(oscar.OscarAuthenticator):
print 'Start ICQ connect\n'
print 'pid:', os.getpid()
BOSClass = Bot
if __name__ == "__main__":
try:
protocol.ClientCreator(reactor, BotAuth, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.run()
except Exception, err:
print 'Error in Main:\n',err
time.sleep(30)
os.execl(sys.executable, sys.executable, sys.argv[0])
Офлайн
В офф доках смотрели?
http://twistedmatrix.com/documents/current/api/twisted.words.protocols.oscar.html
Офлайн
В общем почти получилось, осталось только саму отправку сообщения сделать. Я не знаю как правильно пнуть метод sendMessage из класса Bot из другого метода — dataReceived класса Echo. Не подскажете как правильно его дёргать?
#!/usr/bin/env python # -*- coding: utf8 -*- try: from twisted.words.protocols import oscar from twisted.internet import protocol, reactor except: print 'Import Twisted error!' import os import datetime SN = '653470894' PASS = '####' hostport = ('login.icq.com', 5238) icqMode = 1 class Echo(protocol.Protocol): def dataReceived(self, data): print data data2 = 'blahblahblah' self.transport.write(data2) sendTo = '163797502' msg = 'dasflkjdhflasjdhfjlsak' #Отправить сообщение при помощи sendMessage(sendTo, msg) print '____________________' class Bot(oscar.BOSConnection): capabilities = [oscar.CAP_CHAT] def initDone(self): print "Connection (%s) to server: %s:%s" % (SN, hostport[0], hostport[1]) self.requestSelfInfo().addCallback(self.gotSelfInfo) self.requestSSI().addCallback(self.gotBuddyList) factory = protocol.ServerFactory() factory.protocol = Echo reactor.listenTCP(8007,factory) def gotSelfInfo(self, user): self.name = user.name def gotBuddyList(self, l): self.activateSSI() self.setProfile("""ICQ Gateway by KorP""") self.setIdleTime(0) self.clientReady() def receiveMessage(self, user, multiparts, flags): print datetime.datetime.now() print user self.sendMessage(user.name, u'<a href="http://blog.korphome.ru/torrentmonitor/">Torrent Monitor</a>') class BotAuth(oscar.OscarAuthenticator): print 'Start ICQ connect' print 'pid:', os.getpid() BOSClass = Bot if __name__ == "__main__": protocol.ClientCreator(reactor, BotAuth, SN, PASS, icq=icqMode).connectTCP(*hostport) reactor.run()
Отредактировано KorP (Янв. 24, 2013 08:20:47)
Офлайн
Если кому еще интересно. Столкнулся с аналогичной проблемой. Мне нужен ботик, который будет отправлять мне сообщения, при необходимости, и отключаться. Основная проблема заключалась в том, что модуль oscar является асинхронным, и правильно “пнуть” sendMessage никак не получалось. Почитав про twisted долго искал место где в reactor есть callback, который можно будет использовать для отправки сообщения. В результате нашел, и ботик заработал. Ваш код будет выглядеть следующим образом:
#!/usr/bin/env python
# -*- coding: utf8 -*-
try:
from twisted.words.protocols import oscar
from twisted.internet import protocol, reactor
except:
print ‘Import Twisted error!’
import os
import datetime
SN = ‘653470894’
PASS = ‘####’
hostport = ('login.icq.com', 5238)
icqMode = 1
class Echo(protocol.Protocol):
def dataReceived(self, data):
print data
data2 = ‘blahblahblah’
self.transport.write(data2)
sendTo = ‘163797502’
msg = ‘dasflkjdhflasjdhfjlsak’
#Отправить сообщение при помощи sendMessage(sendTo, msg)
print ‘____________________’
class Bot(oscar.BOSConnection):
capabilities =
def initDone(self):
print “Connection (%s) to server: %s:%s” % (SN, hostport, hostport)
self.requestSelfInfo().addCallback(self.gotSelfInfo)
self.requestSSI().addCallback(self.gotBuddyList)
factory = protocol.ServerFactory()
factory.protocol = Echo
reactor.listenTCP(8007,factory)
def gotSelfInfo(self, user):
self.name = user.name
def gotBuddyList(self, l):
self.activateSSI()
self.setProfile(“”“ICQ Gateway by KorP”“”)
self.setIdleTime(0)
self.clientReady()
self.sendICQMessage() # Добавляем вызов метода отправки моих сообщений
def sendICQMessage(self):
self.sendMessage(sendTo, msg) # Отправляем сообщение
self.sendMessage(sendTo, msg, 0, 0, 1) # Если необходимо отправлять сообщение для uin в оффлайне
def receiveMessage(self, user, multiparts, flags):
print datetime.datetime.now()
print user
self.sendMessage(user.name, u'<a href="http://blog.korphome.ru/torrentmonitor/“>Torrent Monitor</a>')
class BotAuth(oscar.OscarAuthenticator):
print ‘Start ICQ connect’
print ‘pid:’, os.getpid()
BOSClass = Bot
if __name__ == ”__main__":
protocol.ClientCreator(reactor, BotAuth, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.callLater(10, reactor.stop) # Если необходимо отключить реактор
reactor.run()
Офлайн
stilet
Юзайтетэгииначевашкоднечитабеленикакмоеобращениебезпробелов
Офлайн