Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2013 07:02:06

KorP
Зарегистрирован: 2012-10-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку с twisted

Всем здравствуйте. Я новичок, только пару курсов в специалисте по питону прошёл, немного теории есть, но вот с практикой совсем грустно, по этому есть пара вопросов. Есть у меня проект на 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])

Офлайн

#2 Янв. 23, 2013 09:10:45

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Помогите новичку с twisted

Офлайн

#3 Янв. 24, 2013 08:18:47

KorP
Зарегистрирован: 2012-10-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку с twisted

В общем почти получилось, осталось только саму отправку сообщения сделать. Я не знаю как правильно пнуть метод 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)

Офлайн

#4 Сен. 7, 2013 20:45:45

stilet
Зарегистрирован: 2013-09-07
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку с twisted

Если кому еще интересно. Столкнулся с аналогичной проблемой. Мне нужен ботик, который будет отправлять мне сообщения, при необходимости, и отключаться. Основная проблема заключалась в том, что модуль 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()

Офлайн

#5 Сен. 7, 2013 21:30:16

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Помогите новичку с twisted

stilet
Юзайтетэгииначевашкоднечитабеленикакмоеобращениебезпробелов

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version