[#Node-RED] Node-REDでTwitterのDMからRedmineのチケットを作成する
前回はNode-REDからRedmineのREST API を呼んでチケット一覧を取得しましたが、今回はそれを少しずつ変更しながらちょっと実用的なものを作ります。
httpヘッダーをJSONでセット
前回は文字列としてヘッダーをセットしましたが、複数のヘッダーが必要ですのでJSONに変更します。チェンジノードのデータを「JSON {}」して以下の様にセットします。
{"X-Redmine-API-Key":アクセスキー}
一旦、デプロイしてインジェクトボタン(timestampと表示されているノードの左側の四角いボタン)を押して、右側のデバッグノードの確認します。
上図のようにエラーが表示された場合は、表示されているノードの名前「APIキー」で確認できますが、エラーメッセージの上にマウスカーソルを移動させると対象のノードが赤の点線で囲まれるので簡単に確認できます。
httpヘッダーをJSONでセット
チケットを作成するにはPOSTで、 Content-Typeの設定が必要です。チェンジノードの設定を以下に変更して、確認します。
{"X-Redmine-API-Key":アクセスキー, "Content-Type":"application/json"}
プロジェクト作成&ID取得
Redmineで、プロジェクト -> 新しいプロジェクトと実行して、更新を受けるプロジェクトを作ります。さらに、プロジェクトを選んでから設定 -> メンバーの右側でユーザとロールを選んで追加しておきます。
プロジェクトIDはNode-RED呼び出しノードのURLをssues.jsonからprojects.jsonに変更して、インジェクトするとプロジェクトIDがわかります。
{ "projects": [ { "id": 3, "name": "自動投稿", "identifier": "social", "description": "ソーシャル投稿用のプロジェクトです", "status": 1, "created_on": "2016-04-17T04:01:39Z", "updated_on": "2016-04-17T04:01:39Z" }, { "id": 2, "name": "親プロジェクト", "identifier": ・・・
同様にステータスIDはissue_statuses.json、トラッカーIDはtrackers.json、優先度は/enumerations/issue_priorities.jsonで得られます。
POSTしてみる
Redmineのドキュメントを参考にチケットを作ってみます。入力をSubjectに入れるので、チェンジノードをあきらめて、ファンクションノードに以下のコードを設定します。
msg.headers =
{"X-Redmine-API-Key": アクセスキー, "Content-Type":"application/json"};
msg.payload =
{
"issue": {
"project_id": 3,
"tracker_id": 4,
"subject": msg.payload,
"priority_id": 2
}
};
return msg;
入力がtimestampでは寂しいので「漢字のサブジェクト」という文字列をインジェクトノードにセットします。設定画面のpayloadで「aZ」を選択して設定します。
デプロイしてdebugタブに以下のような表示がされれば成功です。
{ "issue": { "id": 17, "project": { "id": 3, "name": "自動投稿" }, "tracker": { "id": 4, "name": "タスク" }, "status": { "id": 1, "name": "新規" }, "priority": { "id": 2, "name": "通常" }, "author": { "id": 1, "name": "阪井 誠" }, "subject": "漢字のサブジェクト", "start_date": "2016-04-17", "done_ratio": 0, "spent_hours": 0, "created_on": "2016-04-17T05:57:57Z", "updated_on": "2016-04-17T05:57:57Z" } }
twitter対応
チケット作成が確認できたので、いよいよtwitterに対応しましょう。Node-REDの左側の少し下の方にtwitterノードがありますのでこれをクリックします。すると右側のinfoタブに説明が表示されます。すると、送信者はtopic、内容はtweetにセットされることがわかります。
そこで、テストデータとしてインジェクトノードのtopicに送信者、payloadに漢字の概要を設定して、チェンジノードでmsg.payloadをmsg.tweetにセットします。
Redmineを確認すると、題名が「送信者」、説明が「漢字の説明」となったチケットができているはずです。
twitterノードの追加
入力としてtwitterノードを追加します。「Add new twettier-credentials...」の状態で右のペンのアイコンをクリックするとtwitterの連携用の認証に進むことができます。searchはダイレクトメッセージを選択します。
デプロイして自分にダイレクトメッセージすると、説明にプロフィール等が載っていてそのままではチケットの説明に使えません。msg.tweet.textが求めている送信文でした。最終的にファンクションノードは以下の様なコードになります。インジェクトも同じ様に変更します。
msg.headers =
{"X-Redmine-API-Key":アクセスキー, "Content-Type":"application/json"};
msg.payload =
{
"issue": {
"project_id": 3,
"tracker_id": 4,
"subject": msg.topic,
"description": msg.tweet.text,
"priority_id": 2
}
};
return msg;
ようやくチケットができました。
ふりかえり
Node-REDを使って段階的に開発してみました。インタフェースがJSONで統一されているので、インジェクトノードで下流を確認しておいて、あとから実際の通信をすることができます。
時差意の処理はファンクションノードで頑張れば大抵のことはできるのですが、細かく分けて実装するとdebugタブのエラー表示をうまく使えます。
また、infoタブで仕様の確認ができるので、インタフェースを確認しながら作り上げることができます。もし、勘違いがあればdebugノードを追加して簡単に確認できます。
作成したフロー中のデバッグノードには、右側の四角の部分が白いものがあります。これはデバッグに使ったもので、そのままでは煩わしいので表示を停止したものです。再デプロイしなくても四角の部分を押すだけで変更できます。
まとめ
IoT環境として知られているNode-REDは、通信プログラムが作り易い環境です。
ソフトウェア開発に通信がからむと結合時に実物との擦り合わせが必要です。twitterノードのポーリングは15分に1回ですので、今回の様に段階的に開発しないと開発にとても時間がかかるでしょう。
Node-REDユーザに公開されているノードには、この他にもソーシャネット向けのノードがたくさんあり、無料サービスのFREDでもたくさんサポートされています。
今回はイベントドリブンな方法のみを紹介しましたが、インジェクトノードはcronの様な定期実行も可能です。色々なシステムを作ることが可能でしょう。
ぜひ、一度Node-REDに触れてみてください。
(注:今回利用したtwitterノードはデータ取得を100%保証していないので、実際に使う場合は別の方法でもチェックしてください)
おまけ:Redmineの視点で
今回は前田さんの発表を参考に、メールの代わりにTwitterを入力源として使ってみました。もちろん、文字コードの考慮が必要ですが、RedmineのメールをチェックしてTwitterで通知することも簡単にできます(こちらはデータ抜けがないでしょう)。
さらに応用すれば、社内用とプロジェクト用のRedmine間で更新をリンクさせることも可能になるでしょう。チケット作成時にチケット番号が返ってきますので、それを何かに覚えておけば容易に実現できるでしょう(Node-REDはDBなどのストレージも色々使えます)。
次回は、もう少し大きなシステムを作る際に考えないといけない保守性について書いてみたいと思っています。
« [#Node-RED] RedmineのREST API を呼ぶ | トップページ | ザ・ゴール2 コミック版:TOCの思考プロセスは、ツール、知識、考え方から »
「Redmine」カテゴリの記事
- [#TiDD] プロジェクトを成功させるチケット管理(2017.07.02)
- Redmineが得意なプロジェクト(2016.09.20)
- 『Redmine実践ガイド』に書き忘れた事 - 管理を容易にするチケット番号の一意性 -(2016.08.11)
- [#Node-RED] Node-REDでTwitterのDMからRedmineのチケットを作成する(2016.04.17)
- [#Node-RED] RedmineのREST API を呼ぶ(2016.04.17)
「Node-RED」カテゴリの記事
- アイデアをシームレスに実装する - 考える道具としてのNode-RED -(2020.12.13)
- [#Node-RED] ファンクションノードのデバッグどうしてる?(2019.12.16)
- Node-RED: joinノードでタイムアウト処理(2018.12.25)
- Node-REDで世界が変わる!(2018.12.01)
- デブサミ関西でNode-REDとペンギンと勇気の話をしました #devsumiB(2018.10.28)
この記事へのコメントは終了しました。
コメント