company_banner

Перевод Redmine-плагинов с TelegramCLI на Webogram


    Ранее мы уже писали о наших плагинах redmine_chat_telegram и redmine_intouch, предназначенных
    для того, чтобы ваша работа с Redmine и Telegram была продуктивнее. А сегодня мы хотели бы рассказать о том, как избавились от TelegramCLI. Это большой апдейт, призванный упростить работу с нашими telegram-плагинами.


    В процессе эксплуатации у нас неоднократно возникали проблемы с настройкой TelegramCLI, поэтому мы решили упростить работу наших плагинов. Для этого мы сочли необходимым избавиться от зависимости TelegramCLI, добавили вместо него Webogram и модифицировали под свои нужды. Это позволило больше не запускать на сервере сервис TelegramCLI.


    Webogram


    Webogram — официальный веб-клиент к Telegram, написанный на AngularJS. Поэтому, чтобы работать с Webogram через скрипты, приходится использовать headless browser, в нашем случае это PhantomJS.
    Мы модифицировали код Webogram, чтобы отдавать ему запросы на нужные действия без необходимости работать с интерфейсом. В форме специального запроса плагин отправляет на URL модифицированного Webogram инструкцию сделать некую операцию в Telegram.


    Принцип работы


    Сначала плагин дает команду произвести какую-то операцию в Telegram.


    telegram = TelegramCommon::Telegram.new
    result = telegram.execute('Test')

    Далее формируется строка запуска PhantomJS.


    module TelegramCommon
      class Telegram
        ...
    
        def make_request
          @api_result = `#{cli_command}`
          debug(api_result)
          api_result
        end
    
        def cli_command
          cmd = "#{phantomjs} #{config_path} \"#{api_url}\""
          debug(cmd)
          cmd
        end
      end
    end

    Затем PhantomJS выполняет запрос и ожидает 10 секунд, чтобы элемент #api-status
    получил класс ready, который свидетельствовал бы о том, что Webogram завершил обработку.


    // plugins/redmine_telegram_common/config/phantom-proxy.js
    
    ...
    
    page.open(url, function() {
      waitFor(
        function () {
          return page.evaluate(function () {
            return $('#api-status').hasClass('ready');
          });
        },
        function () {
          exit()
        }, 10000);
    });

    AngularJS-контроллер AppApiController занимается обработкой запросов, и когда он заканчивает работу, то на странице у блока #api-status меняется класс на "ready", тем самым уведомляя PhantomJS о завершении операции.


    // plugins/redmine_telegram_common/app/webogram/app/js/controllers.js
    
    $scope.promiseStatus = false;
    var args = {};
    
    if (typeof $routeParams.args !== 'undefined') {
      args = JSON.parse($routeParams.args)
    }
    
    $scope.handle = function () {
      var command = $routeParams.command;
      var handlerName = $scope['api' + command];
    
      if (typeof handlerName === 'function') {
        handlerName(args)
      } else {
        console.error('There is no ' + handlerName + ' api function.')
      }
    };
    
    $scope.apiTest = function () {
      $scope.successApi('api test')
    };
    
    ...
    
    $scope.successApi = function (msg) {
      console.log('success: ' + msg);
      $scope.resolveApi()
    };
    
    $scope.failedApi = function (msg) {
      console.log('failed: ' + msg);
      $scope.resolveApi()
    };
    
    $scope.resolveApi = function () {
      $scope.promiseStatus = true
    };

    Вскоре запрос выполняется, и плагин получает ответ, с которым можно работать.


    Заключение


    В итоге, чтобы начать работать с нашими плагинами, которые ранее зависели от TelegramCLI, теперь достаточно установить новые зависимости, перейти на страницу настройки плагина redmine_telegram_common и пройти простенькую процедуру авторизации, в процессе которой PhantomJS запомнит, под каким логином отправлять запросы на Telegram.


    Telegram-боты в наших плагинах redmine_chat_telegram и redmine_intouch научились работать не только через getUpdates (как ранее фоновые процессы через rake), но и через WebHooks (достаточно инициализировать ботов в настройках соответствующих плагинов, однако необходим HTTPS на Redmine). Таким образом, мы избавились от дополнительных фоновых процессов, которые раньше могли быть преградой для установки плагина неопытными пользователями.


    Если вы встретили какие-то ошибки, у вас есть предложения по улучшению плагина или вы желаете принять участие в развитии плагинов, мы будем рады вашим откликам. Наши репозитории перечислены ниже.


    Ссылки


    Southbridge
    587.39
    Обеспечиваем стабильную работу highload-проектов
    Share post

    Comments 3

    • UFO just landed and posted this here
        +1
        1. Webogram — официальный поддерживаемый клиент Telegram.
        А telegram-cli не поддерживается. Поведение telegram-cli на разных операционных системах было самое разное.
        2. Большинству было неудобно запускать дополнительные процессы. Слишком нетривиально.
        0
        1. Не получилось совсем от манипуляций с DOM избавиться чтобы выкинуть phantom и взять чистый nodejs? Вот у Игоря тикет про это — https://github.com/zhukov/webogram/issues/124, кажется он был бы очень даже за если бы ему помогли.

        2. А реализаций mtproto на Ruby нет? Вот есть https://github.com/platphorm/telegram_rb, правда выглядит сыровато, да. Пробовали её?

        3. Зачем вообще нужна функциональность отправки сообщений по mtproto? Кажется через бота все задачи нормально решаются.

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