如何让我的 slackbot 在线程中回复,而不是使用 Google App 脚本回复整个频道

wil*_*ers 5 javascript google-apps-script slack-api

我尝试让 slackbot 通过回复消息中的某些关键词来提供技术支持。然而,它的响应使其所在的频道变得混乱。因此,我希望我的 Slackbot 在原始消息下的线程中进行回复,就像我自己回答问题时所做的那样。

从 Slack 文档中,我知道应该可以回复线程中的消息。我应该以某种方式使用thread_ts,但我无法让它工作。


var POST_MESSAGE_ENDPOINT = 'https://slack.com/api/chat.postMessage';
var TEXTS = [
  'Hi there! Maybe I can help you?',
];

  //Reply to  within a thread: 
  //data '{"channel":"CHANNEL-ID", "text":"curl", "thread_ts":"THREAD-TS"}'

function doPost(e){
  var event = JSON.parse(e.postData.contents).event;

  if(event.hasOwnProperty('bot_id')){
    return;
  }else if(event.text.match(/(log.?in)|(inlog)|(logging?)/)){
    postLogin(event, ['login']);
  }else if(event.text.match(/(syncing)|(sync)|(sync$$)/)){
    postSyncing(event, ['syncing']);
  }else if(event.text.match(/(issues?)|(problem)/)){
    postIssueOptions(event, ['issue']);
  }
}

function postLogin(event, keywords){
  var url1 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Runner can not login after changing password>";
  var url2 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Runner forgot password>";
  var url3 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Other login issue>";
  var random_params = Math.floor(Math.random() * TEXTS.length);
  var payload = {token:SLACK_ACCESS_TOKEN, channel:event.channel, text:TEXTS[random_params] + '\n' + url1+'\n'+url2+'\n'+url3};
  UrlFetchApp.fetch(POST_MESSAGE_ENDPOINT, {method: 'post', payload:payload});
}

function postSyncing(event, keywords){
  var url1 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Syncing does not work>";
  var url2 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Yesterday's trips are still showing>";
  var random_params = Math.floor(Math.random() * TEXTS.length);
  var payload = {token:SLACK_ACCESS_TOKEN, channel:event.channel, text:TEXTS[random_params] + '\n' + url1+'\n'+url2};
  UrlFetchApp.fetch(POST_MESSAGE_ENDPOINT, {method: 'post', payload:payload});
}

function postIssueOptions(event, keywords){
  var url1 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Delivery missing in trip>";
  var url2 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Runner App directs Runner back to hub>";
  var url3 = "<https://docs.google.com/document/d/1rcaGjyAMFpo9tG9YAgTpTFlxPZq5luwBlM3gMVCL9eI/edit|Trip assignment does not work>";
  var random_params = Math.floor(Math.random() * TEXTS.length);
  var payload = {token:SLACK_ACCESS_TOKEN, channel:event.channel, text:TEXTS[random_params] + '\n' + url1+'\n'+url2+'\n'+url3};
  UrlFetchApp.fetch(POST_MESSAGE_ENDPOINT, {method: 'post', payload:payload});
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ken 11

要为现有消息打开新线程,您所需要做的就是发布新消息,该消息的参数thread_ts设置为ts您要回复的消息的值。

线程的整个概念在这个稍微过时但仍然相关的线程工作原理概述中也得到了很好的解释。