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.


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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 32

      +5
      Хитрый подход. Правда, ожидал увидеть реверс протокола или ещё что-то хитрое… Но данный способ тоже интересен. Хотя толку в нём, если он всё равно зависим от наличия клиента?
        0
        > Правда, ожидал увидеть реверс протокола
        Там же все зашифровано.

        > Хотя толку в нём, если он всё равно зависим от наличия клиента?
        Он решает поставленную задачу.

        PS Минус не мой.
          –1
          Всё можно расшифровать, имея желание :) Были же какие-то наработки.
            0
            Как мне кажется, сменить схему или ключ шифрования куда проще, чем повторно проделать огромную работу по дешифровке.
            +1
          +7
          Вариант использования jabber'а как более удобный не рассматривали? Удобный в том плане, что стабильный открытый протокол, беспроблемная работа в любую сторону, а минус только один — необходимость еще одного клиента на десктопе.
            –6
            Скайп удобен тем, что у всех он есть на компьютере, ради этого всё и затевалось.
              +2
              На мой взгляд, дешевле держать в памяти jabber-клиент без ГУЯ, чем жирный скайп. И вечно гнаться за прихотями Майкрософта. Учитывая, что вам не нужен избыточный голосовой функционал
                +1
                Да блин, в чем вы несогласны с автором? Скайп используется в том числе для общения с теми людьми, которые не будет себе на компьютер ставить ничего другого, не получится всех перетащить, не бывает так. Не надо минусовать не за дело, да?
                  0
                  Увы, многие считают, что Jabber, TOX, %messenger_name% захватят мир.
                    0
                    Минусуют не YourChief, а его комментарий. И минусуют, по всей видимости, те у кого на компьютере скайпа нет. И кого автор «с плеча» исключил из категории «всех». Видимо кого-то это обижает.
                    Не знаю как вам, господа, лично мне было бы неудобно жить и работать с винегретом из живых людей и ботов в контакт-листе. Котлеты отдельно, мухи отдельно.
                      +1
                      Интересно больше тех у кого есть gmail или тех, у кого есть skype.
                      +3
                      И зачем деплой запускать «всем»? А внутри компании имеет смысл использовать корпоративный мессенджер. Вариантов полно, но все обычно либо основаны на jabber, либо имеют jabber-гейт для интеграции со сторонними продуктами, либо имеют свое хорошо документированное API. В подавляющем большинстве случаев есть и веб-клиент, так что даже устанавливать ничего не надо, хотя я не вижу в этом проблемы.

                      Завязывать бизнес на такую нестабильную вещь, как скайп, я бы не рискнул.
                    +2
                    В этой базе, кстати, хранятся в исходном виде отредактированные и удаленные сообщения.
                      +4
                      Альтернатива для хуков на sqlite — хуки на файловую систему.
                        +2
                        Или, для линуксоидов, смотреть inotify (7).
                          +1
                          Или (всё для тех-же) LD_PRELOAD.
                        +1
                        Как-то ненадежно
                        Вы не боитесь race_condition когда сообщения приходят не в том порядке, как были отправлены с разных источников?
                        За скайпом замечены затупливания подгрузки истории в 3-5 минут, когда вы считаете что уже давно общаетесь, а вам вдруг через 5 минут вываливают историю ночного диалога, пока ваш клиент был отключен.
                          +8
                          Чем это команда в скайп лучше\проще\надёжнее чем, например, клик по кнопке «Build» на билд-сервере?
                            0
                            Оно вообще про деплой. Деплой может быть простым, без участия какой-либо билд-системы. Например, вызов разнородных фабриков.

                            Чем проще — тем, что для этого способа ничего не нужно от пользователя. Ни логинов-паролей, ни визита на какой-то конкретный сервер — всё в одном месте.
                              +7
                              Фигак-фигак и в продакшн это называется.
                                0
                                всё в одном месте

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

                                  Вы развели странное рассуждение насчет уже сделанного выбора, это явный оффтоп.
                                    +1
                                    Меня этот выбор просто удивляет. Я вспоминаю свою молодость лет 10 назад, когда у нас в компании было модно рулить разными вещами через IRC-боты. От этого уже много лет как ушли, поскольку нормальная система с веб-интерфейсом лучше по всем параметрам.

                                    «лучше, чем заходить куда-либо вообще» — а в скайп и в чат с ботом Вы что, не заходите?
                              0
                              А разве доступ к этой БД не будет блокирован пока Skype не завершит работу?
                                +3
                                на чтение?

                                после прочтения этого поста в Microsoft, со следующей версии.
                                  0
                                  В своё время писал поисковик, индексирующий ссылки в истории скайпа.
                                  По ходу тестирования выяснилось, что на некоторых системах БД блокируется во время работы Скайпа. А на некоторых — нет.
                                  Подробнее причины не искал (предполагаю, что может быть завязано на тип файловой системы).
                                  +1
                                  I think you can use image processing and imitate user activity, once implemented they cannot forbid you to use it, but they can easily change something like how code uses database, it's internal implementation but user interface changes very rarely. P.s. sorry for English i don't have Russian keyboard on this device.
                                    0
                                    Можно попробовать сделать отправку сообщений, посылая нужные события в окно скайпа через WinAPI. Единственная возможная проблема, пожалуй, в том, чтобы понять, какой чат открыт в данный момент, но можно реализовать через сочетание команд и вашего способа.
                                      0
                                      А в чем проблема посмотреть заголовок чата через WinAPI?
                                      0
                                      Лично у меня Скайп запускается на 2-3 ПК (и они периодически выключаются или «спят»), а синхронизация истории иногда преподносит сюрпризы в виде несинхронных обновлений. Последнее самообновление Скайпа на Виндовс 8.1 вообще закончилось смертью Скайпа (но мне повезло, новый установился, а старый просто не закрывался и завис).
                                      Так что, если использовать для управления чем-либо, то я за Джаббер, клиенты значительно стабильнее (есть и довольно гламурные, PSY+, например) и нет такого неприятного нюанса. А вот для отслеживания обращений в Скайп — очень даже может быть полезным. Автору респект за идею.
                                        0
                                        Мне скайп несколько месяцев слал пропущенный звонок от одного из контактов и я никак не мог избавиться от этого напоминания.

                                      Only users with full accounts can post comments. Log in, please.