【问题标题】:Unable to open Slack modal from Google App Scripts无法从 Google App Scripts 打开 Slack 模式
【发布时间】:2020-11-03 10:34:16
【问题描述】:

我正在尝试通过 GAS 的按钮单击打开松弛模式。目前我正在发送具有此功能的交互式按钮:

function Send(){
  
  var url = "my slack url here"
  var payload = 
    {
      "text": "Here's your interactive buttons message.",
    "blocks": [
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Click Me",
                        "emoji": true
                    },
                    "value": "id_btn",
                    "action_id": "id_btn"
                }
            ]
        }
    ]
    }

var options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };

UrlFetchApp.fetch(url,options); 
  }

但是,当我与按钮交互时,什么都没有发生。我目前的Get/Post方法如下:

function doGet(e){
return ContentService.createTextOutput(""); 
}

function doPost(e) {

  if (typeof e !== 'undefined') { 

    // Extract the relevant data
    var parameter = e.parameter;
    var date = new Date();
    var payload = JSON.parse(parameter.payload)

    var trigger_id = payload.trigger_id;
    var slackUrl = "https://slack.com/api/views.open";
    var myToken = "Token I got after installing app to slack"

var payload_upd ={
    "trigger_id": trigger_id,
    "type": "modal",
    "view":{
    "title": {
        "type": "plain_text",
        "text": "Gratitude Box",
        "emoji": true
    },
    "submit": {
        "type": "plain_text",
        "text": "Submit",
        "emoji": true
    },
    "close": {
        "type": "plain_text",
        "text": "Cancel",
        "emoji": true
    },
    "blocks": [
        {
            "type": "input",
            "block_id": "my_block",
            "element": {
                "type": "plain_text_input",
                "action_id": "my_action"
            },
            "label": {
                "type": "plain_text",
                "text": "Say something nice!",
                "emoji": true
            }
        }
    ]
    }
}

// Send options   
    var options_upd = {
    "headers": {"Authorization": myToken},
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload_upd),
  }; 
  
    UrlFetchApp.fetch(slackUrl, options_upd);
  }  
  
}

我尝试了各种方法,可以在我的有效负载和选项中组合 trigger_id 和令牌,但我无法找到可行的方法。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • However, nothing is happening when I interact with the button。你的意思是在松弛方面什么都没有发生? GAS UrlFetch 的请求呢,有没有查看响应码、错误信息等?另外,我看到两个不同的请求,哪一个失败了?
  • 我的第一个 URLFetch 发送了我难以处理的有效负载,这是成功的。失败的部分是当我单击 Slack 中第一个有效负载上的按钮时,这是 doPost(e) 中的部分。我希望在用户单击按钮后显示一个模态,但是 slack 在按钮侧面显示进度圈几秒钟,然后 Slack 上什么也没有发生。我无法显示模态。我怀疑我错误地放置了令牌或触发器 ID,但我无法找出正确的方法。
  • 1) 您是否将应用程序脚本项目发布为任何人都可以访问的 Web 应用程序? 2) Slack 应用程序的请求 URL 是否指向您已发布的 Web 应用程序? 3) 尝试使用 requestbin.com 之类的东西来检查 Slack 实际发送的有效负载(您会发现使用 e.parameter.trigger_id 实际上更容易)。
  • 您是否检查过单击按钮时是否调用了doPost 函数? (请参阅 Apps 脚本仪表板中的 My Executions)。在这种情况下,您是否可以进行一些基本的日志记录以检查脚本失败的位置,包括检查来自 UrlFetch 请求的响应? (例如,var res = UrlFetchApp.fetch(slackUrl, options_upd); console.log(res.getContentText()); console.log(res.getResponseCode());
  • 谢谢,我会尝试再次检查失败的地方。该应用程序确实是: - 任何人(甚至匿名)都可以访问 - 请求 URL 指向我的应用程序,因为我在调用 doPost(e) 时得到结果 - 我在 doPost(e) 时添加了一个部分以将数据行输入到工作表中) 被调用,并且它正在工作。每次单击按钮时,它都会正确地将我的令牌和 trigger_id 写入行。 - 我还仔细检查了我的 OAuth 令牌,并重新安装了 slack app forged measure。当我使用 e.parameter.trigger_id 时,我认为我没有得到任何东西,因为谷歌表格没有将输入写入单元格。

标签: google-apps-script modal-dialog slack-api slack-dialog slack-block-kit


【解决方案1】:

看起来您的有效负载无效,因为"type": "modal" 应该是view 的一部分。试试这个载荷:

var payload_upd = {
  "trigger_id": trigger_id,
  "view": {
    "type": "modal",
    "title": {
      "type": "plain_text",
      "text": "Gratitude Box",
      "emoji": true
    },
    "submit": {
      "type": "plain_text",
      "text": "Submit",
      "emoji": true
    },
    "close": {
      "type": "plain_text",
      "text": "Cancel",
      "emoji": true
    },
    "blocks": [
      {
        "type": "input",
        "block_id": "my_block",
        "element": {
          "type": "plain_text_input",
          "action_id": "my_action"
        },
        "label": {
          "type": "plain_text",
          "text": "Say something nice!",
          "emoji": true
        }
      }
    ]
  }
};

另外,请确保在 Authorization 标头中指定“Bearer”。

var options_upd = {
  "headers": {"Authorization": "Bearer " + myToken},
  "method": "post",
  "contentType": "application/json",
  "payload": JSON.stringify(payload_upd),
}; 

【讨论】:

  • 感谢您的建议。我用您提供的有效负载更改了有效负载,但不幸的是它仍然无法正常工作。我检查了交互后发送给 slack 的内容,我自己没有发现问题:gyazo.com/92b6a5ca2aeb0d7ef0e6fd0d1359da79
  • @CTRTracker 你检查过 Slack 对你的 POST 请求的响应了吗?
  • @CTRTracker 确保您在授权标头中包含“Bearer”。查看更新的答案^
  • 非常感谢迭戈!在我按照您的建议将类型包含在视图中并在 Authorization 标头中包含“Bearer”之后,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多