Slack API 对 postMessage 的调用不起作用
Slack API call to postMessage not working
我只是想从带有附加图像的 google 应用程序脚本进行简单的 postMessage 调用,但我得到以下响应:
"{"ok":false,"error":"invalid_arg_name"}"
这是创建有效负载的函数:
function getPostMessagePayload(fileUrl) {
var content = {
"channel":"#data-vis",
"token": ACCESS_TOKEN,
"text":"Chart update:",
"attachments": [
{
"title": "Chart",
"fallback": "Fallback",
"text": "Testing chart",
"image_url": fileUrl
}
]
};
return content;
}
这里是我提出请求的地方:
var POST_MESSAGE_ENDPOINT = 'https://slack.com/api/chat.postMessage';
function performPostMessage(payload) {
var res = UrlFetchApp.fetch(
POST_MESSAGE_ENDPOINT,
{
method: "post",
payload: JSON.stringify(payload),
muteHttpExceptions: true,
}).getContentText();
return res;
}
无法判断实际问题是什么。我试过让我的令牌明显不正确,URL 显然不正确,并且 deleting/adding 随机参数每次都给出相同的响应。
当我使用 webhook 而不是 API 执行此操作时,它工作正常。
我的应用程序在 Slack 中具有以下权限:
chat:write:bot
incoming-webhook
问题
您在 POST 请求中发送一个 JSON
对象作为负载,而 fetch()
方法的 contentType
参数默认为 application/x-www-form-urlencoded
.
解决方案 1
除了 JSON.stringify()
之外,为确保正确发送有效负载,将其包装在 encodeURIComponent()
built-in 函数中。如果问题仍然存在,请继续执行解决方案 2。
更新解决方案 1
差点忘记 fetch()
方法如何处理传递给具有默认 x-www-form-urlencoded
内容类型的负载的对象。 完全删除 JSON.stringify()(并在需要时添加 encodeURI()
/ encodeURIComponent()
)。
解决方案 2
Slack API 支持 application/json
内容类型的 POST 请求。在您的情况下,将 contentType
参数设置为 application.json
发送请求可能更容易(请注意,您必须将授权从有效负载移至 headers
):
//fetch part;
var res = UrlFetchApp.fetch(
POST_MESSAGE_ENDPOINT,
{
method : 'post',
contentType : 'application/json',
headers : {
Authorization : 'Bearer ' + ACCESS_TOKEN
},
payload : JSON.stringify(payload),
muteHttpExceptions : true,
})
//payload part;
var payload = {
"channel" : "#data-vis",
"text" : "Chart update:",
"attachments" : [
{
"title" : "Chart",
"fallback" : "Fallback",
"text" : "Testing chart",
"image_url" : fileUrl
}
]
};
有用链接
我只是想从带有附加图像的 google 应用程序脚本进行简单的 postMessage 调用,但我得到以下响应:
"{"ok":false,"error":"invalid_arg_name"}"
这是创建有效负载的函数:
function getPostMessagePayload(fileUrl) {
var content = {
"channel":"#data-vis",
"token": ACCESS_TOKEN,
"text":"Chart update:",
"attachments": [
{
"title": "Chart",
"fallback": "Fallback",
"text": "Testing chart",
"image_url": fileUrl
}
]
};
return content;
}
这里是我提出请求的地方:
var POST_MESSAGE_ENDPOINT = 'https://slack.com/api/chat.postMessage';
function performPostMessage(payload) {
var res = UrlFetchApp.fetch(
POST_MESSAGE_ENDPOINT,
{
method: "post",
payload: JSON.stringify(payload),
muteHttpExceptions: true,
}).getContentText();
return res;
}
无法判断实际问题是什么。我试过让我的令牌明显不正确,URL 显然不正确,并且 deleting/adding 随机参数每次都给出相同的响应。
当我使用 webhook 而不是 API 执行此操作时,它工作正常。
我的应用程序在 Slack 中具有以下权限:
chat:write:bot
incoming-webhook
问题
您在 POST 请求中发送一个 JSON
对象作为负载,而 fetch()
方法的 contentType
参数默认为 application/x-www-form-urlencoded
.
解决方案 1
除了 JSON.stringify()
之外,为确保正确发送有效负载,将其包装在 encodeURIComponent()
built-in 函数中。如果问题仍然存在,请继续执行解决方案 2。
更新解决方案 1
差点忘记 fetch()
方法如何处理传递给具有默认 x-www-form-urlencoded
内容类型的负载的对象。 完全删除 JSON.stringify()(并在需要时添加 encodeURI()
/ encodeURIComponent()
)。
解决方案 2
Slack API 支持 application/json
内容类型的 POST 请求。在您的情况下,将 contentType
参数设置为 application.json
发送请求可能更容易(请注意,您必须将授权从有效负载移至 headers
):
//fetch part;
var res = UrlFetchApp.fetch(
POST_MESSAGE_ENDPOINT,
{
method : 'post',
contentType : 'application/json',
headers : {
Authorization : 'Bearer ' + ACCESS_TOKEN
},
payload : JSON.stringify(payload),
muteHttpExceptions : true,
})
//payload part;
var payload = {
"channel" : "#data-vis",
"text" : "Chart update:",
"attachments" : [
{
"title" : "Chart",
"fallback" : "Fallback",
"text" : "Testing chart",
"image_url" : fileUrl
}
]
};
有用链接