我尝试使用Slack's chat.postMessage API调用发送消息。我在HTTP GET中编码我的测试消息没有问题,但是我试图在HTTP POST请求中使用JSON实现相同的结果。
我一直在使用curl
和Postman进行测试,但Slack似乎并没有承认我的请求主体。
{
"ok": false,
"error": "not_authed"
}
在curl
中,我的请求编码如下:
curl -H "Content-type: application/json" -X POST -d '{"token":"my-token-here","channel":"#channel-name-or-id","text":"Text here.","username":"otherusername"}'
在邮递员中,这是原始身体:
{
"token":"my-token-here",
"channel":"#channel-name-or-id",
"text":"Text here.",
"username":"otherusername"
}
我之前没有做过这样的事情,所以我不确定我是否遗漏了一些东西。谢谢!
答案 0 :(得分:61)
我有点晚了,但我希望这可以帮助其他像我一样偶然发现这个问题的人。我刚刚与Slack保持联系,这就是他们告诉我的:
Slack Web API根本不接受JSON数据 - 因此,在更改Content-Type时,应使用标准HTTP表单属性发布这些变量。
我们计划在未来支持JSON数据,以确保未来的一致性。
因此,您的cURL行应如下所示:
curl -X POST -d 'token=my-token-here&channel=#channel-name-or-id&text=Text here.&username=otherusername'`
我希望这有帮助! :)
答案 1 :(得分:8)
好的,重新阅读文档后我发现了:
JSON编码的正文
对于这些写入方法,您也可以发送HTTP POST 数据为Content-type:application / json。
有一些基本规则:
- 您必须将Content-type HTTP标头显式设置为application / json。没有它我们就不会解释你的POST主体。
- 您必须在授权HTTP标头中将您的令牌作为承载令牌进行传输。
- 您不能将您的令牌作为查询字符串的一部分发送,也不能作为发布的JSON中的属性发送。
- 不要在查询字符串,URL编码的POST正文和JSON属性之间混合参数。每个请求选择一种方法。
- 为属性提供显式空值将导致为其分配默认行为。
和curl
示例。请注意授权标题。
curl -X POST \
-H 'Authorization: Bearer xoxb-1234-56789abcdefghijklmnop' \
-H 'Content-type: application/json; charset=utf-8' \
--data '{"channel":"C061EG9SL","text":""..."}' \
https://slack.com/api/chat.postMessage
答案 2 :(得分:6)
这可能不符合完整答案的条件,但如果目的是发送邮件附件,您可以发送urlencode
d JSON结构作为attachments
参数的值,如此(为清晰起见,分成多行:
https://slack.com/api/chat.postMessage?
token=YOUR-TOKE-N000&
channel=%23alerts&
text=Hi&
attachments=%5B%7B%22color%22%3A%22good%22%2C%22fallback%22%3A%22plain+text%22%2C%22text%22%3A%22colored+text%22%7D%5D
attachments
的值是网址编码的[{"color":"good","fallback":"plain text","text":"colored text"}]
。您应该能够使用所有附件属性described here。
答案 3 :(得分:5)
从 2018年3月开始, Slack 现在支持 POST JSON 正文
终点:https://slack.com/api/chat.postMessage
标题:Authorization: Bearer xoxp-your-hardly-find-token-here
正文:{"channel":"CH9NN37","text":"something from me!"}
请注意 授权 标题中的 承载 。
答案 4 :(得分:3)
尝试将每个属性放在自己的-d参数中,如下所示:
curl https://slack.com/api/chat.postMessage -X POST -d "channel=#tehchannel" -d "text=teh text" -d "username=teh user" -d "token=teh-token-you-got-from-teh-page-that-machinehead115-linked-to" -d "icon_emoji=:simple_smile:"
答案 5 :(得分:3)
Slack已经更新,现在可以使用了。试试这个例子:
curl -X POST -H 'Content-type: application/json' --data '{"text":"This is a line of text.\nAnd this is another one."}' https://hooks.slack.com/services/AAAAAA/BBBBBB/CCCCCC
答案 6 :(得分:1)
not_authed
表示未提供身份验证令牌。
您在请求中传递了哪些令牌?您需要传递OAuth令牌,您可以从here获取。
答案 7 :(得分:1)
在邮递员上,你可以像这样构建你的请求:
url(POST):https://slack.com/api/chat.postMessage
然后在Headers
部分下面放置这两个标题:
键(Content-Type
)值(application/json
)
键(Authorization
)值(YOUR-TOKEN-NAME
)
然后在Body
表单的raw
部分中填写您的数据:
{"channel": "CHANNEL-NAME", "data": "You better post this to channel"}
答案 8 :(得分:0)
我在powershell中做到了这一点,它就像一个魅力。
$url="https://slack.com/api/chat.postMessage"
$messageContent= # your message here
$token = # your token here
$channel = # channel name
$opt_username= # optional user name
$body = @{token=$token;channel=$channel;username=$opt_username;text=$messageContent;pretty=1}
try
{
Invoke-WebRequest -Uri $url -Method POST -Body $body
}
catch
{
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
答案 9 :(得分:0)
如果你使用java和spring这样的依赖,Voila !!你去吧
* Make a POST call to the chat.PostMessage.
*/
public void chatPostMessage(Message message)
{
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", slackPostMessageToken); //Required
map.add("text", message.getText());//Required
map.add("channel", message.getChannelId());//Required
map.add("unfurl_links","true");
map.add("as_user","false");//Default false
map.add("icon_emoji",":chart_with_upwards_trend:");
map.add("attachments","[\n" +
" {\n" +
" \"fallback\": \"Required plain-text summary of the attachment.\",\n" +
" \"color\": \"#36a64f\",\n" +
" \"pretext\": \"Optional text that appears above the attachment block\",\n" +
" \"author_name\": \"Bobby Tables\",\n" +
" \"author_link\": \"http://flickr.com/bobby/\",\n" +
" \"author_icon\": \"http://flickr.com/icons/bobby.jpg\",\n" +
" \"title\": \"Slack API Documentation\",\n" +
" \"title_link\": \"https://api.slack.com/\",\n" +
" \"text\": \"Optional text that appears within the attachment\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"title\": \"Priority\",\n" +
" \"value\": \"High\",\n" +
" \"short\": false\n" +
" }\n" +
" ],\n" +
" \"image_url\": \"http://my-website.com/path/to/image.jpg\",\n" +
" \"thumb_url\": \"http://example.com/path/to/thumb.png\",\n" +
" \"footer\": \"Datoo ©\",\n" +
" \"ts\": "+System.currentTimeMillis()+"" +
" }\n" +
" ]");
map.add("username","III");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
try {
ResponseEntity<String> response = restTemplate.postForEntity(slackPostMessageUrl, request, String.class);
System.out.println(response);
}
catch (RestClientException e) {
logger.error("Error :-( : ", e);
}
}
答案 10 :(得分:0)
下面的curl命令对我有用。
curl -X POST -H 'Authorization: Bearer xoxb-41234078565-14457098702432-ZLJj9UFOZKnOJtjNW4dv3ukG' -H 'Content-type: application/json; charset=utf-8' --data '{"channel":"#general","text":"I hope the tour went well, Mr. Wonka."}' https://slack.com/api/chat.postMessage