こんにちは。インフラエンジニアの井上です。
普段はWindows上でChatworkの新着メッセージをタイムラグなく確認するためにChromeの機能を使っています。ただ、オペレーション端末としてLinuxのXを使うことがあるため、この手段が必ずしも有効ではないかもしれないと思いから、Chatwork APIとSSTPの組み合わせでなんとかしてみようと考えたわけです。
今となっては知らない方も多いかもしれないが、10年以上前からデスクトップマスコットである「伺か」(「何か」と呼ぶケースもある)というものが存在します。当初のアプリはすでに開発がとまっていますが、実は今もオープンソースで、開発が続いています。最近まではPythonで開発されていましたが、Rubyへの移植も始まっており利用者が戻ってくるといいなと思います。興味がない人にとっては関わりがなさそうなアプリですが、Linuxなどを使われるユーザの環境には、この残滓が残っています。おもむろにコンソールにて
grep sstp /etc/service
と打ってみてください。すると結果が返ってくると思うのですが、まさしくこれが、「伺か」のためのプロトコル用ポート定義です。この番号の予約はきちんとIANAにもあり、社会認知されていると私は信じています。では、本題に。
まず、「伺か」を利用するためにninix-ayaを入れます。そして、インターフェースとなるゴーストとバルーンをプラグイン的にインストールすれば起動が可能となります。起動させてぼーっと眺めていてもいいのですが、今回の目的は「Chatworkのメッセージ更新を知りたい」ということですので、インターフェースへメッセージを送る手立てを用意します。定型メッセージを送るプログラムは割と簡単で、サンプルを見ながらだとすぐ書けます。Rubyだと下のような感じになります(やっていることは9801番ポートに"SEND SSTP/1.1"(固定),"Sender","Charset","Script"(箱と内容)を送るってことです)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require 'socket' s = TCPSocket.open('localhost', 9801) MSG_HEADERS ={ 'Sender' => 'sstp_test_prog', 'Charset' => 'UTF-8' } MSG_BREAK = "\r\n" h = ['SEND SSTP/1.1'] MSG_SAKURA = "\\h" + ARGV[0] MSG_UNYU = "\\uまぁ、想定通りだな\\nはたらけ、はたらけ。。。" MSG = MSG_SAKURA + MSG_UNYU headers = MSG_HEADERS.clone.update('Script' => MSG) h << headers.map{|k, v| "#{k}: #{v}"} message = h.join(MSG_BREAK).concat(MSG_BREAK * 2) s.write(message) |
「ruby スクリプト名 SSTPテスト」とテストで実行するとこんな感じの結果が得られます。
ここまでで、表示環境は整いました。あとは、Chatworkからメッセージをとってくるだけです。
実は、「伺か」を使ってChatworkのメッセージを表示というのは、Chatwork公式ブログでも扱われています。わりと難しいことをして実現されています(SSTP/Fluentd + fluent-plugin-sstp/Chatwork API)。
もちろん、使えるものは使おうと思い、私も試し基本動作まで確認しましたが、導入が大変で、マシンパワーもわりと必要だったため、もっと簡単な機能へのアプローチをすることにしました。それが「スクリプト(+jqコマンド)+ Chatwork API + SSTP + cron」による簡単タスク確認です。ChatworkのAPIの使い方は更新サイトのドキュメントにまかせて、実際のスクリプトを公開してみたいと思います。先ほど公開したrubyスクリプト(st.rb)をそのまま流用することこで、定期的にその時の最新タスク1件を確認することにしました(curlで呼んでいるURL中のコメントは読み替えてください)。
1 2 3 4 5 6 7 8 |
#!/bin/bash DATE=`date +'%Y/%m/%d_%H:%M'` task=`curl -X GET -H "X-ChatWorkToken: ここはChatwork APIキー" "https://api.chatwork.com/v1/rooms/ここはルームID/tasks?account_id=ここはアカウントID&assigned_by_account_id=ここはアカウントID&status=open"|jq .[0].body|head -1|sed s/\"//g` SEND_MSG="現在最新タスク:$task:($DATE)" ruby /root/ninix/st.rb $SEND_MSG |
そして、これを実行してみた結果は以下の通りです。これをcronに上手に登録すれば、最新タスクの確認は可能になりました。
今回は簡単な方法のみの実現でしたが、発展があれば、また紹介したいと思います。