LINEとSlackを繋ぐline2slack-piperを作りました

この記事はwhywaita Advent Calendar 2016 13日目の記事です。

tl;dr

LINEの会話をSlackに流し込む皆さん向けのプロダクトを作りました。

概要

こんにちは、whywriteit 開発班(この12月から出来た新しい班です!)のwhywaitaです。

tl;drの項目で大体終わっているのですが、とりあえず作りましたのでご報告。

最近某社でインターンを始めまして、その職場でGolangを書き始めたところ楽しくなってしまったのでお勉強用に以前から欲しかったbotを作ってみました。

機能としては、LINE botとして常駐させておいて、botに話しかけるとその結果がSlackに通知されるものです。

line2slack-line

line2slack-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

line2slack-talk

この会話には3人発言しているのですが、残念ながらその3人を区別する術がありません。

まとめ

これでLINEの通知は全て気づけるようになりました。実際にとあるLINEグループで運用されていたのですが、誰が発言しているのか分からない問題が顕著となってしまい、最終的に私の個人slack(と言いながら参加者が20人ぐらい居ますが)のプライベートチャンネルに引っ越す事になりました。

やっぱりSlackは最高ですね。

終わりに

明日のwhywaita Advent Calendarの担当者は…居ません!!!!!!!!!!!!!!!!誰か!!!!!!!!!!!!!!!頼む!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

Dentoo.LTを引き継いでバトンを渡した話 #dentoolt

この記事はLT Advent Calendar 2016 3日目の記事です。

昨日は id:masawadaさんの4年前、大学でLT大会を始めた – masawadaの日記でした。


こんにちは、whywriteitイベント班のwhywaitaです。
LT Advent Calendarという事で、電気通信大学で開催しているDentoo.LTの主催3名連続でお邪魔させて頂いております。
軽い荒らしのようになっていますね。お気に障った方はすみません。

昨日、masawadaがこのような事を書いていました。

以来、Dentoo.LTは公式に電気通信大学MMAのイベントとなり、回を重ねるにつれ大学の信用を勝ち取り、オープンキャンパスなどでイベントのオファーを頂くまでに成長しました。このあたりの話はid:whywaitaくんが書いてくれるんじゃないかなと期待しています。

実は以前にもDentoo.LTの続け方 – なぜにぽえむという記事を書かせて頂いたのですが、この記事には結果しか書いていなかったので、その過程辺りを書かせて頂こうかと思います。


[ここに様々な前提があったのだがそれを全て検閲削除とする]
こうして、私は大学当局との信頼関係を得る事が出来ました。
信頼を得た後は、その信頼を損なわないよう、またその信頼が更に上がっていくようにシフトしていきました。

信頼を損なわないためには、こちらがやるべき事をちゃんとやる、という事が重要です。一般的に言えば当然至極の事なのですが、これをキッチリやる事に意義がある訳で、後輩の主催者にはしっかり理解して頂けるよう推進しています。

信頼を上げる為には、いくつかの方法がありますが、主に「継続していく」「成果として分かりやすい物を出す」の2つが重要では無いかと考えています。
どんな形であれ継続していく事は大切です。Dentoo.LTは3ヶ月に1回、1年に4回の開催を心がけており、定期的に開催する事で参加者の方の皆さんも予定が立てやすくなり、少しずつ参加者を増やすことが出来ます。
併せて言えば、Dentoo.LTは基本的に日曜日開催を心がけています。大学機関なので平日の方が様々なご担当者の方がいらっしゃるので開催はしやすいのですが、参加者の皆さんが参加しやすいようにと、出来るだけ日曜日開催に出来るよう頑張っています。

継続する事で、成果は分かりやすく出す事が出来ます。
そもそも「何年間継続してイベントが開催されている」という点でも大きな成果ですし、例えば「権威のある〇〇さんが登壇された」や「〇〇人参加者が集まった」などなど、分かりやすい物が生まれてきます。
このような分かりやすい数字は意外と効いてきます。対外的な説明をする際にも色々と言えてかなり便利です。
自分から成果を出そうと躍起になる事はあまりないのですが、ちょっと頑張ってみたり、続けてみたりしてみると自ずと結果がついてくるのではないかと思います。


こういう信頼を得ることで、前述した通りDentoo.LTは大学の行事であるオープンキャンパスの一環として開催したり、学園祭である調布祭の一行事として参加しました。
特にオープンキャンパスは入学を考えている高校生の皆さんが来る場で開催する訳ですから、中々一学生サークルである我々が参加することは難しいのですが、様々な交流の中でオファーを頂き、開催させて頂きました。
その際に参加していた高校生の中で数人は「Dentoo.LTを見て電気通信大学に行く事を決めました」という嬉しい事を言っておいてくれたりします。開催して本当に良かったと感じています。


という訳でバトンを引き取って渡した辺りの話をさせて頂きました。
本当に大変だった部分は私としても是非文章として残したいと以前から思っているのですが、様々な事情があり今回も検閲削除となってしまいました。申し訳ないです。

もし興味のある方がいらっしゃいましたら、恐らく直接であればお話出来るとは思いますので、1度何処かでお声がけ頂けますと幸いです。
(恐らくかなり長くなるので、覚悟してお声がけ下さい)


私はDentoo.LT #13を最後に主催を交代しました。明日の担当は次の主催者(であり現在の主催者)である@benevolent0505 くんです。