2017年12月16日土曜日

LINE スタンプを家族 Slack でも使えるようにしたお話

概要

先日「むすめちゃんスタンプス」という LINE スタンプを公開しました



せっかくスタンプを作成したのですが、前回の記事で紹介したように家族の連絡に LINE を使うのをやめてしまいました
これはもったいないと思い Slack でもスタンプが使えないかなと調べたところ微妙なやり方ですができそうだったのでそのやり方を紹介したいと思います

仕組み

やり方は正直たくさんあると思います
ググってみると同じような内容の記事がいろいろと出てくると思います

今回紹介するのはボットを使う方法です
と言っても大元の機能は Slack にある画像の URL を投稿するとその画像を取得してチャネルに流してくれるという機能を使います
察しの言い方はもうだいたい仕組みがわかると思います

今回の構成は以下の通りです
line_stickers_to_slack1.png

ボットをコマンド形式にする場合 @bot help みたいな感じでボットを呼び出しますが、それだとスタンプを呼ぶのに少し面倒なのである特定の自然言語でコメントするとそのコメントにあった画像のスタンプを投稿する感じにしています
Slack の API はイベント API を使いメッセージの受信のイベントをハンドリングします

ボットは今回 Ruby で作成しました
Slack には Hubot Apps があるので Hubot を使って簡単に作成することもできますが、Ruby が好きなので Ruby で作成しました
あとはそれを Heroku 上で動かします

スタンプ画像をどうやって公開するか

これが一番悩んだかもしれません
Slack に画像の URL を投稿する場合はその URL はパブリックな URL でなければなりません
なので認証がかかっていたり、アクセスできないネットワーク上にある画像では Slack 上に表示することができません

とは言えば自分でサーバを立ててスタンプ画像だけを配信するのも大げさかな、、、
ボットを Heroku 上で動かすのでそのボット上で画像の配信を行ってもよかったのですがボットと画像配信用の Web アプリを同居させるのが面倒くさそうでやめました

で、最終的な結論は imgur にしました
無料で使えて画像への直リンクも取得可能です
また、URL が短いのも魅力でした
Slack に画像の URL をボットが投稿したときに異様に長いとスタンプっぽさがなくなってしまいます

imgur にはアルバムレベルで限定公開できる機能もあるの今回はそれを使って画像をホスティングしてます

ボットを作成する

あとは imgur でホスティングした画像の URL を Slack にポストするボットを作成すれば OK です
今回はコマンドベースではなく自然言語を特定してマッチした場合に imgur の画像 URL を Slack 上にポストします
なので、イベント API を使って message イベントに反応するボットを作成します

一から API をコールしても良いですが Ruby で Slack ボットを作成するための slack-ruby-bot というライブラリがあるのでこれを素直に使います

コードは以下の通りです

  • vim bot.rb
require 'slack-ruby-bot'
require 'json'
SlackRubyBot::Client.logger.level = Logger::WARN

class Bot
  def initialize
    @answer = JSON.parse(File.read('./answer.json'))
  end
  def call(client, data)
    client.say(text: @answer.keys.join(", "), channel: data.channel) if data.text == "へるぷ"
    client.say(text: @answer[data.text], channel: data.channel) if @answer.has_key?(data.text)
  end
end

server = SlackRubyBot::Server.new(
  token: ENV["TOKEN"],
  hook_handlers: {
    message: Bot.new
  }
)
server.run

非常にシンプルに書けるのがうれしいです
別途 answer.json という自然言語と画像の URL を紐付ける設定ファイルを用意しましょう

  • vim answer.json
{
  "えっへん": "https://i.imgur.com/I5OjXAn.png"
}

こんな感じです
これをスタンプ 40 個分追加していきます
エイリアス的なの張りたいのであれば同じ URL に対して別のキーワードを紐付けてあげれば OK です
今回はおまけで「へるぷ」という文字列が来たときには json に記載されているキーワードの一覧を表示するようにしてみました

あとは Procfile なり、Dockerfile なりを準備して Heroku への push or container:push をすれば OK です
Procfile の場合は Web アプリではないので push 後に heroku ps:scale bot=1 的なことをしてあげましょう

ボットが起動したら忘れずに環境変数でトークンを設定してあげましょう

  • heroku config set TOKEN=xoxb-222222222222-xxxxxxxxxxxxxxxxxxxxxxxx

動作確認

Heroku 上にデプロイできたらボットと会話してみましょう
こんな感じで画像 (スタンプ) が表示されれば OK です
line_stickers_to_slack2.gif

問題点

実は今回の方法には大きな欠点があります
それは同じ画像 URL が連投されると Slack さんがその画像を展開してくれないという点です

今回、画像のホスティングに imgur を使ったので URL を変更するのは結構大変なので回避する方法はありません
適当に文字をコメントしてから再度ボットから画像を取得するようにしてください

うーん、やってしまった、、、ごめんなさい

最後に

自作 LINE スタンプを作ったので Slack 上でも使えるようにしてみました
欠点ありですが、個人で使う分にはこのレベルで十分かなと思います
無料ですし簡単な技術しか使っていないので

ついでに宣伝ですが LINE スタンプ出してるのでよろしくお願いします


2017年12月4日月曜日

プライベートの連絡に LINE ではなく Slack に移行した話

概要

家族の連絡にずっと LINE を使っていたのですが、Slack に移行したのでそのメリットやデメリットを紹介したいと思います
ちなみに移行してまだ 2 週間ほどなので、今後更にメリット、デメリットが分かる可能性はあります (その際は追記でもしようかなと)

この手の記事は他の方もいろいろと紹介しているのでこの記事も参考程度に見てもらえればと思います

環境

  • LINE アプリ iOS 版 (iPhone5 + mineo Aプラン)
  • Slack アプリ iOS 版 (iPhone5 + mineo Aプラン)
  • Slack クライアント macOS 版 (10.13.1)

なぜ移行したか

まず初めにそもそも移行が必須というわけではありませんでした
が、日頃 LINE を使う上で少し問題があり「LINE よりも Slack の方が良さそうなんじゃないか」と思い Slack に移行してみました

移行したと言っても完全に移行したわけではなく、あくまでも家族のやり取りを Slack に移行しただけでそれ以外の友人などとはこれまで通り LINE を使っています

移行する上で問題だったことや逆に Slack になって問題になったことや導入するにあたって問題だったことを紹介したいと思います

LINE を使う上で問題だったこと

まず日頃から使っていた LINE の問題ですがざっくり以下の通りです
(環境によって発生しないケースもあるらしいのであくまで自分の環境での問題です)

  • 新着メッセージ到着時にプッシュ通知が届かないケースがあった (これが一番)
  • スマホアプリへのログインは 1 アカウント 1 端末しかできない制約がある

それぞれ詳細に説明します

まず 1 つ目のプッシュ通知が届かない問題ですが移行理由としてはこれが一番大きかったかなと思います
いろいろと症状や原因を調べてみると他の人も同じようにプッシュ通知が届かないケースがあり自分だけではないということがわかりました
原因の 1 つに回線や端末、またその組み合わせ等の問題があるようで、もしかすると自分の環境 (iPhone5 + mineo、この環境は家族も同様) が悪かったのかもしれません
アプリを再インストールしたり再ログインをし直したりしてみましたが症状は解消されませんでした

プッシュ通知は届かないわけではないのですが、アプリを開かないと届かないというケースがかなり多かったです
誰かにメッセージを送らないとと思い LINE アプリを起動すると「ブー」と言ってプッシュ通知が届きメッセージを見ると昨日や一昨日のメッセージだったなんてことが結構ありました

リアルタイムで受け取りたいのに、プッシュ通知が届かないとそもそも LINE を使っている意味がないかなーと思った感じです

そして 2 つ目の 1 アカウントでログイン可能なスマホ端末は 1 台までという制約ですがこれも大きな理由の 1 つです
そもそもこの問題がなければ別のスマホに LINE アプリをインストールしてそっちでプッシュ通知を受け取ることができたかもしれません

ご存知の通り Slack アプリではこの制約はありません
いろんな端末に Slack アプリをインストールして 1 つのログインアカウントでそれぞれの端末にログインすることができます
もちろんメンションやチャネルに新規メッセージが来た場合は Slack アプリをインストールしたすべての端末にプッシュ通知が届いてくれます

という感じで LINE で起きていた大きな 2 つの問題は Slack さんを使えば解決できるということが分かり移行した感じです

移行するのにポジティブな理由

上記はネガティブな理由ですがポジティブな理由もあります

  • 作業端末の Mac に Slack クライアントが常駐している
  • 「xx is Typing」の機能が便利
  • Bot やスラッシュコマンド、拡張絵文字が使える

簡単に詳細を説明します
1 つ目の Mac のクライアントが常駐しているというやつですが自分の場合、普段から Slack をプライベートで使っています
そこに家族チャネルを作ってやり取りするようにしました
なので、家族用のチームを新規で作成するということはしていません
メッセージのプッシュ通知はスマホにも届きますが、Mac のクライアント側にも届きます
作業中は主には Mac とにらめっこしているので返信もそのまま Mac でできます
返信のためにわざわざスマホでアプリを起動する必要がないので楽です
クライアントアプリって話であれば LINE にも Mac 用のクライアントアプリがあるのでそれを常駐させれば良いだけという話ではあるのですが、それだと自分しか解決に至らないのでダメでした

2 つ目の「xx is Typing」は LINE にはない機能で普段家族とメッセージをやりとりするのに必須だとは思っていませんが、あると意外と便利だということに気が付きました
LINE の場合たまーに返信が早すぎて話が前後することがあったのでそれを回避することができます
これは心理的な問題でもあるので必須ではないですが個人的にはあったほうがやりやすいなと思いました

3 つ目の Bot やスラッシュコマンド、カスタム絵文字ですがこれも Slack にしかない機能かなと思います
今のところ家族 Slack で Bot やスラッシュコマンドが必要なケースはほとんどありませんが、今後使っていこうかなと思います (後述)

ポジティブな理由はそんな感じです

Slack に移行して問題になったこと

では逆に Slack に移行して問題になったことを紹介します

  • スタンプがない
  • Slack のアカウント取得からアプリの設定をやってあげないと導入は厳しい

それぞれ詳細に説明します
1 つ目のスタンプ問題は言わずもがなかと思います
Slack には絵文字の機能があるのでそれで代用することは可能です
可能ではあるのですが完全に代用というわけにはいきません
絵文字がない場合、普段スタンプのみの会話で済んでいたのが、スタンプがないために文字の会話にせざるを得ません

また、例えば家族用に自分で頑張ったスタンプがある場合にも使うことができません
どうしても使いたい購入したスタンプがある場合も同様です

ただー Slack には Bot やスラッシュコマンドの機能がありこれらを使えば「スタンプっぽいこと」を実現することは可能です
ご存知の通り Slack には画像の URL を投稿するとそこから画像を取得してポストしてくれるという機能があります
これを使って画像をスタンプを配信するサーバなり Bot を構築してあとはそれらを GET するスラッシュコマンド or Bot のコマンドを作成すれば OK です
自分も今試し中なのでやり方や使い勝手が分かれば別記事で紹介したいと思います

そして 2 つ目のアカウント取得ですが、これはやって上げることをオススメします
家族のみんながネットリテラルがある程度あり「Slack アカウント取得したら教えて」というレベルのお願いでやってくれるのであれば何ら問題はないですが「Slack?は?」「アカウント取得?は?」という感じなのであれば正直全部やってあげるのが最善だと思います
もちろん言葉でやり方を説明してやらせることは可能ですが、それでも難しいと思います
いずれやってくれるかもしれませんが導入障壁を上げるだけなので素直にやってあげましょう
メールアドレスの認証はさすがにやってもらうしかないので「自分のアドレスに確認の URL が届いてるからちょっとタップしてもらえる」と言って一緒に画面を見ながらやってもらいました
あとは好きなチームに invite して家族チャネルに invite してあげれば OK かなと思います

たぶん家族 Slack を導入するにあたっての一番の障壁はここだと思うので頑張ってやってあげましょう

最後に

家族の連絡を LINE をやめて Slack に移行したので、そのメリット、デメリットを紹介しました
今のところ問題なく使えているので今後も Slack でやっていこうと思っています
たぶんフリープランだけで事足りると思います
過去のメッセージを全部辿りたい場合やたくさん Bot を入れたいなどあれば別ですが、まぁないと思います

今後も使い続けて更に何か分かればまた紹介したいと思います