preload
Апр 27

Захотелось мне написать что-нибудь на питоне, чтобы иметь представление о языке. И задумал я изготовить джаббер-бота, который посредством гугла будет служить для переводческих целей. Собственно, далее следуют инструкции по написанию этого самого бота с использованием библиотеки 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;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

Вот что получилось в итоге:
jabber_bot

JID получившегося бота jabber_translator@jabber.ru.
Если направление перевода не указано явно, используется перевод с английского на русский. Если хотите указать направление перевода, то его нужно указать первой строкой, все остальные строки будут переведены:
ru|fr
Привет

Связанные записи

Отзывов (3) на «Инструкция по разведению jabber-ботов»

  1. CharnaD пишет:

    Ух ты, прикольно! У меня тоже была мысль сделать какого-нибудь бота) И ведь сделаю когда-нибудь

    [Ответить]

  2. 0utPunk пишет:

    Давай, будем собирать армию ботов. С целью покорения мира)

    [Ответить]

  3. Alex Snet пишет:

    Поддерживаю! Очень аккуратно. =)
    Мало кода и все красиво =)

    [Ответить]

Ваш отзыв