- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要有关将文件上传到 Slack 的帮助。
到目前为止,我有一个 Slack-App 正在使用我的代码(如下)。但我所能做的就是发信息。我无法将图像附加到消息中——因为我不明白如何使用所谓的“方法”,而且 Slack 的语法在他们的 API 页面上“显示”。
这会创建我的“内容”,在它下面只是一个流,用于读取我可以上传的文件:
public class PostMessage
{
public FormUrlEncodedContent Content(string message, string file)
{
var values = new Dictionary<string, string>
{
{"token", "xoxp-myToken"},
{ "username", "X"},
{ "channel", "myChannel"},
{ "as_user", "false"},
{"text", message},
{ "content", file},
{ "attachments","[{ \"fallback\":\"dummy\", \"text\":\"this is a waste of time\"}]"}
};
var content = new FormUrlEncodedContent(values);
return content;
}
}
public class PostFile
{
String path = @"C:\Users\f.held\Desktop\Held-Docs\dagged.jpg";
public string ReadImageFile()
{
FileInfo fileInfo = new FileInfo(path);
long imageFileLength = fileInfo.Length;
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] imageData = br.ReadBytes((int)imageFileLength);
var str = Encoding.Default.GetString(imageData);
return str;
}
}
}
通信的客户端:
public class SlackClient
{
private readonly Uri _webhookUrl;
private readonly HttpClient _httpClient = new HttpClient {};
public SlackClient(Uri webhookUrl)
{
_webhookUrl = webhookUrl;
}
public async Task<HttpResponseMessage> SendMessageAsync(FormUrlEncodedContent content)
{
var response = await _httpClient.PostAsync(_webhookUrl, content);
return response;
}
}
}
主要内容:
public static void Main(string[] args)
{
Task.WaitAll(IntegrateWithSlackAsync());
}
private static async Task IntegrateWithSlackAsync()
{
var webhookUrl = new Uri("https://slack.com/api/files.upload");
var slackClient = new SlackClient(webhookUrl);
PostMessage PM = new PostMessage();
PostFile PF = new PostFile();
while (true)
{
Console.Write("Type a message: ");
var message = Console.ReadLine();
var testFile = PF.ReadImageFile();
FormUrlEncodedContent payload = PM.Content(message, testFile);
var response = await slackClient.SendMessageAsync(payload);
var isValid = response.IsSuccessStatusCode ? "valid" : "invalid";
Console.WriteLine($"Received {isValid} response.");
Console.WriteLine(response);
response.Dispose();
}
}
}
如果有人有关于上传必须是什么样子的例子。甚至更好,
如果有人真的能解释这些 Slack-Messages 必须具备的语法。
那就太好了!我仍然不知道我应该把所谓的放在哪里以及如何放“接受的内容类型:multipart/form-data、application/x-www-form-urlencoded” 到我的上传。我只是找不到这方面的例子......
编辑:
让我非常困惑的是,Slack 声明他们有一个名为 file.upload
的额外方法 - 但我们不应该再使用它,我们应该只使用 postMessage
。
但是我如何在消息中“打包”一个文件呢?我的语法似乎总是不正确。特别是当涉及到“内容”时...我就是想不通 C# 代码应该是什么样子。我在哪里声明上述“内容类型”?
另一个问题是,它总是通过 - 意味着我从服务器收到 200 响应。但它从不显示文件(这可能意味着语法已关闭)或者我得到 200 响应,但该消息从未在 Slack 中显示。
最佳答案
消息中的图片
如果您想在消息中包含图像(连同一些文本),您可以通过将图像作为消息附件添加到使用 chat.postMessage
发送的普通消息中来实现。 .
为此,您需要图像的公共(public) URL 以及与 image_url
的链接附件的属性。该附件还可以包含文本,您可以在邮件中添加多个附件。
它是这样的:
下面是这条消息在 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"
}
]
}
上传图片
图像 URL 需要可在 Internet 上公开访问。因此,您需要将图像文件托管在公共(public)网络服务器上或将其上传到图像云服务(例如 imgur.com)。
您还可以将 Slack 用作图像的云服务。这是它的工作原理:
上传到 Slack:使用 files.upload
将您的图像上传到您的 Slack 工作区
获取公共(public) URL:使用 files.sharedPublicURL
获取图像文件的公共(public) URL .通常 Slack 上的所有文件都是私有(private)的,但您只能将公共(public) URL 用于消息附件。
发送消息:将您的图像作为附件包含在消息中:使用 permalink_public
图像文件的属性作为 image_url
的值
示例代码
这是一个完整的 C# 示例,首先将图像上传到 Slack,然后在消息中使用它。
注意:此示例需要 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);
}
}
关于c# - 如何通过 C# 中的 Slack-App 在 Slack 上上传任何文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264117/
我刚刚创建了一个新的 Slack 应用程序并向其中添加了一个机器人。 现在我有 2 个可用的 token : OAuth 访问 token (xoxp) 机器人用户 OAuth 访问 token (x
我正在构建与 Slack 和客户端的消息传递集成。我需要在用户登录客户端时在相应的对话上显示徽章,以向客户端显示它有多少条未读消息。 我知道 channels.history 方法有 unreads
我有一个 slack POST api 调用,我正在从我的应用程序中调用它:- slack_client.api_call("chat.postMessage", channel=channel, t
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
Slack 默认头像来自哪里?这是他们自己的服务还是第三方服务? 在任何一种情况下,其他人是否有可能使用头像创建服务/系统,例如通过 slack API? 最佳答案 我 asked Slack dir
我正在编写一个脚本,以我的身份发布自动消息。我很难找到我的用户 token 。我必须创建一个应用程序吗? 最佳答案 是的,您必须创建一个应用程序才能生成用户 token 。您可以从此处创建一个应用程序
我正在为一些自动通知创建一个 slackbot,并且我收到了一个请求,让通知占据整个 slack 窗口的宽度,这看起来更干净。我发现 block 似乎占据了一个指定的宽度,并且不会水平延伸超过该点。我
我想创建一个 Slack 命令 /command do-something-with-that-file,同时用户上传文件。 到目前为止,我的命令已收到,但负载中没有文件。这可能吗? 我还在作用域中添
我一直在使用 Slack 操作 API,但不知道如何使用 response_url 在原始消息的线程中发送回复。 chat.postMessage 选项实际上不起作用,因为它需要手动将机器人添加到 c
“Slack”可以将链接展开为视频,但有些服务可以,有些则不能。 Vimeo( https://vimeo.com/ ) 可以在 Slack 中将链接展开为视频。 TED( https://www.t
我想复制一个现有的 Slack 应用程序,只更改一些小的配置。 除了从头开始创建新的 slack 应用程序并重新配置它之外,还有更简单的方法吗? 最佳答案 或者,您可以使用App Manifest 功
On slack - 我可以使用以下文本语法直接从我的两者中标记用户: hello Francois 我想对群组执行同样的操作(不幸的是,我的应用程序只知道群组名称,不知道群组 ID)。是否有这样做
我们使用通信工具 Slack。它在我的左侧边栏中显示了我最近与之进行过直接消息对话的在线和离开用户。我想在列表中看到当前在线的每个人,我们 Slack 服务器上的所有在线用户。在聊天应用程序的侧边栏中
我正在尝试构建一个在首次安装到工作区时执行某些操作的应用程序,例如:Ping 每个团队成员。 我找不到在应用安装时触发的事件类型: https://api.slack.com/events 有什么办法
我有一个发送长消息的机器人。 当它发送多条消息时,用户图标通常会滚出屏幕,因为没有人在机器人的消息之间发送过消息。 这意味着发送消息的时间和发送者不太明显。 有没有办法强制 Slack 为每条消息显示
我不完全确定这是否适合 Stack Overflow... 只是一个简短的问题,希望很多人会觉得有用。 我看到您可以使用主题标签,但它们必须与现有 channel 相对应。我有一个与一个项目相关的 c
例如,我希望在我休息的日子里每天在特定 channel 中显示提醒。就像是: /remind #channel @me will be on PTO 1/1/2016 until 1/5/2016 然
我被一位同事添加到 Slack 工作区。我一定已经接受了移动应用程序上的某些内容,因为我可以访问那里的工作区。不知何故,桌面应用程序从未反射(reflect)过这种变化,也没有表现出知道工作空间的迹象
我是 Slack 的新手,刚刚创建了我的第一个 channel 。在设置 channel 时,我添加了一个目的,但是一旦创建,还有一个添加主题的地方。 channel 的目的和主题有什么区别?它们看起
线程将是 Slack 的一个非常好的特性,只是它们太窄了,我找不到任何方法来配置它们的宽度。 有谁知道如何扩展线程以使其占用所有屏幕空间(在 Slack 内)?放大不会改变窄度。它只会使字体更大。我想
我是一名优秀的程序员,十分优秀!