バイオインフォをやっている大学院生です。プログラミングのことなどを書きます。

GASで無料で定期的に実行するSlackボットを作る

Slackに定期的に投稿をするボットを作ります。

今回はSlackのWebAPIを設定して、Google Apps Script(GAS)からslackへ投稿する方法を紹介します。

GASはGoogleのサーバー上で動くサービスで、無料で使うことができます。 (制限があるので注意。すごく頻繁にやったりしなければslackのbotくらいなら引っかからないと思います。

【GAS】Google Apps Scriptで注意すべき制限まとめ【実行回数・時間・容量】 | monoblog )

f:id:feb_march:20200409211948j:plain
やり方イメージ

slackアプリの作成

まずSlackアプリの作成から始めます。

api.slack.com

このページのCreate New Appというボタンを押します。

f:id:feb_march:20200409212239p:plain

するとこのような画面が出てくるので、作りたいアプリの名前と、そのアプリをどのワークスペースに紐づけるかを設定します。ブラウザでログインしていないワークスペースは選択できるワークスペースに出てこないので、Sign in to another workspaceというところから目的のワークスペースにログインしてください。これでアプリの作成は終わりです。

アプリの権限の設定

次に作成したアプリで、投稿に必要な設定をします。左側のメニューから、OAuth&Permissionを開いてください。その中のScopeの設定で、Bot Token Scopesの設定を行います。この設定は、このアプリに与える権限を設定します。

f:id:feb_march:20200409213120p:plain

いま、channels:read、chat:write、chat:write.publicという3個のスコープを設定しました。chat:write.publicに関しては、このbotがメンバーでないチャンネルであっても投稿することを許可します。このアプリが投稿できるチャンネルが絞られているのであれば、chat:write.publicのスコープは必要ありません。

では、OAuth&Permissionsの一番上のほうにある、Install App to WorkSpaceを押してください。今設定したスコープに応じて、権限が要求されるので、問題がなければ許可して進んでください。

インストールが終わると、Bot User OAuth Access Tokenが表示されます。このトークンが投稿するのに必要なので、どこかにメモしておいてください。他の画面に映ってしまっても、この画面にくればいつでも確認することができるので安心してください。

インストールできたら、投稿したいチャンネルにアプリを追加してください。chat:write.publicのスコープを追加していなかった場合、アプリは自分が追加されていないチャンネルには投稿ができないので、投稿ができません。

curlで投稿するテスト

とりあえずcurlコマンドで投稿できるかやってみましょう。ターミナルから、下のコードを実行してください。

url -X POST -d "Content-Type: application/json" -d "token=TOKEN" -d "channel=CHANNELNAME" -d "text=hello" https://slack.com/api/chat.postMessage

TOKENをさきほど取得したBot User OAuth Access Tokenに置き換えてください。CHANNELNAMEは投稿したいチャンネルの名前です。チャンネル名の前の#はあってもなくても大丈夫です。 うまくいっていれば次のように投稿ができます。

f:id:feb_march:20200409215001p:plain

なお、Windowsの場合はcurlコマンドがデフォルトで入っていないそうなので、試すにはインストールが必要になります。面倒だったらここは飛ばして、次パートでGASからの投稿をしてしまうのでいいでしょう。

GASを使って定期的に実行する

Google Apps Scriptを使って、定期的に実行することができるようにしましょう。GASはGoogleのサーバーで実行され、サーバーを自分で準備したりすることなく、手軽に実行環境を用意することができます。 まずGoogleDriveにアクセスして、適当なところで右クリックしてその他からGoogle Apps Scriptを選択してください。

まずトークンを設定します。ファイル->プロジェクトのプロパティ->スクリプトのプロパティにアクセスして、tokenという名前でアプリのトークンを入力してください。 エディタを次のように編集します。MESSAGEを自分が投稿したい文章に、CHANNEL NAMEを投稿したいチャンネル名に変更してください。

var token = PropertiesService.getScriptProperties().getProperty("token")
var text = "MESSAGE"
var channel = "CHANNEL NAME"
function post_to_slack() {
  post(text,  channel)
}

function post(text, channel){  
  var data = {
    "text":text,
    "channel":channel
  }
  var options = {
    "method":"post",
    "contentType":"application/json",
    "headers":{"Authorization":"Bearer "+token},
    "payload":JSON.stringify(data)
  }
  var ret = UrlFetchApp.fetch("https://slack.com/api/chat.postMessage",options)
  Logger.log(ret)
}

できたら、上のタブから実行→関数を実行→post_to_slackを選択して、このスクリプトを実行してください。slackに投稿できたら大丈夫です。 次に、定期的に実行させるために、トリガーの設定を行います。上のタブから編集→現在のプロジェクトのトリガーを選択してください。

f:id:feb_march:20200409220822p:plain
GASのトリガーの設定
このように設定すると、毎日午後7~8時の間にコードが実行されるようになります。

おまけ: Pythonからの投稿例

Pythonから投稿する場合のコード例です。

import requests
import json

d = {}
d["text"] = "Hello"
d["channel"] = "CHANNEL NAME"

token = "your token"
h={}
h["Authorization"] = "Bearer "+token
h["contentType"] = "application/json"

r = requests.post("https://slack.com/api/chat.postMessage", data=d, headers=h)