話しかけるとカラアゲの画像を返すSlackbotを作った
鳩に「からあげ」的なことを言うと、からあげの写真を拾ってきて返すクレイジーなbotを作ったのでメモ。
googleの画像検索でもよかったんだけど、SearchAPIの縛りがめんどくさいしスクレイピングする気力もなかったので拾ってくる元はFlickrにしました。
用意するもの
- Node.js
- Botkit
- NodeのflickrAPIモジュール
- Flickrのアカウント
- Slackのアカウント
- 鳩の画像
Botkitの用意をする
こちらの記事を参考に、さくっとBotkitを導入します。
画像に鳩を設定して、名前をdove(野鳩)にしました。
Flickrのアクセストークンを取得する
Flickrのアカウント持ってる開発用のアクセストークンが発行できるので、もそっと作ります。
1アプリケーションにつき1トークンじゃないとだめだよ!とか言ってるので気をつけましょう。
ドキュメントページやらトークンの発行ぺーじやらがわかりにくいのでこちらを参考に。 syncer.jp
flickrAPIモジュールでもごもごする
ここからが本題。
flickrapiをnpm install
して使います。
Botkitのbot.jsにいろいろ追記。
controller.hears(['からあげ', '唐揚げ', 'カラアゲ', 'から揚げ'], 'direct_mention', function(bot, message) { var Flickr = require("flickrapi"); var flickrOptions = { api_key: "APIキーを入れる", secret: "シークレットキーを入れる" }; Flickr.tokenOnly(flickrOptions, function(error, flickr) { flickr.photos.search({ text: 'からあげ', color_codes: 1, media: 'photos', per_page: 100, safe_search: 1, extras: 'url_z' }, function(err, result) { var photos = result.photos.photo; var r = Math.floor(Math.random() * photos.length); bot.reply(message, 'クルッポー' + photos[r].url_z); }); }); });
「からあげ」的な発言の入ったmentionに反応します。
どうやらAPIにアクセスする方法が2種類あるっぽいのですが、今回は写真の取得ができればいいのでtokenOnly
で使います。
検索のオプションをいろいろ設定すると、JSのオブジェクトで返ってきます。
ランダムで1件取得、とかは出来ないので100件取ってきて1件抽出します。
最終的に鳩にテキスト(クルッポー)と画像URLをreplyさせて完成。
で、ただ喋らせるのもつまらないので、呼び出し元の発言にから揚げのアクションを付けます。
bot.api.reactions.add({ timestamp: message.ts, channel: message.channel, name: 'poultry_leg', },function(err, res) { if (err) { bot.botkit.log('Failed to add emoji reaction :(',err); } });
※から揚げがなかったので骨付き肉になりました。
Flickrにアクセスするたびに認証をさせられる件
で、コード自体は動くのですがいちいち謎の認証をさせられるようになりました、うざい。
ちょっとよくわからないんですが、Flickrのアクセストークンの種類をWeb ApplicationからDesktop Applicationに変更したら事なきを得ました。
登録済みのアプリ→編集から変更できます。ページはわかりにくい。
最終的なコードはこちら
controller.hears(['からあげ', '唐揚げ', 'カラアゲ', 'から揚げ'], 'direct_mention', function(bot, message) { var Flickr = require("flickrapi"); var flickrOptions = { api_key: "APIキーを入れる", secret: "シークレットキーを入れる" }; Flickr.tokenOnly(flickrOptions, function(error, flickr) { flickr.photos.search({ text: 'からあげ', color_codes: 1, media: 'photos', per_page: 100, safe_search: 1, extras: 'url_z' }, function(err, result) { var photos = result.photos.photo; var r = Math.floor(Math.random() * photos.length); bot.api.reactions.add({ timestamp: message.ts, channel: message.channel, name: 'poultry_leg', },function(err, res) { if (err) { bot.botkit.log('Failed to add emoji reaction :(',err); } }); bot.reply(message, 'クルッポー' + photos[r].url_z); }); }); });
HerokuのNode.jsチュートリアルメモ
Node.jsが動くサーバが欲しいっていったら「Herokuで頑張って」って言われたのでメモ。 環境の準備とかはやってもらったので、とりあえずチュートリアルをもごもご進めるだけ。
Herokuとは
PaaSってやつ。昔はRonR用だったけど最近は結構いろんな言語が動くみたい。 ちょっと前にSalesforceに買収された。 無償利用で使えるDBはPostgreSQLだけ。データ容量とかにも制限あり。
gitでソースをPUSHするとアプリをビルドして動く。
チュートリアルメモ
- テスト用のディレクトリを用意
- 用意したディレクトリに移動してチュートリアルのコードを何も考えずにターミナルにぶち込む
- PostgreSQLを入れる
大体こんな感じ。 Postgres.app経由でPostgreSQL入れると、psqlコマンド使うにはパスを通さないといけない。 忘れてた。
export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin
これを~/.bash_profile
に追記。(bashの場合)
というか素直にHomebrewで入れればよかったんじゃ、ないのか……
まぁいいか、これでしか使わないし…
黒い画面でGit触るのに慣れるのが早いか、何かしらのGUIアプリで動かせるようになるのが早いか……
jQueryの.on()でhover
普通に
$(document).on('hover', '.hoge', function(){});
って書いても動かなかった。
$(document).on({ 'mouseenter': function() { console.log('mouseenter'); }, 'mouseleave': function() { console.log('mouseleave'); } }, '.hoge');
こっちが正解。
which node
nodeのバージョン管理をnodebrewでやるに辺り、直接入れてたnodeアンインストールしようと思ったら全く出来ず。
3時間位潰した後にwhich nodeのコマンドを知る。
nodeが入ってる場所がわかる。
atsuco:~ atsuco$ which node /Users/atsuco/.nodebrew/current/bin/node
あぁぁぁあああ、すでにnodebrewで入っとるやーーん!!!
El Capitanにしたらgemとかの様子がおかしい
たぶんEl Capitanのせい。Ruby環境リセットされる、とか言ってる人もいる、こわい。
経緯
そもそも事の発端はstyle guideのhologramが動かなかったせい。
以前まで動いたのに、ちょっと触らないうちに動かなくなってる。その間に何かしたつったらOSアプデくらい。
仕方ないから入れなおそうと思ったらgem installが出来ない、なにこれ。
どうやらEl Capitanで採用されたセキュリティの影響で、sudoでも特定の範囲下では作業できなくなったらしい。
それの影響でgem installができないのか…
http://qiita.com/Sasaki_Akira/items/9d450f83f244dcfcc39e
rbenv使ってもごもごする
http://qiita.com/issobero/items/e0443b79da117ed48294
http://qiita.com/KohtaMiyairi/items/17377feedc7bf9b8c5e8
ココらへんを参考にrbenvでRubyをもごもごするところ(5番)までやる。Railsは一旦放置。
1−3は試したものの、すでにあるよ!と言われたので割愛
rbenv installが出来ない
もうなんなの。
どうやらこれもEl Capitanアプデの影響らしいので、↓のコマンドで解消。
http://qiita.com/Ys_Jn/items/f7ff03f7a890329c3e2a
無事にrbenv経由でRubyのアプデに成功。
目的の物をgem installして終了
無事出来ました。ただし、インストールするディレクトリを別途指定の必要あり。
http://qiita.com/AcaiBowl/items/4bb4708de03e6ee14a4a
↑にあるように、/usr/local/bin配下に入れました。
そもそも、Yosemiteの時点でRails環境の構築に死ぬほど悩まされたわけで。
暫く使わないのでRailsはいいよ、もう……