web-dev-qa-db-ja.com

特定のチャネルで、添付ファイル付きのアプリではなくユーザーとして、c#からSlack-Appを介してメッセージを投稿する方法

Webhookしたチャネル以外のチャネルにメッセージを投稿することはできません。そして、私はアプリのように、自分自身として(私のslackIDの下で)それを行うことはできません。

問題は、Slackを自社のソフトウェアに統合できるように、会社のためにこれを行わなければならないことです。 JSONの「ペイロード」がどのように見えるかがわかりません(実際には、SlackのWebサイトに記載されているとおりに実行していますが、まったく機能しません。常に「トークン」、「」などを無視します。ユーザー」、「チャネル」など)。

また、「 https://slack.com/api/chat.postMessage "-どこに行くのか」のようなurlメソッドの使用方法もわかりません。あなたが私のコードで見るかもしれないように、私はwebhookurlしか持っていません、そして私がそれを使わなければ私は何にも投稿することができません。また、トークン、特定のuserId、特定のチャネルなどの引数の使用方法がわかりません...-それらをペイロードに入れようとすると、無視されるようです。

さて、十分な泣き言!これまでに得たものをお見せします。これは、これをオンラインで投稿した人からのものです。しかし、私はいくつかのことを変更して追加しました。

public static void Main(string[] args)
        {
            Task.WaitAll(IntegrateWithSlackAsync());
        }

        private static async Task IntegrateWithSlackAsync()
        {
            var webhookUrl = new Uri("https://hooks.slack.com/services/TmyHook");  
            var slackClient = new SlackClient(webhookUrl);
            while (true)
            {
                Console.Write("Type a message: ");
                var message = Console.ReadLine();
                Payload testMessage = new Payload(message);
                var response = await slackClient.SendMessageAsync(testMessage);
                var isValid = response.IsSuccessStatusCode ? "valid" : "invalid";
                Console.WriteLine($"Received {isValid} response.");
                Console.WriteLine(response);
            }
        }
    }
}

public class SlackClient
{
        private readonly Uri _webhookUrl;
        private readonly HttpClient _httpClient = new HttpClient {};

        public SlackClient(Uri webhookUrl)
        {
            _webhookUrl = webhookUrl;
        }

        public async Task<HttpResponseMessage> SendMessageAsync(Payload payload)
        {

            var serializedPayload = JsonConvert.SerializeObject(payload);

            var stringCont = new StringContent(serializedPayload, Encoding.UTF8, "application/x-www-form-urlencoded");

            var response = await _httpClient.PostAsync(_webhookUrl, stringCont);

            return response;
        }
    }
}

ペイロードをオブジェクトとして処理できるように、このクラスを作成しました。

    public class Payload
{
    public string token = "my token stands here";
    public string user = "my userID";
    public string channel = "channelID";
    public string text = null;

    public bool as_user = true;


    public Payload(string message)
    {
        text = message;
    }
}

ペイロードをどのように処理する必要があるかを実際に示すコードの完全なビットを投稿できる人には、とても感謝しています。そして/または実際のURLがどのように見えるかがslackに送信されます...だから私はおそらく何が起こっているのか理解できます:)

4
Fabian Held

1。着信Webhookとchat.postMessage

Slackアプリの着信Webhookは常にチャネルに固定されています。チャネルのオーバーライドをサポートする Incoming Webhook のレガシーバリアントがありますが、これは個別にインストールする必要があり、Slackアプリの一部にはなりません。 ( この回答 も参照してください)。

したがって、あなたの場合は、代わりにWeb APIメソッド chat.postMessage を使用します。

2。実装例

これは、C#でchat.postMessageを使用してメッセージを送信するための非常に基本的な実装例です。これはさまざまなチャネルで機能し、メッセージは、アプリではなく、トークン(アプリをインストールしたものと同じ)を所有するユーザーとして送信されます。

using System;
using System.Net;
using System.Collections.Specialized;
using System.Text;

public class SlackExample
{    
    public static void SendMessageToSlack()
    {        
        var data = new NameValueCollection();
        data["token"] = "xoxp-YOUR-TOKEN";
        data["channel"] = "blueberry";        
        data["as_user"] = "true";           // to send this message as the user who owns the token, false by default
        data["text"] = "test message 2";
        data["attachments"] = "[{\"fallback\":\"dummy\", \"text\":\"this is an attachment\"}]";

        var client = new WebClient();
        var response = client.UploadValues("https://slack.com/api/chat.postMessage", "POST", data);
        string responseInString = Encoding.UTF8.GetString(response);
        Console.WriteLine(responseInString);        
    }

    public static void Main()
    {
        SendMessageToSlack();
    }
}

これは、同期呼び出しを使用した非常に基本的な実装です。より高度な非同期アプローチの使用方法については、 this question を確認してください。

3
Erik Kalkoken

これは、添付ファイル付きのSlackメッセージを送信する方法の改善された例です。

この例では、リクエストとメッセージを送信するためのより良いasyncアプローチを使用しています。添付ファイルはC#オブジェクトから構築されます。

また、リクエストは最新のJSON Body POSTとして送信されます。これには、ヘッダーにTOKENを設定する必要があります。

注:必須 Json.Net

using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace SlackExample
{
    class SendMessageExample
    {
        private static readonly HttpClient client = new HttpClient();

        // reponse from message methods
        public class SlackMessageResponse
        {
            public bool ok { get; set; }
            public string error { get; set; }
            public string channel { get; set; }
            public string ts { get; set; }
        }

        // a slack message
        public class SlackMessage
        {
            public string channel{ get; set; }
            public string text { get; set; }
            public bool as_user { get; set; }
            public SlackAttachment[] attachments { get; set; }
        }

        // a slack message attachment
        public class SlackAttachment
        {
            public string fallback { get; set; }
            public string text { get; set; }
            public string image_url { get; set; }
            public string color { get; set; }
        }

        // sends a slack message asynchronous
        // throws exception if message can not be sent
        public static async Task SendMessageAsync(string token, SlackMessage msg)
        {
            // serialize method parameters to JSON
            var content = JsonConvert.SerializeObject(msg);
            var httpContent = new StringContent(
                content,
                Encoding.UTF8,
                "application/json"
            );

            // set token in authorization header
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            // send message to API
            var response = await client.PostAsync("https://slack.com/api/chat.postMessage", httpContent);

            // fetch response from API
            var responseJson = await response.Content.ReadAsStringAsync();

            // convert JSON response to object
            SlackMessageResponse messageResponse =
                JsonConvert.DeserializeObject<SlackMessageResponse>(responseJson);

            // throw exception if sending failed
            if (messageResponse.ok == false)
            {
                throw new Exception(
                    "failed to send message. error: " + messageResponse.error
                );
            }
        }

        static void Main(string[] args)
        {           
            var msg = new SlackMessage
            {
                channel = "test",
                text = "Hi there!",
                as_user = true,
                attachments = new SlackAttachment[] 
                {
                    new SlackAttachment
                    {
                        fallback = "this did not work",
                        text = "This is attachment 1",
                        color = "good"
                    },

                    new SlackAttachment
                    {
                        fallback = "this did not work",
                        text = "This is attachment 2",
                        color = "danger"
                    }
                }
            };

            SendMessageAsync(
                "xoxp-YOUR-TOKEN",                
                msg
            ).Wait();

            Console.WriteLine("Message has been sent");
            Console.ReadKey();

        }
    }

}
2
Erik Kalkoken