こんにちは、あらいです。
ツールを作りました
chatwork-cliというツールを作りました。
Go言語でできたチャットワークAPIのCLIクライアントで、shellから簡単にAPIを叩くことができます。
こんな風に。
# 自分の情報を得る
$ cw get me
# ===> GET https://api.chatwork.com/v2/me
$ cw get me | jq .name
# "新井崇司"
# 自分のタスクを得る
$ cw get my tasks
# ===> GET https://api.chatwork.com/v2/my/tasks
# メッセージを投稿する
$ cw post rooms 84810920 messages 'body=I am hungrrrry'
# ===> POST https://api.chatwork.com/v2/rooms/84810920/messages
shからチャットワークに通知を送る・タスクを作るなどの用途に使うことができます。
go get
コマンドで入手(GitHubのREADMEを参照)、
またはリリースページからMac用のバイナリがダウンロードできます。
ぜひご活用ください。
注:これは新井個人が作ったツールであり、ChatWork社が公式にサポートするものではありません。
なぜ作ったか
chatwork APIはcurlコマンドで簡単に利用することができます。
先々月に招待リンクを操作する機能をリリースしましたが、
その開発中にモリモリcurlを叩いていました。
しかし複数アカウントを切り替えて使おうとするとトークンの管理が面倒であったり、
送信先のroom_idが覚えていられないなど、不満がありました。
きっかけは、ひむひむこと@eielhが作った社内ツールでした。
これは30行に満たないshでできており、httpieとjqを使って内部用APIをCLIから叩くものでした。
しかしこの小さなツールは素晴らしく便利であり、テスト等で大活躍します。
着眼点の良さ、また大部分をhttpieに任せつつも違和感なく内部APIを操作できるI/Fデザインに感動しました。
私は思いました。これパクったろうと。
そしてできたのが、言わばツールの公開用APIバージョンである chatwork-cli
です。
こだわったポイント
なぜGoを選んだか
シングルバイナリによるツール配布の容易性、及び組み込みライブラリの機能の豊富さからGoで作ることにしました。
Goは初めてでしたがTour-of-goなどを読みながら1ヶ月ほどで組み上げることができました。
goroutineは使いどころ(使って有効な勘所)が分からず全て同期で作っています。
おそらく他の言語で実装することも簡単でしょう。ボトルネックが分かったらgoroutine化してみたいと思います。
エンドポイントの情報は持たない
GoといえばPHPと違って静的型が嬉しい言語ですが、このツールはエンドポイントの情報をあえて持たないようにしています。
従って存在しないエンドポイントにも簡単にリクエストを送れます。
# tasksのtypo
$ cw get my task
# {"errors":["Invalid Endpoint or HTTP method"]}
それどころかHTTPのメソッドもチェックせずなんでも送れるようにしてしまいました。
なのでこういうこともできます。
$ cw rock you
# ===> HTTP ROCK https://api.chatwork.com/v2/you
# {"errors":["Invalid HTTP method"]}
なぜこうしたかというと、そもそもが開発・テスト用に自分が欲しいツールだからなんですが、
実際のプロダクション環境ではこういった不正なリクエストが送られてくる可能性は常にあるわけで
そのような不正な使われ方をした時の検証にも役立つかな、という思いがありました。
あと実際のユーザが正しいエンドポイントを把握できるよう、 -endpoint
オプションで
ramlをパースして正しいエンドポイントを一覧表示する機能をつけています。
コマンドの挙動をテストする
小規模なツールなのでユニットテストはあまり書いていません。
その代わり作ったバイナリである cw
コマンドの挙動(exit codeや表示内容)をテストしています。
ただコマンドの挙動テストの今時なやり方が分からず、困った挙句 Makefile に書いてしまいました。
(当該箇所)
これでも一応用を足すことはできますが、より良い方法があれば教えて頂けると嬉しいです。
これから
chatwork-cliはMITライセンスのOSSです。
issue、P-Rも大歓迎です。
将来的にはOAuth2で認証して使えるようにしたいと思いつつ着手していません。
やる気を溜めて作っていきたいと思います。よろしくお願いします
github.com