.log

ドットログ。思いついた、調べたメモ。主にフロントエンド、たまに写真とか料理とか。

話しかけるとカラアゲの画像を返すSlackbotを作った

f:id:atsuco02:20160220125621p:plain 鳩に「からあげ」的なことを言うと、からあげの写真を拾ってきて返すクレイジーなbotを作ったのでメモ。

googleの画像検索でもよかったんだけど、SearchAPIの縛りがめんどくさいしスクレイピングする気力もなかったので拾ってくる元はFlickrにしました。

用意するもの

Botkitの用意をする

toach.click

こちらの記事を参考に、さくっとBotkitを導入します。
画像に鳩を設定して、名前をdove(野鳩)にしました。

Flickrのアクセストークンを取得する

www.flickr.com

Flickrのアカウント持ってる開発用のアクセストークンが発行できるので、もそっと作ります。
1アプリケーションにつき1トークンじゃないとだめだよ!とか言ってるので気をつけましょう。

ドキュメントページやらトークンの発行ぺーじやらがわかりにくいのでこちらを参考に。 syncer.jp

flickrAPIモジュールでもごもごする

ここからが本題。 flickrapinpm 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に変更したら事なきを得ました。 f:id:atsuco02:20160220145447p:plain

登録済みのアプリ→編集から変更できます。ページはわかりにくい。

最終的なコードはこちら

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するとアプリをビルドして動く。

チュートリアルメモ

  1. テスト用のディレクトリを用意
  2. 用意したディレクトリに移動してチュートリアルのコードを何も考えずにターミナルにぶち込む
  3. PostgreSQLを入れる

大体こんな感じ。 Postgres.app経由でPostgreSQL入れると、psqlコマンド使うにはパスを通さないといけない。 忘れてた。

export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin

これを~/.bash_profileに追記。(bashの場合) というか素直にHomebrewで入れればよかったんじゃ、ないのか…… まぁいいか、これでしか使わないし…

黒い画面でGit触るのに慣れるのが早いか、何かしらのGUIアプリで動かせるようになるのが早いか……

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はいいよ、もう……