過ぎし日のChatOps Advent Calendar 2015に空きがありましたので、さかのぼりで埋めさせて頂きました。
普段、SORACOM AirのAir SIMを検証やデモ用としてiPhone 6Sにさして s1.minimum
で利用しているのですが、たまにブラウジング等で s1.fast
等に変更して利用したくなることがあります。コンソールにログインして変更するのもいいのですが、より楽しく、簡単にできるといいなぁということで、・・・社内で利用しているビジネス専用チャットツール「direct」でSORACOM Airの速度変更を行えるようにしました。要は、SORACOM Airの速度クラス変更をdirectでやるためのボットを作ってみたというお話です。
direct
directは、LisBさんが提供するビジネス用チャットツールです。個人的には「ゆずがっぱ」のスタンプが標準で使えるのが推しの理由の一つですが、文字通りビジネスシーンで役立つ様々な機能が提供されています。また、direct専用のbot開発SDKである「daab SDK」による業務システムやクラウドサービスとの連携ボットの開発も可能です。
daab
Node.jsベースでボット開発ができる、Hubotのdirect用拡張版です。Hubot従来機能に加えてdirectで使われる便利なスタンプ類(Yes/NO、セレクト、今ココ)や動画・画像といった添付ファイルを取り扱えることを特徴としています。daab SDKとしてGitHubで公開されています。
SORACOMボット
今回は、速度クラス変更に対応するボットとします。
サンプルコード
基本的には、Hubotの書き方をベースにdaabならではの機能スタンプ等の要素(ドキュメント)を入れ込んでいきます。今回はSIMや速度クラスの選択部分でセレクトスタンプの機能を使います。
SORACOMのAPIはNode.jsのSDK「soracom」を作ってくださっている方がいらっしゃるので、それを利用させてもらいます。
// Description:
// daab for SORACOM.
//
// Commands:
// hubot speed - change speed class
var Soracom = require('soracom'); // soracomをインポート
var soracom = new Soracom({ // soracomオブジェクト
email: 'email',
password: 'password'
});
module.exports = function(robot) {
var speed_class_options = ["s1.minimum", "s1.slow", "s1.standard", "s1.fast"]; // 速度クラス
var subscriber = { // subscriberの属性
imsi: undefined,
tags_name: undefined
};
var selectSim = function(msg) { // SIM選択のためのセレクトスタンプ(質問)を送信する関数
soracom.post('/auth', function(err, res, auth) {
if (!err) {
//console.log(auth);
soracom.defaults(auth);
soracom.get('/subscribers', { // activeなSIMの情報を取得
status_filter: "active"
}, function(err, res, body) {
//console.log(body)
var sim_options = [];
for (var i = 0; i < body.length; i++) {
sim_options.push(body[i].tags.name + ' (' + body[i].imsi + ')');
}
return msg.send({ // activeなSIMをセレクトスタンプ(質問)を送信
question: "SIMを選択してください",
options: sim_options
});
});
}
});
};
var changeSpeedClass = function(msg, speed_class) { // 速度クラス選択のためのセレクトスタンプを送信する関数
soracom.post('/auth', function(err, res, auth) {
if (!err) {
//console.log(auth);
soracom.defaults(auth);
soracom.post('/subscribers/' + subscriber.imsi + '/update_speed_class', { // 速度クラスを変更
"speedClass": speed_class
}, function(err, res, body) {
//console.log(body)
return msg.send({ // スタンプ付きのテキスト送信
stamp_set: "3",
stamp_index: "1152921507291204289",
text: body.tags.name + ' (' + body.imsi + ') の速度クラスを「' + body.type + '」に変更しました。'
});
});
}
});
};
// 速度クラス変更をキーワード「speed」でスタートさせる
robot.hear(/speed/, function(msg) {
return selectSim(msg);
});
// セレクトスタンプ(回答)受信時の処理
robot.respond("select", function(msg) {
var select_response = msg.json.options[msg.json.response];
if (select_response.indexOf('(') >= 0) { // SIM選択時の処理
subscriber.tags_name = select_response.split('(')[0];
select_response = select_response.split('(')[1];
subscriber.imsi = select_response.split(')')[0];
return msg.send({
question: "速度クラスを選択してください。",
options: speed_class_options
});
} else { // 速度クラス選択時の処理
if (subscriber.imsi) {
return changeSpeedClass(msg, select_response);
} else {
msg.send({ // スタンプ付きのテキスト送信
stamp_set: "3",
stamp_index: "1152921507291204379",
text: "SIMが選択されていない可能性があります。"
});
return selectSim(msg);
}
}
});
};
デプロイ
daab環境の準備
「Cloud9を利用して3分でdaab(direct用拡張Hubot)開発環境構築」を参考に、ひとまずCloud9で試してみます。リンク元の情報からdaabのダウンロード方法等一部情報が変わっている部分がありますので、まとめ直します。
- Redisサーバの起動(
sudo service redis-server start
) - 今回は「Node.js」ディレクトリ配下に、daab用ディレクトリの作成(
mkdir daab&&cd daab
) - daab SDKのダウンロード(
git clone https://github.com/lisb/daab-starter.git
)※バージョンは執筆時点のものです - daabの起動( ./bin/hubot) → daab用directアカウントの入力 → トークンの取得
- トークンを環境変数として書き込み(
echo export HUBOT_DIRECT_TOKEN={token} >> ~/.bashrc
) - 書き込んだ環境変数の有効化(
source ~/.bashrc
) - 再度daabの起動(
./bin/hubot
)
PING/PONGで確認
./bin/hubot
でdaabを起動できたら、今回設定したdaab用のアカウントをトークに招待して ping
を試してみます。
daabが「PONG」 を返してくれればOKです。
SORACOMボットのデプロイ
script
ディレクトリに今回の soracom.js
を入れます。 daabは、Node.jsのforeverの永続化要素を取り込んであるので、./bin/hubot start
で永続化してみます(Cloud9なのでたまに落ちると思いますが、とりあえず)。daabの永続化要素「daab forever」については、こちらをご覧ください。
directからSORACOM Airの速度クラスを変更してみる
daabとのトークで、速度クラス変更のキーワードである「speed」をつぶやいてみます。すると、SIMと速度クラスをセレクトスタンプで質問されるので、選択すると、最終的に速度クラスが変更されます。
まとめ
やはり、チャットツールが入力UIになると、楽しいし、速い! 今回のケースではSIMの数が多くなったりすると工夫が必要ですが、現状では実用に十分耐えられそうです。
実はこれの前に、MESHのボタンタグでやっていたのです。
しかし、ボタンを持ち歩かないといけないのと、SIMを特定の1枚だけに絞って設定に埋め込む必要があるのと、速度クラスもボタンタグの「Single」「Double」「Hold」3種類までしか紐つけできないので、イマイチ感がありました。あと、MESH SDKからSORACOM APIを直接たたこうとすると、なぜか401で認証が通らなかったのでAWS Lambda/API Gatewayを経由させていて、やはりイマイチ感でした。が、これですっきりしました!
免責事項
ご利用は自己責任でお願い致します。