【发布时间】:2018-07-12 23:40:56
【问题描述】:
我的问题很简单,我认为创建这个程序只需要几个小时。但是现在我整天都在努力,试图找出我可能做错了什么。
我要做的就是使用他们的postMessage api 将消息发布到 Slack。我已经能够使用 slacks testing methods 成功发送消息。
这是测试输出的url
https://slack.com/api/chat.postMessage?token=xoxp-xxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxxxx&channel=XXXXXXXX&text=Just%20need%20the%20url&as_user=jheuman&pretty=1
然后我决定使用从我的文件系统提供的这个 html 文件在本地试用它
<!DOCTYPE html>
<html>
<head>
<title>Testing Slack API</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<button onClick="test()">Test</button>
<button onClick="test2()">Authorization Test</button>
<script>
function test() {
var apiUrl = "https://slack.com/api/chat.postMessage";
var token = "xoxp-xxxxx...";//my token has been omitted for security;
var channel = "#general";
var text = "Testing slack api";
var user = "jheuman";
var actualToken = "Bearer " + token;
$.ajax({
headers: {
'Authorization':actualToken,
'Content-Type':'application/json'
},
data: JSON.stringify({
"channel": channel,
"text": text,
"as_user": user
}),
dataType: 'json',
processData: false,
type: 'POST',
url: apiUrl
})
.done(function(data) {
console.log(JSON.stringify(data));
})
.fail(function(response) {
console.log(JSON.stringify(response));
});
};
function test2() {
var apiUrl = "https://slack.com/api/auth.test";
var token = "xoxp-xxxxx..."; //my token has been omitted for security
var channel = "#general";
var text = "Testing slack api";
var user = "jheuman";
var actualToken = "Bearer" + token;
$.ajax({
headers: {
'Authorization':actualToken
},
type: 'POST',
url: apiUrl,
})
.done(function(data) {
console.log(JSON.stringify(data));
})
.fail(function(response) {
console.log(JSON.stringify(response));
});
};
</script>
但是当我点击任一按钮时,我会收到以下错误:
Failed to load https://slack.com/api/chat.postMessage: Request header field
Authorization is not allowed by Access-Control-Allow-Headers in preflight
response.
所以根据朋友的建议,我在服务器上进行了尝试。我使用Web Server For Chrome 在端口 8887 上提供服务。首先不设置 cors 标头,然后设置 cors 标头。两者都无济于事。我收到了同样的错误。
如您所见,我也尝试了 auth.test 调用,但收到同样的错误。
Slack 特别声明他们更喜欢授权标头,并且 api 可以处理 json 数据。
我尝试过的其他方法:
数据中没有带有标记的标头字段:
data: JSON.stringify({
'token':actualToken,
'channel': channel,
'text': text,
'as_user': user
}),
dataType: 'json',
processData: false,
type: 'POST',
url: apiUrl
收到的错误:
{"ok":false,"error":"invalid_form_data"}
在没有'Bearer'的数据中没有带有令牌的标头字段:
data: JSON.stringify({
'token':token,
'channel': channel,
'text': text,
'as_user': user
}),
dataType: 'json',
processData: false,
type: 'POST',
url: apiUrl
收到的错误:
{"ok":false,"error":"invalid_form_data"}
我研究过但认为不会影响结果的事情
那么我如何让这个帖子请求工作?
我没有设置 jquery 或 ajax,这只是我过去使用的,所以如果你有不同的请求库可以使用,我会全力以赴。
如果您需要更多信息,我会尽力提供给您
【问题讨论】:
-
啊哈,所以你认为如果我使用 nodejs 调用会顺利进行吗?那是我的最终目标,只是想在尝试将其放在服务器上之前对其进行测试
-
您是否尝试从频道名称中删除哈希?
-
@vol7ron 我在 URL 末尾使用了 7 位数字,但不想在这里发布,所以这不是问题,但谢谢。
-
根据您的错误消息,我认为这无论如何都是一个长镜头;)我仍然需要更彻底地阅读您的问题,但我很好奇您是否无法创建公共 Slack 频道用token让其他人测试得更彻底。 CORS 是一个笨重的野兽,似乎这里的一些答案应该有效。
标签: javascript jquery ajax slack-api