habrahabr

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

  • воскресенье, 31 августа 2014 г. в 03:10:51
http://habrahabr.ru/post/235007/

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


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