東京こうていわ。てぃはるです。

 

突然ですがみなさんは効率化は好きですか?好きですよね。ほら、そのクエストどうやって3ターンで周回しようか考えてるでしょう?いつも苦労してます。スカディ孔明ください。
私は効率化が好きすぎて自動化専門のロボットメーカーに就職することになりました。自動化によって浮いた時間で遊ぶためです。(なお超忙しい模様)

 

Gnosinaでは、様々なツールを用いて運営の効率化を進めています。私が昨年この団の見学に来た時、団員がSlackを開いているのがチラッと見えて、おっやるなと思いました。これが入団を決めた理由です。嘘です。けど2割くらい本当です。残りは5割が選曲で2割が団員個々人のレベルで1割が練習の進め方です。理系はすぐ定量化したがる。

 

当団では、ファイル管理はGoogleドライブ、出席表はGoogleスプレッドシート、練習日程の調整は共有のGoogleカレンダー、連絡はSlack、そしてこれらを相互に連携させて効率化を進めています。初めて使うには難しいかもしれませんが、私が思うに、「入団テストを受けてまで入団しようという積極性がある人なら、なんとか使おうとしてくれるでしょう」。もちろん手厚くサポートしますのでご安心ください。

 

さて、そろそろ本題に入りましょう。Slackとはなんぞや。
Slackは高機能なビジネス用チャットツールです。団の運営においてはLINEよりもはるかに優秀と言わざるを得ません。単なる会話のツールとしてはLINEも手軽で悪くないとは思います。好きなキャラのスタンプ押せるし。
Discordとかの方がいいという方、今回はSlackとDiscordの比較はしませんので読み替えてください。
以下、LINEと比較して主観でメリットデメリットを挙げていきたいと思います。先にデメリットを挙げます。

 

・無料版では1万件の投稿を超えると古いものから見られなくなってしまう
・画像の自動圧縮やファイルの有効期限がなく、容量(無料では5GB)が決まっているため、いつか埋まってしまう
・ワークスペース(運営母体)ごとにアカウントを作る必要がある
・LINEのスタンプが使えない
・既読マークがない

 

1点目についてはログを外部に出力して保存しておけばOK、2点目についてはGoogleドライブなどに保存すればOKなのである程度打ち消せるデメリットです。それか課金すれば消えます。高いけど
3点目はWebサービスのアカウントを増やしたくない人には厳しいかもしれません。
4点目はLINEじゃないので当たり前ですが、代わりに自由に画像を設定できるリアクション用絵文字があります。
5点目については、既読は何か反応をもらわないと判断できないので負けています。

 

次にメリットを挙げます。

 

・単純にUIが使いやすい(LINE比)

・プライベートと完全に分離出来る
→LINEでは、○○団体○○係というグループを作ったとして、アカウントが一つなので、プライベートの他のグループと混ざってしまいます。また、相手によって表示名の使い分けができません。普段ハンネだと混乱します。

・他のチャンネル(グループのことをチャンネルといいます)の会話を、所属していなくても見ることができる、自分が参加する以前の投稿も見られる
→投げた仕事の進捗状況を見たり、場合によっては口出しができます。

・他のチャンネルの投稿をリンクとして引用できる
→会議チャンネルで決まった決定事項を、その流れごと全体に共有できます

・会話をスレッドにまとめることができる
→問題提起に対して、その議論や解答をスレッドにまとめることによって、ログが流れることを抑制できます。また、スレッドに関わっていない人には通知がいきません。

・投稿を後から編集できる

・豊富な拡張機能やAPI
→コマンドでリマインダーが設定できるのを始め、アプリ連携やプログラミングによる拡張の範囲が広いです。

 

 

雑にまとめ。複数の話題が同じ画面で並行して進むことが少なくなり、情報の閲覧性が非常に高いことが一番の魅力と思います。
Slackの良さは伝わりましたでしょうか。会話用チャットからビジネス用チャットに乗り換えようというお話でした。

 

さて、とは言えこれまでずっとLINE(あるいはメーリングリスト等)を使ってきた団体がSlackに乗り換えるためには、たくさんの障壁があります。特に大きいのが、初めて使う人への教育です。Gnosinaではがんばって壁を乗り越えたみたいです(入団前の話なので知らない)

 

次の話題は、SlackとLINEを同期することにより、シームレスに徐々に移動できるようにする方法についてです。これにより、使ったことがある人から順にSlackに移行していき、個人間で少しずつ支援をして残りの人も移行させていくことができます。他の人が使っている様子を見ながら自分で習得できる人もいるでしょう。一斉に教育するよりはコストがかからないように思います。

 

LINE側の発言が全部botからになってしまう、ノートが同期できない、スタンプ送れない、等の問題はありますが、テキストチャットとしてはほぼ同期が可能です。現在のところ企画合唱団おうたタイムきららで勝手に運用中です(おうたタイムきららは絶賛団員募集中です!女声!!!)。シュビドゥヴァーズでもLINE-Discord間で実装検討中らしい。内部情報。

 

具体的な方法についてですが、GoogleAppsScript(GAS)を使って簡便に行う方法を紹介します。自分でサーバ立ててもいいです。

 

1.GASの環境構築をする
2.LINEのbotを作る
3.Slackのwebhookを設定する
4.LINEbotから受け取った情報をSlackに投げるコードをGASで書く
5.Slackから受け取った情報をLINEbotに投げるコードをGASで書く
6.チャンネル分けやアイコン、表示名等の設定をする

 

1.GASの環境設定

Googleアカウントを作ります。
GoogleDriveを開きます。
GAS用のフォルダを作ります。
新規→その他→アプリを追加→GoogleAppsScriptを選択→新規→その他→GoogleAppsScript
スクリプトファイルを2つ作って、それぞれ”LINE_Slack”、”Slack_LINE”とでも名前を付けておきます。
公開→Webアプリケーションとして導入→プロジェクトバージョン「New」、アクセスできるユーザ「全員(匿名ユーザ含む)」
発行されたURLをコピペしてメモします。

 

2.LINEのbotを作る

LINE BOTの作り方を世界一わかりやすく解説(1)【アカウント準備編】 – Qiita

基本この通りに設定していきます。
最後のbot設定の画面で、Webhook送信・グループトーク参加を「利用する」にします。
Webhookの送信先には、1.の”LINE_Slack”で発行されたURLを設定します。
WebhookURLとChannelAccessTokenをどこかにコピペしてメモしておきます。
QRコードからbotを友達に追加し、テスト用のグループを作って招待します。

 

3.Slackのwebhookを設定する

SlackにIncomingWebhook、OutgoingWebhookのアプリを連携させて設定します。
OutgoingWebhookの送信先は、1.の”Slack_LINE”で発行されたURLを設定します。
他の設定は調べてがんばってください。

 

4.”LINE_Slack”のコードを書く

コピペしてください。

function doPost(e) {

var json = JSON.parse(e.postData.contents);
var user=GetLineProfile(json.events[0].source);

to_slack(json.events[0].message.text,user.displayName,user.pictureUrl);
}

// Slackの着信Webhookにメッセージを送信する
function to_slack(message,username,pictureUrl) {
var URL = 'スラックの着信WebhookURL'

var payload = {
"username" : username,
"text" : "[LINE]"+message,//[LINE]を頭につけてbotを判別
"icon_url" : pictureUrl,
"channel" : "#投稿するSlackチャンネル名"
};

var options = {
"method" : "post",
"contentType" : "application/json",
"payload" : payload
};
UrlFetchApp.fetch(URL, options);
}

function GetLineProfile(param) {
var URL = 'https://api.line.me/v2/bot/group/'+param.groupId+'/member/'+param.userId

var options = {
"method" : "GET",
"headers": {
"Authorization" : "Bearer " + "LINEbotのアクセストークン"
}
};
var fetch=UrlFetchApp.fetch(URL, options);
var response = JSON.parse(fetch.getContentText());
return response;
}

 

再びWebアプリケーションとして導入→バージョンNewで公開します。

 

5.”Slack_LINE”のコードを書く

function doPost(e) {

if(e.parameter.text.indexOf('[LINE]') != -1){//[LINE]が頭についていればbotなのでスルー
return;
}
to_line(e.parameter.text,e.parameter.user_name);

}

function to_line(message,username) {
var URL = 'https://api.line.me/v2/bot/message/push'

var payload = {
"to":"LINEのグループID",
"messages":[{"type":"text","text":"["+username+"]"+message}]
};

var options = {
"method" : "POST",
"contentType" : "application/json",
"payload":payload,
"headers": {
"Authorization" : "Bearer " + "LINEbotのアクセストークン"
}
};
UrlFetchApp.fetch(URL, options);
return;
}

 

グループIDについては、4.のコードにおいて

to_slack(json.events[0].message.text,user.displayName,user.pictureUrl);

の部分を

to_slack(json.events[0],user.displayName,user.pictureUrl);

としてLINEに投稿を行えばSlackで確認できます。(GAS上でログ出力してもいいですが)

Webアプリケーションとして導入→バージョンNewで公開。

 

6.チャンネル分けやアイコン、表示名等の設定をする

アイコンと表示名は、LINE→Slackでは上記コードで同期できています。
Slack→LINEでは、LINEbotからの発言になるので同期できません。代わりに発言の最初に[ユーザID]と表示します。

複数のグループで運用する場合、投稿先を条件分岐させる必要があります。
Slack→LINEでは、Slackの発信Webhookのトークンで、LINE→SlackではLINEのグループIDで仕分けするとよいと思います。

また、画像の送受信についても、まだ実装していませんが可能です。

 

4.と5.のコードは以下のサイトを参考にさせていただきました。
2018年版:slack→LINE連携 / LINE→Slackについて整理する – テクニカル×マガジン

slackをいつまでも見ないメンバーのためにLINEで通知するbotをお手軽に作る – Qiita

 

 

これらは実際に運用しているコードを簡略化したものです。
消し忘れて変数の対応がおかしかったりする箇所などあるかもしれません。
動作保証はしませんのでお気を付けください。

 

何かありましたらお問い合わせフォームか公式Twitterまで。
軽い質問やアドバイスでしたら私のTwitter(@t_halu)までお願いします。
プログラミング…というかWeb開発は初心者なのでいじめないでください。

 

ニコニコ技術部ならぬグノーシナ技術部設立を目論むてぃはるでした。どうやらうまくいきそうな雰囲気です。

それでは。