slackのガラケー対応を考えてみる
「いきなり何を言ってるんだ」と思うかもしれませんが、私が大学のサークルコミュニティでSlackを導入する際に、思わぬ障壁となったのが「ガラケー」の存在であります。
時は2017年12月。今時ガラケーしか使わない大学生が存在するのかと思いましたがそれはさておき、その人にだけ重要な情報が伝わらないのは非常に問題があります。
と言う訳で考えたのがSlackメッセージをメールで転送する方法です。
展望
だいたいこんな感じの展望にしました。ちなみにまだメールからSlackにメッセージする方法は確立していませんが、調べた感じZapierでできそうです。 ただ、Slackからメール転送を送る方法を確立している人は全くいなかったため今回の方法に至った次第です。使ったもの
-
Slack BotをGASでいい感じで書くためのライブラリ
- SlackBotをGASで超簡単にかけるようにしてくれるやつ
-
GoogleAppsScript(Qiitaの入門記事に飛びます)
- JSで色々かけるやつ
手順
では、実際に作っていくことにしましょう。今回はノンプログラマでもわかるよう丁寧に説明していきます。
1.Google Apps Scriptを起動する。
Google Drive → 新規 → Google Apps Script
で起動できます。
この際、自身のGoogleAccountにApps Scriptを紐づけている必要があります(詳しくは上記入門記事参照)。
2.ライブラリを導入する。
Google Apps Script(以下GAS)のメニュー画面からリソース→ライブラリ
で以下のポップアップが起動しますので、ライブラリを追加にこちらのコードを入れます。するとSlackAppというライブラリが導入できますので、バージョンを最新にしてあげて導入しましょう。
3.自身のSlackのAPI KEYを準備する
方法は下記の二つあります。どちらか好きな方を選びましょう
⑴自身のSlackの全てを掌握できるLegacyTokenを取得
こちらは簡単で、https://api.slack.com/custom-integrations/legacy-tokens から取得できます。こちらでも作れますが、メール転送くらいの機能にSlackを全参照できるTokenは必要ありませんので、推奨はしません。
⑵機能を限定したTokenを発行する
slackでは、SlackAppを作成してあげることで、機能を限定したAPIを発行できるようになっています。
Slack APIにアクセスし、横メニューからBuilding Slack apps → Create Slack App
でアプリを新規作成し、こちらの権限一覧を参考に下記のようにAPIのスコープを設定してあげましょう。
例↓
APIのスコープ設定(上記画面)は個別のアプリ管理画面からOAuth & Permissions
にアクセスすると、そのスコープのOAuth Access Token
の下の方のScopes
に表示されています。
4.取得したSlack API TokenをGASに導入する
OAuth & Permissions
で取得できるAPI Tokenをコピーして、GASのメニュー画面からファイル → プロジェクトのプロパティ → スクリプトのプロパティ
の順にアクセスします。
行を追加
をクリックし、以下のようにAPI TokenがGAS内で参照できるようにしてあげます。
5.Outgoing Webhooksを導入する
自身のSlackにOutgoing Webhooksを導入します。
新しく実装したい場合は自身のslackのappsからOutgoing Webhooks
を検索して上のようなページに進み、緑色のAdd Configuration
を押します。
新規作成画面に進むと思うので、そこからToken
を控えておきます。
6.コードを書く
function doPost(e) {
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var verify_token = "5で控えたToken";
if (verify_token != e.parameter.token) {
throw new Error("invalid token.");
}
var app = SlackApp.create(token);
var text = e.parameter.text
var channel = "#" + e.parameter.channel_name
var message_link = "http://wakagi.slack.com/messages/" + e.parameter.channel_id
var strTo='example@example.com'; //To
var strSender="太郎"; //差出人
// メール本文
var strSubject = "slackからの通知"; //件名
var strBody = e.parameter.user_name + "からのメッセージ\nチャンネル:"+ channel + "\n\n"+ text + "\n\n" + "チャンネルへのリンク:" + message_link + "\nby http://example.slack.com" ;
//メールを送信
GmailApp.sendEmail(
strTo,
strSubject,
strBody,
{
name: strSender
}
);}
1行ずつ解説していきましょう。
function doPost(e)
doPost
メソッドによって、SlackAPIからのPOSTリクエストを受け取ることでスクリプトが発火します。こちらはGASによって定義されています。引数e
にはslackから送信されてきたPOSTリクエストデータが入ります。
var verify_token = "5で控えたToken";
Outgoing Webhooks内で生成され、控えたTokenを""に代入しましょう。このTokenでOutgoing Webhooksの一つのConfigurationと結びつけています。
var app = SlackApp.create(token);
上でtokenに代入した値を使ってSlackAppのライブラリを呼び出しcreateしています。その処理をappに代入しています。
var text = e.parameter.text
SlackAPIで送信されてきたPOSTリクエストのパラメータは変数e
に格納されています。e.parameter.text
でメッセージを取り出します。
token=YGt06HJsGZqpP1V9CUUikqcj
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
var strBody = e.parameter.user_name + "からのメッセージ\nチャンネル:"+ channel + "\n\n"+ text + "\n\n" + "チャンネルへのリンク:" + message_link + "\nby http://example.slack.com" ;
こちらがメールの本文になります。ここは任意で送信したい内容構成を編集してstrBody
に代入しましょう。
GmailApp.sendEmail
ここでGmailAppを使用します。GASではGmailAppを使うことでログインしているGoogleアカウントのGmailAPIを承認するだけで使うことができます。
そして、sendEmail
でメールが送信されます。
7.コードを保存して導入
コードを任意のファイル名で保存してあげて、Slackに導入します。
まず、GASのメニューから 公開 → ウェブアプリケーションとして導入
を選択します。
プロジェクトバージョンを必ず最新に設定して、公開してあげます。
この時、Googleアカウントの承認を色々求められるので、全て承認してあげます。色々注意書きが出ますが、めげずに全て承認してあげましょう。
最後に表示されたURLをコピーしておきましょう。
8.コピーしたURLをOutgoing Webhooksに導入
作成したOutgoing WebhooksのIntegration Settings
内のURL(s)
に先ほど7で取得したURLを入力してあげます。
合わせてIntegration Settings
内の転送対象のChannelと転送するメッセージのトリガーワード(Trigger Word(s):このスクリプトが反応する言葉)を設定しましょう。例えば私の場合、最初に@channelのつくメッセージを転送したかったので<!channel>
と入力しました。
@のつくメンションワードを設定する場合は、そのユーザー固有のIDや、独自の記法が必要なので、ご注意ください。
例えば今回の場合@channelは<!channel>
としてslack上で処理されていますので、Triggerでも同じように指定してあげる必要があります。
最後に必ず全ての設定を保存してあげましょう。
9.テストで自分のメールに送ってみる
ここまでできたらstrToに自分のメールアドレスを設定してあげて、Outgoing Webhooksの対象チャンネルにトリガーワードをつけて投稿してみましょう。うまくいっていればメールが送られてくるはずです。
感想
SlackAPI面白い。というかこれとGASがなんでもやってくれすぎてすごい。
参考リンク
お世話になった記事。以下のリンクを参考にすれば他のSlackBotも実装できます。