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 コマンドを通じて投げられたテキストを取得したり、呼び出し元が正しいかトークンチェックしたりしている。