четверг, 16 июня 2011 г.

Бот для админа

   С наступлением лета пришла пора выездов на природу, дачу, отдых и т.д.
   Встала проблемам как же управлять сервером или другим удаленным компьютером находясь в отрыве от цивилизации ;)
   Для решения этой проблемы я решил создать Jabber-бота на прекрасном языке Python. Для упрощения написания использую библиотеку XMPPPY В процессе понял, что хочется добавить еще некоторый функционал, в следствии чего реализовал систему плагинов для легкой расширяемости ;)
   Самая интересная часть - реализация поддержки плагинов




  1. def loadPlugins():
  2.    import os
  3.    commands = []
  4.    public_commands = []
  5.    for fname in os.listdir('plugins/'):
  6.         if fname.endswith('.py'):
  7.             plugin_name = fname[:-3]
  8.             if plugin_name != '__init__':
  9.                 plugins = __import__('plugins.'+plugin_name)
  10.                 plugin = getattr(plugins,plugin_name)
  11.                 if plugin.init():
  12.                     commands.append(plugin_name)  
  13.                 else:
  14.                     public_commands.append(plugin_name)  
  15.    return 'plugins':plugins,'commands':commands,'public_commands':public_commands}


Для примера приведу реализацию плагина-переводчика.



  1. import urllib
  2. import json
  3. import string, re
  4. import xmpp
  5. def init():
  6.    return 0
  7. def run(bot,mess):
  8.    text = mess.getBody()
  9.    user = mess.getFrom()  
  10.    langpair = 'en|ru' #PEREDELAT
  11.    if text:
  12.       lines = text.splitlines()
  13.       regexp = re.compile('^\w{2}\|\w{2}$', re.IGNORECASE)
  14.       if regexp.match(lines[0]):
  15.          langpair = lines[0]
  16.          del lines[0]
  17.          return
  18.       text = string.join(lines)
  19.       reply = translate(text, langpair)
  20.       bot.send(xmpp.Message(mess.getFrom(),reply))
  21. def translate(text, langpair):
  22.    query = urllib.urlencode({'q' : text.encode("utf-8"), 'langpair' : langpair})
  23.    url = u'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&%s'.encode("utf-8") % (query)
  24.    result = urllib.urlopen(url)
  25.      response = json.loads(result.read())
  26.    if response['responseStatus'] != 200:
  27.       mess = response['responseDetails']
  28.    else:
  29.       mess = response['responseData']['translatedText']
  30.    return mess



Остальные плагины не столь интересны. Реализация бота довольно стандартна, так что примеры без труда можно найти с помощью Великого и Ужасного.

Комментариев нет:

Отправить комментарий