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