How to upload any file on Slack via Slack-App in c#

后端 未结 3 950
挽巷
挽巷 2020-12-02 02:48

I need help with uploading files to Slack.

I have a Slack-App that is working with my code(below) so far. But all I can do is post messages. I can not attach images

相关标签:
3条回答
  • 2020-12-02 03:22

    Here is another complete example for uploading a file to Slack, this time using the async approach with HttpClient.

    Note: This example requires Newtonsoft.Json.

    using Newtonsoft.Json;
    using System;
    using System.IO;
    using System.Net.Http;
    using System.Threading.Tasks;
    
    namespace SlackExample
    {
        class UploadFileExample
        {
            private static readonly HttpClient client = new HttpClient();
    
            // classes for converting JSON respones from API method into objects
            // note that only those properties are defind that are needed for this example
    
            // reponse from file methods
            class SlackFileResponse
            {
                public bool ok { get; set; }
                public String error { get; set; }
                public SlackFile file { get; set; }
            }
    
            // a slack file
            class SlackFile
            {
                public String id { get; set; }
                public String name { get; set; }
            }
    
            // sends a slack message asynchronous
            // throws exception if message can not be sent
            public static async Task UploadFileAsync(string token, string path, string channels)
            {
                // we need to send a request with multipart/form-data
                var multiForm = new MultipartFormDataContent();
    
                // add API method parameters
                multiForm.Add(new StringContent(token), "token");
                multiForm.Add(new StringContent(channels), "channels");
    
                // add file and directly upload it
                FileStream fs = File.OpenRead(path);
                multiForm.Add(new StreamContent(fs), "file", Path.GetFileName(path));
    
                // send request to API
                var url = "https://slack.com/api/files.upload";
                var response = await client.PostAsync(url, multiForm);
    
                // fetch response from API
                var responseJson = await response.Content.ReadAsStringAsync();
    
                // convert JSON response to object
                SlackFileResponse fileResponse =
                    JsonConvert.DeserializeObject<SlackFileResponse>(responseJson);
    
                // throw exception if sending failed
                if (fileResponse.ok == false)
                {
                    throw new Exception(
                        "failed to upload message: " + fileResponse.error
                    );
                }
                else
                {
                    Console.WriteLine(
                            "Uploaded new file with id: " + fileResponse.file.id
                    );
                }
            }
    
            static void Main(string[] args)
            {
                // upload this file and wait for completion
                UploadFileAsync(
                    "xoxp-YOUR-TOKEN",
                    "C:\\temp\\Stratios_down.jpg",
                    "test"
                ).Wait();
    
                Console.ReadKey();
    
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-12-02 03:30

    Here is a shorter working example showing how to just upload any file to Slack with C# only. The example will also automatically share the file the given channel.

    I have included the logic to convert the API response from JSON, which will always be needed to determine if the API call was successful.

    Note: This example requires Newtonsoft.Json

    using System;
    using System.Net;
    using System.Collections.Specialized;
    using System.Text;
    using Newtonsoft.Json;
    
    public class SlackExample
    {
        // classes for converting JSON respones from API method into objects
        // note that only those properties are defind that are needed for this example
    
        // reponse from file methods
        class SlackFileResponse
        {
            public bool ok { get; set; }
            public String error { get; set; }
            public SlackFile file { get; set; }
        }
    
        // a slack file
        class SlackFile
        {
            public String id { get; set; }
            public String name { get; set; }        
        }
    
        // main method with logic
        public static void Main()
        {
            var parameters = new NameValueCollection();
    
            // put your token here
            parameters["token"] = "xoxp-YOUR-TOKEN";
            parameters["channels"] = "test";
    
            var client = new WebClient();
            client.QueryString = parameters;
            byte[] responseBytes = client.UploadFile(
                    "https://slack.com/api/files.upload",
                    "D:\\temp\\Stratios_down.jpg"
            );
    
            String responseString = Encoding.UTF8.GetString(responseBytes);
    
            SlackFileResponse fileResponse =
                JsonConvert.DeserializeObject<SlackFileResponse>(responseString);
        }
    }
    

    About content types: Those are part of the header of a HTTP request and can be set manually in the WebClient object (see also this answer). However, for our case you can ignore it, because the default content types that WebClient is using for the POST request will work just fine.

    Also see this answer on how to upload files with the WebClient class.

    0 讨论(0)
  • 2020-12-02 03:30

    Images in message

    If you want to include an image in your message (along with some text) you can do so by adding images as message attachment to a normal message send with chat.postMessage.

    For that you need a public URL of your image and that link with the image_url property to an attachment. That attachment can also contain text, and you can add multiple attachments to your message.

    This is how it looks like:

    And here is how this message looks in JSON:

    {
        "channel": "test",
        "text": "This is a message example with images in the attachment",
        "attachments": [
            {
                "fallback": "game over",
                "text": "This is some text in the attachement",
                "image_url": "https://i.imgur.com/jO9N3eJ.jpg"
    
            }
        ]
    }
    

    Uploading images

    The image URL needs to be publicly accessible on the Internet. So you need to host your image file on a public webserver or upload it to a image cloud service (e.g. imgur.com).

    You can also use Slack as cloud service for your images. Here is how that works:

    1. Upload to Slack: Upload your image to your Slack workspace with files.upload

    2. Get public URL: Get a public URL for your image file with files.sharedPublicURL. Normally all files on Slack are private, but you can only use public URLs for message attachments.

    3. Send message: Include your image as attachment in a message: Use the permalink_public property of your image file as value for image_url

    Example code

    Here is a full working example in C# for first uploading an image to Slack and then using it in a message.

    Note: This example requires Newtonsoft.Json.

    using System;
    using System.Net;
    using System.Collections.Specialized;
    using System.Text;
    using Newtonsoft.Json;
    
    public class SlackExample
    {
        // classes for converting JSON respones from API method into objects
        // note that only those properties are defind that are needed for this example
    
        // reponse from file methods
        class SlackFileResponse
        {
            public bool ok { get; set; }
            public String error { get; set; }
            public SlackFile file { get; set; }
        }
    
        // a slack file
        class SlackFile
        {
            public String id { get; set; }        
            public String name { get; set; }
            public String permalink_public { get; set; }
        }
    
        // reponse from message methods
        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 attachment
        class SlackAttachment
        {
            public String fallback { get; set; }
            public String text { get; set; }
            public String image_url { get; set; }
        }
    
        // main method with logic
        public static void Main()
        {
            String token = "xoxp-YOUR-TOKEN";
    
    
            /////////////////////
            // Step 1: Upload file to Slack
    
            var parameters = new NameValueCollection();
    
            // put your token here
            parameters["token"] = token;
    
            var client1 = new WebClient();
            client1.QueryString = parameters;
            byte[] responseBytes1 = client1.UploadFile(
                    "https://slack.com/api/files.upload",
                    "C:\\Temp\\Stratios_down.jpg"
            );
    
            String responseString1 = Encoding.UTF8.GetString(responseBytes1);
    
            SlackFileResponse fileResponse1 = 
                JsonConvert.DeserializeObject<SlackFileResponse>(responseString1);
    
            String fileId = fileResponse1.file.id;
    
    
            /////////////////////
            // Step 2: Make file public and get the URL
    
            var parameters2 = new NameValueCollection();
            parameters2["token"] = token;
            parameters2["file"] = fileId;
    
            var client2 = new WebClient();
            byte[] responseBytes2 = client2.UploadValues("https://slack.com/api/files.sharedPublicURL", "POST", parameters2);
    
            String responseString2 = Encoding.UTF8.GetString(responseBytes2);
    
            SlackFileResponse fileResponse2 =
                JsonConvert.DeserializeObject<SlackFileResponse>(responseString2);
    
            String imageUrl = fileResponse2.file.permalink_public;
    
    
            /////////////////////
            // Step 3: Send message including freshly uploaded image as attachment
    
            var parameters3 = new NameValueCollection();
            parameters3["token"] = token;
            parameters3["channel"] = "test_new";        
            parameters3["text"] = "test message 2";
    
            // create attachment
            SlackAttachment attachment = new SlackAttachment();
            attachment.fallback = "this did not work";
            attachment.text = "this is anattachment";
            attachment.image_url = imageUrl;
            SlackAttachment[] attachments = { attachment };        
            parameters3["attachments"] = JsonConvert.SerializeObject(attachments);
    
            var client3 = new WebClient();
            byte[] responseBytes3 = client3.UploadValues("https://slack.com/api/chat.postMessage", "POST", parameters3);
    
            String responseString3 = Encoding.UTF8.GetString(responseBytes3);
    
            SlackMessageResponse messageResponse =
                JsonConvert.DeserializeObject<SlackMessageResponse>(responseString3);
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题