GAS を使って Slack コマンドが受け取った文字列を別のサーバに POST 送信する
Google Apps Script (GAS) で POST 送信する方法。
以前、Twitter API をコールする GAS スクリプトを書いたが、今度は Twitter のようなサードパーティライブラリが用意されていないサーバに対して、ローレベルに POST 送信をしてみる。
早速だが、実装は次のようになる。組み込み関数の UrlFetchApp.fetch()
を使う。
/** Slack Verification Token */
const slackVerificationToken = '【Slack App のトークン文字列】';
/**
* Slack からの Slash Command を受け取る
*
* @param {*} event イベント
* @return {*} JSON レスポンス
*/
function doPost(event) {
// Slack トークンチェック
const verificationToken = event.parameter.token;
if(verificationToken !== slackVerificationToken) {
throw new Error('Invalid Token');
}
// Slash Command のメッセージ部分を取得する
const text = event.parameter.text;
// POST 送信する内容を組み立てる
const payload = {
slackText: text
};
// POST 送信する
const response = UrlFetchApp.fetch('http://example.com/submit.php', {
method : 'post',
payload: payload
});
// レスポンスの JSON をパースする (resultMessage プロパティがあるテイ)
const responseJsonData = JSON.parse(response.getContentText('UTF-8'));
// Slack へ応答メッセージを返す
return ContentService
.createTextOutput(JSON.stringify({
text: responseJsonData.resultMessage
}))
.setMimeType(ContentService.MimeType.JSON);
}
レスポンスのテキストを取得したければ、UrlFetchApp.fetch().getContentText()
で取得する。エンコーディングを第1引数で指定しておくと良いだろう。また、そもそもレスポンスが不要な場合は、変数 response
で結果を受け取らなくて良い。
よくある Ajax 系のライブラリと違って、同期的に動作するのが特徴。fetchAll()
という別のメソッドは非同期処理されるようだ。
上の例は Slack コマンド向けの実装になっている。Slack コマンドを通じて投げられたテキストを取得したり、呼び出し元が正しいかトークンチェックしたりしている。