Захотелось мне написать что-нибудь на питоне, чтобы иметь представление о языке. И задумал я изготовить джаббер-бота, который посредством гугла будет служить для переводческих целей. Собственно, далее следуют инструкции по написанию этого самого бота с использованием библиотеки xmpppy.
Для начала ставим необходимые модули (на примере FreeBSD):
# make -C /usr/ports/devel/py-simplejson install clean
# make -C /usr/ports/net-im/py-xmpppy install clean
# make -C /usr/ports/dns/py-dnspython install clean
Комментировать код сильно не буду, он простой. Вот как выглядит каталог с проектом:
$ ls translator/
gtranslate.py jabber_bot.py translator.py
Основной файл бота translator.py:
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import string, re
from gtranslate import translate
from jabber_bot import JabberBot
config = {
'jid':'your@jabber.id',
'pass':'password'
}
#Функция, обрабатывающая сообщения от пользователя
def message_handler(conn, mess):
text = mess.getBody()
user = mess.getFrom()
# направление перевода по умолчанию
langpair = 'en|ru'
#фильтруем только сообщения с непустым телом
if text:
# проверяем, указано ли направление перевода
# если нет, то оставляем значение по умолчанию
lines = text.splitlines()
regexp = re.compile('^\w{2}\|\w{2}$', re.IGNORECASE)
if regexp.match(lines[0]):
langpair = lines[0]
del lines[0]
text = string.join(lines)
reply = translate(text, langpair)
conn.send(xmpp.Message(mess.getFrom(),reply))
#запускаем бота
bot = JabberBot(config['jid'], config['pass'])
bot.register_handler('message', message_handler)
bot.start()
Класс бота jabber_bot.py, обертка для xmpp.Client:
import sys, xmpp
class JabberBot:
def __init__(self, jid, password):
jid = xmpp.JID(jid)
self.user, self.server, self.password = jid.getNode(), jid.getDomain(), password
self.connect()
self.auth()
def connect(self):
self.conn = xmpp.Client(self.server, debug = [])
conres = self.conn.connect()
if not conres:
print "Unable to connect to server %s!" % server
sys.exit(1)
if conres <> 'tls':
print "Warning: unable to estabilish secure connection - TLS failed!"
def auth(self):
authres = self.conn.auth(self.user, self.password)
if not authres:
print "Unable to authorize on %s - check login/password." % server
sys.exit(1)
if authres <> 'sasl':
print """Warning: unable to perform SASL auth os %s.
Old authentication method used!""" % server
def register_handler(self, name, handler):
self.conn.RegisterHandler(name, handler)
def step_on(self):
try:
self.conn.Process(1)
except KeyboardInterrupt: return 0
return 1
def start(self):
self.conn.sendInitPresence()
print 'Bot started!'
while self.step_on(): pass
Модуль granslate.py:
# -*- coding: utf-8 -*-
import urllib
import simplejson as json
def translate(text, langpair):
#формируем ссылку
query = urllib.urlencode({'q' : text.encode("utf-8"), 'langpair' : langpair})
url = u'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;amp;%s'.encode("utf-8") \
% (query)
#спрашиваем перевод у гугла
result = urllib.urlopen(url)
response = json.loads(result.read())
if response['responseStatus'] != 200:
#если что-то не так, показываем сообщение об ошибке
mess = response['responseDetails']
else:
# показываем перевод
mess = response['responseData']['translatedText']
return mess
JID получившегося бота jabber_translator@jabber.ru.
Если направление перевода не указано явно, используется перевод с английского на русский. Если хотите указать направление перевода, то его нужно указать первой строкой, все остальные строки будут переведены:
ru|fr
Привет



27 Апр 2009 в 18:17
Ух ты, прикольно! У меня тоже была мысль сделать какого-нибудь бота) И ведь сделаю когда-нибудь
[Ответить]
27 Апр 2009 в 18:18
Давай, будем собирать армию ботов. С целью покорения мира)
[Ответить]
28 Апр 2009 в 16:37
Поддерживаю! Очень аккуратно. =)
Мало кода и все красиво =)
[Ответить]