LINEとSlackを繋ぐline2slack-piperを作りました
この記事はwhywaita Advent Calendar 2016 13日目の記事です。
tl;dr
LINEの会話をSlackに流し込む皆さん向けのプロダクトを作りました。
概要
こんにちは、whywriteit 開発班(この12月から出来た新しい班です!)のwhywaitaです。
tl;drの項目で大体終わっているのですが、とりあえず作りましたのでご報告。
最近某社でインターンを始めまして、その職場でGolangを書き始めたところ楽しくなってしまったのでお勉強用に以前から欲しかったbotを作ってみました。
機能としては、LINE botとして常駐させておいて、botに話しかけるとその結果がSlackに通知されるものです。
LINEの問題点
LINEはそのアカウントの作りやすさから爆発的にユーザを増やし、様々な要因(以前からユーザが多かったSkypeのスマートフォン移植が最初期はとても使いづらかった、等)が相まって、日本では現在も多くのユーザが存在します。
トークを手助けするスタンプの存在だけでなく、お店のアカウントをフォローしておく事でクーポンが受け取れたり、LINEアカウントをプラットフォームとしたゲームアカウント、最近ではLINEアカウントを用いて電子決済を行えるようになるなど、急成長を進めているプロダクトです。
ですが、LINEには問題点が1つあります。複数端末での利用が考えられていない事です。
恐らくですが、アカウントログインがかなり排他的な実装になっており、携帯端末を移行する際も事前に処理を行っていないとトークのログが追えない所か、最悪アカウントにログインすら出来ない事態になってしまい、私の周りでも「携帯が変わったのでLINEのアカウントも変わった」という話がよく聞こえてきます。
現在はPCからログインする事で利便性が少しは高まっていますが、やはり通知能力が異常に低いと言って間違いではないでしょう。
これを解決する為に、近年エンジニア界隈で流行している「Slack」にLINEの会話通知をそのまま通知し、連絡が来ている事に素早く気づけるソリューションを開発しました。
LINE Messaging API
少し前に発表されたLINE Message APIというのを使っています。
以前のAPIと比較して最近はグループに参加させる事も可能なので、ログの保存について難しいLINEにおいてもSlackに投げる事で保存し続ける事が出来ます。
LINE notifyなどでIFTTTを使う事も出来るのですが、どうも相性が悪いらしく、勉強も込めてLINE APIをそのまま叩く事にしました。
問題点(ハマった点)
LINEの設定でグループに入れなかった
今回の新APIの大きな特徴としてグループ会話に参加出来るようになったのですが、何故か招待を行っても参加してこなかったので少し悩みました。
これはLINE Managerの設定を変更することで参加出来るようになっていました。1度参加させる設定にしていたはずなのですが、どうやら外れていたようです。1度確認してみるのをお勧めします。
LINE Manager→アカウント設定→Bot設定→Botのグループトーク参加 を変更する事でグループに参加させる事が出来ました。
LINEには「個人会話」「トーク」「グループ」が存在する
- 人と人の1:1の通話が「個人会話」
- 人を集めてから作るのが「トーク」
- 最初に部屋を作ってから人を募集するのが「グループ」
この違いに最初ハマりました。
最初は私のアカウントとbotアカウントで開発を行っており、上手く行ったのでグループに参加させて遊んでみたのですが、残念ながら動かず…
後でAPIのリファレンスを読んでいて気づいたのですが、この3つは全く別の処理として扱われているようです。
(実はこの辺の処理は公開リポジトリには反映されていません、プライベートな方にはあるのですが、グループIDなどがそのまま書いてあるのでそのまま公開は出来ず…時間が出来たら反映しておきます)
Herokuでgolangを動かす
折角プログラミングという物を始めたので、わざわざサーバを用意せずにHeroku上でやってみました。
Herokuは動作させるコマンドを Procfile
というファイルをリポジトリに用意してpushする事でそれが反映されるのですが、最初に以下のように書いていた所動作しませんでした。
cat Procfile
web: go run main.go
それもそのはずで、そもそもHerokuはbuildpackによって生成されたバイナリを起動させます。
Golangはコンパイルした後は1つのバイナリになるため、そのバイナリ名を書く必要がありました。
そのため、以下のように記載する事で上手く動きました。
cat Procfile
web: line2slack-piper
また、Heroku固有の問題として app.json
ファイルの記載がよく分からない事が挙げられますが、これはHerokuの公式ドキュメントを読む事で十分理解する事が出来ました。
グループの誰が発言しているかが分からない
Messaging APIを用いる事でグループにbotを参加させる事ができ、その会話も取得する事が出来るようになったのですが、「どのグループからの通知なのか」は分かっても、「そのグループに参加している誰の発言なのか」は残念ながら分かりませんでした。
この件についてはIssueも上がっているのですが、LINEの方によって全てクローズされており、「この機能を提供する予定は今の所ない」と明言されています。
https://github.com/line/line-bot-sdk-java/issues/40
この会話には3人発言しているのですが、残念ながらその3人を区別する術がありません。
まとめ
これでLINEの通知は全て気づけるようになりました。実際にとあるLINEグループで運用されていたのですが、誰が発言しているのか分からない問題が顕著となってしまい、最終的に私の個人slack(と言いながら参加者が20人ぐらい居ますが)のプライベートチャンネルに引っ越す事になりました。
やっぱりSlackは最高ですね。
終わりに
明日のwhywaita Advent Calendarの担当者は…居ません!!!!!!!!!!!!!!!!誰か!!!!!!!!!!!!!!!頼む!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1