...

суббота, 30 августа 2014 г.

Skype-бот для деплоя без Skype API

Вы, наверное, знакомы с использованием чат-ботов для управления чем-либо. Например, очень удобно запускать сборку или раскладку, просто написав сообщение одному из своих контактов в IM.

Для скайпа существуют различные готовые боты, один из представителей — Sevabot. Все они используют API скайпа, который Microsoft собирается убить, поэтому работа всех этих ботов скоро может стать невозможной. А мне бы этого не хотелось — я кое-где использую их для запуска деплоя.


Как же быть?




Все живущие ныне боты работают сбоку от десктопной версии skype. Я организую всё так же, но подлезу к скайпу не через API.

Для односторонней подачи отмашки на запуск чего-либо можно со скрипом обойтись только извлечением сообщений из скайпа. Skype хранит свои сообщения внутри базы sqlite3 в своей директории с данными. Я просто посижу в засаде.



import sys
import signal
from time import sleep
import sqlite3

if len(sys.argv) != 3:
sys.stderr.write("Usage: %s <path to skype `main.db` file> <watch interval in seconds>\n" % sys.argv[0])
sys.exit(1)

def int_handler(signum, frame):
sys.exit(0)
signal.signal(signal.SIGINT, int_handler)

dbfilename = sys.argv[1]
interval = float(sys.argv[2])

conn = sqlite3.connect(dbfilename)
c = conn.cursor()
c.execute("select id from Messages where id = (select max(id) from Messages);")
(last_msg_id,) = c.fetchone()
while True:
sleep(interval)
for id, body in c.execute("select id, body_xml from Messages where id > ?;", (last_msg_id,)):
last_msg_id = max(id, last_msg_id)
print body




Запускаем: ./skype-watch.py ~/.Skype/skype_login/main.db 1

На stdout с некоторой задержкой бегут получаемые и отправляемые клиентом сообщения. Поменяв запрос, можно добавить фильтрацию по отправителю, поменяв код обработки — реакцию. Идея, я думаю, понятна.


Ну и что?




Хотелось бы услышать идеи, как сделать его двухсторонним. На ум пока приходит только подкладывание «неотправленных» сообщений в базу, которые бы скайп сам отправлял — ведь при неудаче отправки и завершении работы клиента скайп помнит, что нужно переслать.

Плюсы:


  • Не нужен API.

  • Просто как топор, мало зависимостей.




Минусы:


  • Работает только на приём.

  • Не использует хуки sqlite3.


Реп на гитхабе


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


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

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