我只是想从带有图像的google apps脚本中进行一个简单的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明显不正确,并删除/添加随机参数,并且每次给出的响应都相同。
当我使用Webhook而不是API来执行此操作时,它工作正常。
我的应用在Slack中具有以下权限:
chat:write:bot
incoming-webhook
答案 0 :(得分:3)
问题
您将通过POST请求发送一个JSON
对象作为有效负载,而contentType
方法的fetch()
参数默认为application/x-www-form-urlencoded
。
解决方案1
除了JSON.stringify()
,为确保有效载荷已正确发送,请将其包装在encodeURIComponent()
内置函数中。如果问题仍然存在,请继续解决方案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
}
]
};
有用的链接