web-dev-qa-db-ja.com

HTTP POSTリクエストでのJSONのSlackへの送信

Slackのchat.postMessage API呼び出しを使用してメッセージを送信しようとしています。 HTTP GET内でテストメッセージをエンコードしても問題はありませんが、HTTP POSTリクエストでJSONを使用して同じ結果を達成しようとしています。

私はcurlPostman の両方でテストを行ってきましたが、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"
}

私は以前にこのようなことをやったことがないので、何かを見逃しているかどうかはわかりません。ありがとう!

40
Valentine

私は少し遅れていますが、これが私のようなこの問題につまずく他の人々を助けることができることを望みます。私はちょうど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'`

これがお役に立てば幸いです! :)

63
finferflu

さて、ドキュメントを読み直した後、私はそれを見つけました:

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
9
LSerni

これは完全な回答に適さない場合がありますが、目的がメッセージの添付ファイルを送信することである場合、urlencoded 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"}]。すべての添付ファイル属性を使用できるはずです ここで説明

6
mustaccio

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- 認可ヘッダー。

5
vnpnlz

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 をご覧ください。

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:"
3
Linus Proxy

not_authedは、認証トークンが提供されないことを意味します。

どのトークンをリクエストで渡しますか? OAuthトークンを渡す必要があります。これは here から取得できます。

1
machinehead115

郵便配達員では、次のようにリクエストを組み立てることができます。

url(POST): https://slack.com/api/chat.postMessage

次に、Headersセクションの下に、次の2つのヘッダーを配置します。

  1. キー(Content-Type)value(application/json

  2. key(Authorization)value(YOUR-TOKEN-NAME

次に、Bodyフォームのrawセクションにデータを入力します。

    {"channel": "CHANNEL-NAME", "data": "You better post this to channel"}
1
Umesh Poswal

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);
        }
    }
0
rbyndoor

私はこれを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        
    }
0
Tapan Banerjee