zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【Mattermost】Slack用のGAS秘書botをMattermostに向けたメモ

【前提】

既に
qiita.com
を参考に、GASからSlack向けにメッセージを投げるbotがあったので、それをMattermostに向けたときのメモです。


【サマリ】

01.[システムコンソール]で[カスタム統合機能]を諸々有効にする
02.アカウントの[統合機能]で[内向きのウェブフック]を作成
03.botのPOST処理を修正

【作業メモ】

01.[システムコンソール]で[カスタム統合機能]を諸々有効にする

f:id:zuntan02:20170425185654p:plain

内向きのウェブフックを有効にする: 有効
外向きのウェブフックを有効にする: 有効
カスタムスラッシュコマンドを有効にする: 有効
OAuth 2.0サービスプロバイダーを有効にする: 無効
統合機能の管理を管理者のみに制限する:無効
★今回は利用者に自由に使ってもらう意図で無効化していますが、運用方針に合わせてください。
統合機能によるユーザー名の上書きを許可する:有効
統合機能によるプロフィール画像アイコンの上書きを許可する:有効
★[ユーザー名の上書き]と[プロフィール画像アイコンの上書き]を両方有効にするとフィッシング攻撃を許してしまう可能性があります。今回は利用者が限られているため有効としていますが、運用方針に合わせてください

02.アカウントの[統合機能]で[内向きのウェブフック]を作成

  • アカウントメニューから[統合機能]

f:id:zuntan02:20170425185716p:plain

  • [内向きのウェブフック]を作成

f:id:zuntan02:20170425185724p:plain

  • タイトルと出力先のチャンネルを指定

f:id:zuntan02:20170425185731p:plain
→ウェブフック用のURLが払い出されます。

03.botのPOST処理を修正

payloadに乗せるアイテムが一部異なる

[メモ] SlackとMattermostそれぞれのincomingWebhookへのポスト方法の違い – Nobwak's Lair


例)
"icon_emoji" : ":information_desk_person:"

"icon_url":"画像のURL"

とか


上記を変えてもPOSTでエラー。
<ウェブフックURL>のリクエストに失敗しました(エラー: 400)。サーバー応答の一部: {"id":"web.incoming_webhook.parse.app_error","message":"外部からのデータを解析できません","detailed_error":"","request_id":(中略)(応答の全文を見るには muteHttpExceptions オプションを使用してください)

などとなった。postにcontentTypeが必要だった。

   'contentType': 'application/json',

参考:
Class UrlFetchApp  |  Apps Script  |  Google Developers
のMake a POST request with a JSON payload.のところ。

というわけで(この秘書botに関しては)POST周りは以下のようにしたら動いたよというメモでした

//slackへポスト
function postSlack(payload)
{
  // POSTオプション
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }

  // アクセス先
  var url = "https://hooks.slack.com/services/XXXXXX/XXXXXX/XXXXXXXXXXXXXXX";
  // POSTリクエスト
  var response = UrlFetchApp.fetch(url, options);
  // HTML結果を取得(引数のcharsetは設定したほうが良い)
  var content = response.getContentText("UTF-8");
}

//mmostへポスト
function postMmost(payload)
{
  // POSTオプション
  var options = {
    "method" : "POST",
    "contentType": "application/json",
    "payload" : JSON.stringify(payload)
  }

  // アクセス先
  var url = "https://hogehoge/hooks/XXXXXXXXXXXXXXXXXXXXXXXXXXX";
  // POSTリクエスト
  var response = UrlFetchApp.fetch(url, options);
  // HTML結果を取得(引数のcharsetは設定したほうが良い)
  var content = response.getContentText("UTF-8");
}

以上、何か参考になれば。