Slack的JSON POST请求返回invalid_auth错误

6

我正在尝试在用户按下按钮后通过Google应用程序脚本在Slack中打开对话框,但是我收到了以下错误消息:

{"ok":false,"error":"invalid_auth","warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}

这是我的代码:
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; 
}

有没有人能发现我遗漏了什么?

谢谢


这是 doPost() 函数,它触发 openDialog() 函数,它从 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); 

根据错误响应,我会说您传递给授权标头的令牌存在问题。可能是格式不正确。 - TheAddonDepot
谢谢!你有没有想法,如果代码中有问题没有发送令牌?我测试了令牌和触发器ID的导入值,它们是正确的。似乎它没有被“发布”。 - Mário Guidoux
2个回答

0

我认为虽然你的脚本几乎正确,但需要进行一些修改。你觉得这个修改对你的脚本如何?从你的问题中,我不确定你当前使用Slack的dialog.open的设置。因此,这个修改后的脚本假设设置是正确的。

修改点:

  • missing_charset的原因是由于在payload中使用了JSON.stringify()
  • 根据dialog.open文档,payload包括tokendialogtrigger_id
  • token不用于header。
  • contentType不使用application/json

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

修改后的脚本:

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; 
}

注意:

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

1
谢谢你的帮助。然而,我一直收到一个错误。 这次,它显示: {"ok":false,"error":"invalid_auth"} - Mário Guidoux
我通过将令牌直接作为字符串输入到代码中进行确认,但“invalid_auth”错误仍然存在。您有任何想法是什么导致了这个问题吗?也许是应用程序权限的问题? - Mário Guidoux
@Mário Guidoux 谢谢您的回复。从错误信息来看,您能提供一下检索访问令牌的流程吗?我认为访问令牌可能可以用于打开对话框。当您在 https://api.slack.com/apps 上添加了 Slack 应用程序时,您是如何设置应用程序并检索访问令牌的呢? - Tanaike
@Mário Guidoux 谢谢。但是很抱歉,我只能看到 Building Apps for Slack 的图片。我在哪里可以看到流程图? - Tanaike
1
@MárioGuidoux 我遇到了 invalid_auth 问题。你能解决吗?似乎没有任何有用的文档可以参考 :( - Mans
显示剩余13条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接