0

HubotでYoのwebhookを受信する

Yoは最近はダッシュボードからbotアカウントを作れるようになっていて、俺もいくつか作って使っている。

botがYoを受信するとあらかじめ指定しておいたコールバックURLにHTTP-GETでwebhookしてくれる。

https://自分のhubot.herokuapp.com/yo/webhook?token=kazudon とか指定しておくといい。GETのパラメータでusername, user_ip, tokenが来る。


Hubotで受信するとしたらこんな感じ。Hubotにはexpressが内蔵されていてrobot.routerで使える。
環境変数YO_WEBHOOK_TOKENを設定する必要がある。

本当にYoのサーバーからのリクエストかを確かめるのにコールバックURLにtokenを含めるのと、HTTPSを使う。
誰でもYoからプログラム実行できても困るので、許可するYoユーザーをあらかじめ持っておく。

# Description:
# YoのWebhookを受信して何かする
#
# Author:
# @shokai

module.exports = (robot) ->

unless process.env.YO_WEBHOOK_TOKEN
robot.logger.error 'ENV var "YO_WEBHOOK_TOKEN" is missing'
return

yo_users = ['SHOKAI', 'user1', 'user2'] # Yo許可するユーザー

robot.router.get '/yo/webhook', (req, res) ->
ip = req.query.user_ip

unless who = req.query.username
return res.status(400).end 'invalid request'
if yo_users.indexOf(who) < 0
res.status(400).end "bad user: #{who}"
robot.send {room: "#general"}, "不正なユーザー #{who}(#{ip})がYoしてきました"
return
if req.query.token isnt process.env.YO_WEBHOOK_TOKEN
res.status(400).end "bad token"
robot.send {room: "#general"}, "#{who}(#{ip})が不正なtoken#{req.query.token}でYoしてきました"
return

res.end 'ok'
robot.send {room: "#general"}, "#{who}(#{ip})がYoしてきました"
## 〜〜ここで何か処理〜〜 ##

0

tesselでYo

tesselは普通にnpmが使えるので、Yoとかも送れる

ただ、multipart/form-dataがpostできないのであまり大きな通信はできないみたいだけど、Yoぐらいなら簡単に送れる。

まあYo送るのが簡単なのはどうでもよくて、プログラムの中にAPI Tokenなどの設定値を書きたくないけど実行時に渡すようなのは(環境変数とか)tesselではどうやるのかな、というのを調べたりした。


MacからYoを送る


久しぶりにYo見てみたら、Yo Developer Dashboardからアカウントを作ったり、APIのTOKENを取得できるようになってた。以前のように待たされることなくすぐ作れる。

% npm install yo-api -save
% export YO_TOKEN=a1b2c3defg45678

Yo = require 'yo-api'

yo = new Yo process.env.YO_TOKEN

yo.yo_link 'SHOKAI', 'http://shokai.org', (err, res, body) ->
console.log body


tesselからYoを送る

tessel-study/yo at master · shokai/tessel-study

前に書いたように起動してすぐwifiを再起動して、on ‘connect’後にネットワークを使う処理をするようにする。

var tessel = require('tessel');
var wifi = require('wifi-cc3000');
var Yo = require('yo-api');

var yo_token = process.argv[2];
var yo = new Yo(yo_token);

var led_green = tessel.led[0].output(1);
setInterval(function(){
if(wifi.isConnected()) led_green.toggle()
}, 500);

// wifiを再起動
wifi.reset();

wifi.on('connect', function(){
console.log('wifi connect');
yo.yo('SHOKAI', function(err, res, body){
console.log(err);
console.log(body.toString());
});
});


tesselに引数を渡す

普通API Tokenとかはコード中に書きたくないので、環境変数とか設定ファイルに書く。

tesselの場合、実行時の引数に渡せる。
コード中でprocess.argv[2]でyo_tokenを取得しているが、これは

% tessel run main.js $YO_TOKEN
% tessel push main.js --args=$YO_TOKEN --logs

こうするとargvに渡せる。

package.jsonのscriptsに書いておくとnpm testやnpm startで書き込めて便利。
{
"name": "yo",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "tessel run main.js $YO_TOKEN",
"start": "tessel push main.js --args=$YO_TOKEN --logs"
},
"author": "",
"license": "ISC",
"dependencies": {
"wifi-cc3000": "0.0.0",
"yo-api": "^1.0.0"
}
}

bundleFiles関数でtessel上でのコードにprocess.argvが設定されて、この後Luaに変換されてボードに書き込まれる。
これがtessel pushからはargvが渡らないバグがあったので修正したプルリクを送ったらmergeされた。

tessel runでは今のバージョンでもargv渡せる。tessel pushの方はそのうちnpmが更新されて使えるようになるまで待つか、俺のgithubからインストールするとかする。


nomnom

tessel cliではnomnomというoption parserが使われている。

複数のargvを渡す場合、–argsオプションを複数書く。

% tessel push app.js --args=foo --args=bar --args=baz

これでprocess.argvは
["tessel", "app.js", "foo", "bar", "baz"]
になる。

0

部屋がYo

Yo Developers API — Medium
から申請してAPI tokenをもらった。
1日後ぐらいにメールで来る。とりあえず「DELTAS112」と「IOTA411」の2つ申請した。


% curl --data=api_token=(token) http://api.justyo.co/yoall/
で全員にyo送れる。


nodeで書くとこんな感じ
request = require 'request'

yo = (token) ->
request.post "http://api.justyo.co/yoall/", {
form: {api_token: token}
}, (err, res, body) ->
console.log err
console.log body

yo "さっき取ったTOKEN"


増井研はDeltaS112とIota411という部屋にいて、それぞれの部屋のセンサが明るさとかlindaで流しているので、電気ついたらYoするようにした
もともと、部屋で電気つけたりすると「電気がつきました」とか音声で通知してたんだけど、
Yoを加えたら「デルタで」「Yo」「電気がつきました」とか陽気になった。



http://node-linda-base.herokuapp.com/delta?type=sensor
http://node-linda-base.herokuapp.com/iota?type=sensor


https://github.com/masuilab/linda-worker/blob/master/scripts/yo.coffee