Slack Event APIをGASで使おうとして失敗した
ScriptEditorから新規スクリプト作成
ここを開いて保存する
ライブラリを追加する
OAuth2用のライブラリを追加する
ツールバーの[リソース]->[ライブラリ...]にを選択して以下のIDを入れて選択
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
最新のバージョンを選択して保存する。
Slack Appsを登録
ここで登録する。
Redirect URIにhttps://script.google.com/macros/d/{SCRIPT ID}/usercallback
を設定する {SCRIPT ID}
はスクリプトエディターのツールーバーの[ファイル]->[プロジェクトのプロパティ]から確認できる。
コードを書く
SlackAppsの管理画面からClient ID
とClient Secret
をコピペする
細かい説明はコメントとライブラリのGitHubへ
var clientID = "...";
var clientSecret = "...";
// doGetはWebアプリケーションとして公開したとき呼ばれる関数
// HTMLとかを返す
function doGet(request) {
var slackService = getSlackService();
// アクセストークンを持ってるか調べる
if (!slackService.hasAccess()) {
var authorizationUrl = slackService.getAuthorizationUrl();
var template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>.');
template.authorizationUrl = authorizationUrl;
return HtmlService.createHtmlOutput(template.evaluate());
} else {
return HtmlService.createHtmlOutput('OK');
}
}
// slack から戻ってきた時呼ばれる関数 HTMLを返せる
// 本来はリダイレクトしてアプリケーションに戻ってもらうのがいい
function authCallback(request) {
var slackService = getSlackService();
var isAuthorized = slackService.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied.');
}
}
// 手動実行して消せる
function clearService(){
OAuth2.createService('slack')
.setPropertyStore(PropertiesService.getUserProperties())
.reset();
}
// OAuth2の設定
function getSlackService() {
return OAuth2.createService('slack') // 任意の名前 slack使うからslackにしてる
.setAuthorizationBaseUrl('https://slack.com/oauth/authorize')
.setTokenUrl('https://slack.com/api/oauth.access')
.setClientId(clientID)
.setClientSecret(clientSecret)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties()) // https://developers.google.com/apps-script/guides/properties
.setScope('bot chat:write:bot channels:read channels:history'); // 複数scopeはスペース区切り
}
保存したら
ツールバーから[公開]->[ウェブアプリケーションとして導入]を選択して公開する。
作ったTokenを使うには
slackService.getAccessToken()
でアクセストークンが取得できる
取得したTokenの使い方は自分でpayload作ってもいいのだがめんどくさいので @soundTricker さんが作ったSlackライブラリを使うのが一番手っ取り早い 詳細は以下の記事を参考にしてください
Slack BotをGASでいい感じで書くためのライブラリを作った
初期化コードはこんな感じ
var slack = SlackApp.create(getSlackService().getAccessToken());
まとめ
OAuth2のライブラリ便利だー
ちなみに失敗したってのはSlackのEvent APIを受け取るdoPostでリザルトのJSONへ辿り着くのにリダイレクトが一回挟まるが
Slackは別にリダイレクトしてくれないためエラーとなるからです。
起きたらAppEngineでリトライする