Slackの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"}'
Postmanでは、これは生の本体です。
{
"token":"my-token-here",
"channel":"#channel-name-or-id",
"text":"Text here.",
"username":"otherusername"
}
私は以前にこのようなことをやったことがないので、何かを見逃しているかどうかはわかりません。ありがとう!
私は少し遅れていますが、これが私のようなこの問題につまずく他の人々を助けることができることを望みます。私はちょうど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'`
これがお役に立てば幸いです! :)
さて、ドキュメントを読み直した後、私はそれを見つけました:
JSONエンコードされた本文
これらの書き込みメソッドでは、代わりにHTTP POSTデータをContent-type:application/jsonとして送信できます。
いくつかの基本ルールがあります。
- Content-type HTTPヘッダーを明示的にapplication/jsonに設定する必要があります。あなたのPOST本文はそれなしでは解釈されません。
- Authorization HTTPヘッダーでベアラートークンとしてトークンを送信する必要があります。
- トークンをクエリ文字列の一部として、または投稿されたJSONの属性として送信することはできません。
- クエリ文字列、URLエンコードされたPOST body、およびJSON属性の引数を混在させないでください。リクエストごとに1つのアプローチを選択してください。
- 属性に明示的にnull値を指定すると、デフォルトの動作が割り当てられます。
curl
の例。 Authorizationヘッダーに注意してください。
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
これは完全な回答に適さない場合がありますが、目的がメッセージの添付ファイルを送信することである場合、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
の値はURLエンコードされた[{"color":"good","fallback":"plain text","text":"colored text"}]
。すべての添付ファイル属性を使用できるはずです ここで説明 。
2018年3月、スラックのサポート[〜#〜] post [〜#〜] with [〜#〜] json [〜#〜] body
エンドポイント:https://slack.com/api/chat.postMessage
ヘッダー:Authorization: Bearer xoxp-your-hardly-find-token-here
ボディ:{"channel":"CH9NN37","text":"something from me!"}
に注意してくださいベアラーin- 認可ヘッダー。
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
ドキュメントについては https://api.slack.com/incoming-webhooks をご覧ください。
次のように、各プロパティを独自の-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:"
not_authed
は、認証トークンが提供されないことを意味します。
どのトークンをリクエストで渡しますか? OAuthトークンを渡す必要があります。これは here から取得できます。
郵便配達員では、次のようにリクエストを組み立てることができます。
url(POST): https://slack.com/api/chat.postMessage
次に、Headers
セクションの下に、次の2つのヘッダーを配置します。
キー(Content-Type
)value(application/json
)
key(Authorization
)value(YOUR-TOKEN-NAME
)
次に、Body
フォームのraw
セクションにデータを入力します。
{"channel": "CHANNEL-NAME", "data": "You better post this to channel"}
Javaを使用し、そのような依存関係を生じさせている場合、出来上がり!!
* 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);
}
}
私はこれを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
}