对 slack 的 JSON post 请求返回 invalid_auth

Már*_*oux 6 javascript json google-apps-script slack-api slack

我试图在用户按下按钮后通过谷歌应用程序脚本在松弛中打开一个对话框,但我收到以下错误消息:

{"ok":false,"error":"invalid_auth","warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

function openDialog (range, triggerId, token) {
    var url = 'https://slack.com/api/dialog.open';
    var dialog = {
        trigger_id: triggerId,
        title: 'Submit a helpdesk ticket',
        callback_id: 'submit-ticket',
        submit_label: 'Submit',
        elements: [
            {
                label: 'Title',
                type: 'text',
                name: 'title',
                value: 'teste',
                hint: '30 second summary of the problem',
            },
            {
                label: 'Description',
                type: 'textarea',
                name: 'description',
                optional: true,
            },
            {
                label: 'Urgency',
                type: 'select',
                name: 'urgency',
                options: [
                    { label: 'Low', value: 'Low' },
                    { label: 'Medium', value: 'Medium' },
                    { label: 'High', value: 'High' },
                ],
            },
        ],
    };

    var options = {
        'method' : 'post',                  
        'contentType': 'application/json', 
        'headers': {
            'Authorization': 'Bearer ' +  token,
        },
        'payload' : JSON.stringify(dialog),
    };

    var urlFetch = UrlFetchApp.fetch(url, options);
    var message = ContentService.createTextOutput(urlFetch).setMimeType(ContentService.MimeType.JSON);

    return message; 
}
Run Code Online (Sandbox Code Playgroud)

谁能发现我缺少什么吗?

谢谢


这是触发 openDialog() 函数的 doPost() 函数,它使用 和 从 slack 中的按钮读取有效callback_id = "gasolina"负载value = "update"

if (payload.callback_id == "gasolina") {
  var selectedOption = actions.value;
  var operation = payload.callback_id;
  var triggerId = payload.trigger_id;
  var token = payload.token;
  var inputRow = actions.name;
  if (selectedOption == 'update') {
    var keyword = 'no+money';
    var gastoExtra = '';
    var operation = payload.callback_id;
    var gastoExtraRange = actions.name;
    return openDialog (gasRange, triggerId, token); 
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 0

我认为虽然你的脚本几乎是正确的,但需要进行一些修改。对你的脚本进行这样的修改怎么样?从你的问题来看,我不确定你当前使用 Slack 的dialog.open 的设置。所以这个修改后的脚本假设设置是正确的。

修改要点:

  • 原因missing_charset是由于使用了JSON.stringify()有效负载。
  • dialog.open的文档来看,payload为token,dialogtrigger_id
  • token不用于标题。
  • application/json不用于contentType.

当这些点反映到您的脚本中时,修改后的脚本如下。

修改后的脚本:

function openDialog (range, triggerId, token) {
  var url = 'https://slack.com/api/dialog.open';
  var dialog = {
    title: 'Submit a helpdesk ticket',
    callback_id: 'submit-ticket',
    submit_label: 'Submit',
    elements: [
      {
        label: 'Title',
        type: 'text',
        name: 'title',
        value: 'teste',
        hint: '30 second summary of the problem',
      },
      {
        label: 'Description',
        type: 'textarea',
        name: 'description',
        optional: true,
      },
      {
        label: 'Urgency',
        type: 'select',
        name: 'urgency',
        options: [
          { label: 'Low', value: 'Low' },
          { label: 'Medium', value: 'Medium' },
          { label: 'High', value: 'High' },
        ],
      },
    ],
  };
  var options = {
    method: 'post',
    payload: {
      token: token,
      dialog: JSON.stringify(dialog),
      "trigger_id": triggerId,
    },
  };
  var urlFetch = UrlFetchApp.fetch(url, options);
  var message = ContentService.createTextOutput(urlFetch).setMimeType(ContentService.MimeType.JSON);
  return message; 
}
Run Code Online (Sandbox Code Playgroud)

笔记 :

  • 在我的环境中,我使用dialog.open 来请求上面的脚本。但如果这不起作用,请检查错误消息并修改您的设置。