如何通过Clack通过Slack-App在特定频道中以用户身份而不是App身份通过附件发布消息

时间:2018-11-07 15:18:50

标签: c# slack slack-api

我一生中都无法向网络发布的消息之外的消息发布消息。而且我不能像我自己那样(在我的slackID下)像App那样做。

问题是我必须为我的公司执行此操作,因此我们可以将Slack集成到我们自己的软件中。我只是不了解JSON的“有效载荷”是什么样子(实际上,我确实按照Slack网站上所说的那样进行操作,但它根本不起作用-它始终会忽略“令牌”,“用户”,“频道”等。

我也不明白如何使用“ https://slack.com/api/chat.postMessage”之类的url方法-它们在哪里?正如您可能在我的代码中看到的那样,我只有webhookurl,如果不使用它,则无法发布任何内容。同样,我也不明白如何使用诸如令牌,特定的userId,特定的通道之类的参数...-如果我尝试将其放入有效负载中,它们似乎会被忽略。

好吧,足够的抱怨!现在,我将向您展示我到目前为止所得到的。这是谁在网上发布了此信息!但是我更改并添加了一些内容:

watch->$route

我做了此类,所以我可以将有效载荷作为对象来处理:

import pandas as pd
import numpy as np

np.random.seed(1)

df = pd.DataFrame(np.random.choice([0, 1, 50], (3200,660)))

data = df.values
idxs = [np.where(d == 50) for d in data]
sums = [sum(d[:i[0][0]]) if i[0].size else 0 for d, i in zip(data, idxs)]

data = np.column_stack((data, sums))

df = df.assign(answer=sums)

df.head()

#    0   1   2   3   4   5  6   7   8   9   ...    651  652  653  654  655  \
#0   1   0   0   1   1   0  0   1   0   1   ...     50   50    1    1    0   
#1   1   0  50   1  50  50  0   1   1  50   ...      1    0    1    0    0   
#2  50   0   1   0   1  50  1  50   0  50   ...      0   50    1   50   50   
#3   0   1   0  50   1   0  0  50   1   0   ...      1    1    0    1    1   
#4   1  50   1   1   1   1  0  50  50   1   ...      0    1    0    1    0   
#
#   656  657  658  659  answer  
#0    0    0    1    0       5  
#1    1   50    0   50       1  
#2   50    1    1   50       0  
#3    0   50    1   50       1  
#4    0   50    0   50       1  

对于任何能够发布完整代码的人,我都会非常感激,这些代码真正表明了我将如何处理有效负载。和/或实际的URL看起来像是发送到备用设备...所以我也许可以理解到底发生了什么:)

2 个答案:

答案 0 :(得分:1)

1。传入的Webhook与chat.postMessage

Slack应用程序的传入Webhook始终固定在频道上。 Incoming Webhook的遗留变体支持覆盖渠道,但必须单独安装且不会成为Slack应用程序的一部分。 (另请参见this answer)。

因此,您要使用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,了解如何使用更高级的异步方法。

答案 1 :(得分:0)

这是有关如何发送带有附件的Slack消息的改进示例。

此示例使用更好的 async 方法发送请求和包含消息的消息。附件是从C#对象构造的。

此外,请求以现代JSON正文POST的形式发送,这要求在标头中设置令牌。

注意:需要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();

        }
    }

}