Slack의 Events API가 여러 번 두드려 버리는 경우가 있었으므로 그 대응을했다

GAS로 멘션에 반응해주는 slackbot을 만들었습니다만, 왠지 여러 번 같은 파라미터로 api가 두드려 버리는 버그(사양?)가 있었으므로 그 대응을 했습니다.
특히 캐시를 사용하여 동일한 메시지에 한 번만 응답하지 않도록했습니다.

스크립트


function doPost(e) {
  var postData = JSON.parse(e.postData.getDataAsString());
  var res = {};

  // これはslackbotのurl検証用コード
  if(postData.type == 'url_verification') {
    res = {'challenge':postData.challenge}
    return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
  }

  var channel = postData.event.channel;
  var ts = postData.event.ts;

  var cache = CacheService.getScriptCache();
  // ここのキーは自由に変えてください。
  // 今回はメンションに反応するbotなので発言されたチャネルID、タイムスタンプをキーにしました。
  var cacheKey = channel + ':' + ts;
  var cached = cache.get(cacheKey);
  if (cached != null) {
    console.log('do nothing!');
    return;
  }
  cache.put(cacheKey, true, 1800); // 30分キャッシュする(ここは目安。もっと短くてもいいかもしれない)

  // do something

}

이상입니다

참고


  • Cache Service  |  Apps Script  |  Google Developers
  • 이벤트 API | Slack
  • 좋은 웹페이지 즐겨찾기