我一生中都无法向网络发布的消息之外的消息发布消息。而且我不能像我自己那样(在我的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看起来像是发送到备用设备...所以我也许可以理解到底发生了什么:)
答案 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();
}
}
}