前に、 redmine_chat_telegramおよびredmine_intouchプラグインの設計について書きました
RedmineとTelegramでの作業の生産性が向上します。 今日は、TelegramCLIを削除した方法についてお話します。 これは、テレグラムプラグインの作業を簡素化するために設計された優れた更新プログラムです。
操作の過程で、 TelegramCLIのセットアップで問題が繰り返し発生したため、プラグインの作業を簡素化することにしました。 これを行うには、TelegramCLI依存関係を取り除く必要があると考え、代わりにWebogramを追加し、ニーズに合わせて修正しました。 これにより、サーバーでTelegramCLIサービスを実行できなくなりました。
Webogram
Webogramは、AngularJSで書かれた公式のTelegram Webクライアントです。 したがって、スクリプトを介してWebogramを操作するには、ヘッドレスブラウザーを使用する必要があります。この場合はPhantomJSです。
Webogramコードを変更して、インターフェースを操作する必要なく、必要なアクションのリクエストを提供しました。 特別なリクエストの形式で、プラグインは、変更されたWebogramのURLに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は要求を実行し、#api-status要素を10秒待機します
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のクラスが「準備完了」に変わり、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にリクエストを送信するログインを記憶する簡単な認証プロセスを実行するだけで十分です。
プラグインredmine_chat_telegramおよびredmine_intouchのテレグラムボットは、getUpdates(以前のrakeのバックグラウンドプロセスとして)だけでなく、WebHooks(対応するプラグインの設定でボットを初期化するのに十分ですが、RedmineのHTMPSが必要です)を通じて動作することを学びました。 したがって、以前は経験の浅いユーザーがプラグインをインストールする際の障害となりうる追加のバックグラウンドプロセスを取り除きました。
エラーが発生した場合、プラグインを改善するための提案がある場合、またはプラグインの開発に参加したい場合は、お気軽にお問い合わせください。 リポジトリは次のとおりです。