Опубликовать сообщение с файлом, прикрепленным к Slack

Я пишу простое консольное приложение на C # для связи со Slack.com. Я делаю это через их WebApi. В настоящее время я знаю, как публиковать сообщения (с вложениями, цветными, ссылками, пользователями и т. Д.) И отправлять файлы на сервер.

Если вы отправляете файл обычным способом («Загрузить файл» слева от текстового поля), этот файл будет показан в главном окне беседы. Но как добиться того же с помощью WebAPI? В настоящее время после отправки файла я вижу его на правой боковой панели, где перечислены только все файлы.

Также есть второй вопрос: можно ли изменить цвет текста в сообщении (без «строчки» во вложении)?

Это ответ после отправки файла через https://slack.com/api/files.upload

{
    "ok": true,
    "file": {
        "id": "F04EX4***",
        "created": 1429279966,
        "timestamp": 1429279966,
        "name": "Testing.txt",
        "title": "Testing",
        "mimetype": "text\/plain",
        "filetype": "text",
        "pretty_type": "Plain Text",
        "user": "U*********",
        "editable": true,
        "size": 28,
        "mode": "snippet",
        "is_external": false,
        "external_type": "",
        "is_public": false,
        "public_url_shared": false,
        "url": "https:\/\/slack-files.com\/files-pub\/T*******\
/testing.txt",
        "url_download": "https:\/\/slack-files.com\/files-pub\/T************\
/download\/testing.txt",
        "url_private": "https:\/\/files.slack.com\/files-pri\/T*******\
/testing.txt",
        "url_private_download": "https:\/\/files.slack.com\/files-pri\/T**********\
 /download\/testing.txt",
        "permalink": "https:\/\/******.slack.com\/files\/******\
/F0******\/testing.txt",
        "permalink_public": "https:\/\/slack-files.com\/********",
        "edit_link": "https:\/\/******.slack.com\/files\/****\/F******\/testing.txt\/edit",
        "preview": "This is a test file number2.",
        "preview_highlight": "<div class=\
"sssh-code\"><div class=\"sssh-line\"><pre>This is a test file number2.<\/pre><\/div>\n
<\/div>",
        "lines": 1,
        "lines_more": 0,
        "channels": [],
        "groups": [],
        "ims": [],
        "comments_count": 0
    }
}

извините, я не знаю, как это красиво отформатировать.

«Is_external» и «is_public» оба ложны, может быть, это причина - но как я могу установить для них значение «true»?

- >> Спасибо за редактирование! :) Это вся функция, которую я использую:

public static void SlackSendFile()
    {
        FileStream str = File.OpenRead(@"C:\Users\Eru\Desktop\Testing.txt");
        byte[] fBytes = new byte[str.Length];
        str.Read(fBytes, 0, fBytes.Length);
        str.Close();

        var webClient = new WebClient();
        string boundary = "------------------------" + DateTime.Now.Ticks.ToString("x");
        webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
        var fileData = webClient.Encoding.GetString(fBytes);
        var package = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", boundary, "Testing.txt", "multipart/form-data", fileData);

        var nfile = webClient.Encoding.GetBytes(package);
        string url = "https://slack.com/api/files.upload?token=" + Token + "&content=" + nfile + "&channels=[" + Channel + "]";

        byte[] resp = webClient.UploadData(url, "POST", nfile);

        var k = System.Text.Encoding.Default.GetString(resp);
        Console.WriteLine(k);
        Console.ReadKey();
    }

РЕДАКТИРОВАТЬ1: В этой строке:

 byte[] resp = webClient.UploadData(url, "POST", nfile);

URL-адрес:

 https://slack.com/api/files.upload?token=*********&content=System.Byte[]&channels=[%23*****]

Затем я передаю массив байтов.

РЕДАКТИРОВАТЬ:

Я решил проблему. Дело в том, что у канала должен быть идентификатор канала, а не имя канала ... глупая ошибка :(


person Eru    schedule 17.04.2015    source источник
comment
Попробуйте прочитать это: api.slack.com/methods/files.upload   -  person maccettura    schedule 17.04.2015
comment
Да, вот как я отправляю файлы. Но это не показывает файл в главном окне беседы.   -  person Eru    schedule 17.04.2015
comment
Попробуйте отладить свое приложение, чтобы увидеть, какой HTTP-ответ вернется, а также убедитесь, что уровень доверия вашего приложения установлен на полный.   -  person maccettura    schedule 17.04.2015
comment
Можете ли вы показать нам JSON, который вы тоже публикуете?   -  person maccettura    schedule 17.04.2015
comment
Вы уверены, что интеграция с Slack API сейчас активна? Кроме того, пробовали ли вы увидеть значение строки url после того, как она была объединена (чтобы увидеть, выглядит ли она как правильный URL)?   -  person maccettura    schedule 17.04.2015
comment
Я отредактировал сообщение, добавив URL. что значит АКТИВНЫЙ? как это проверить? Думаю, да, так как я тоже могу отправлять сообщения и файлы, но они не отображаются в главном окне беседы.   -  person Eru    schedule 20.04.2015
comment
У вас настроена и включена интеграция в Slack? Это может быть глупый вопрос, но похоже, что ты все делаешь правильно, это единственное, что я могу придумать.   -  person maccettura    schedule 20.04.2015
comment
Все, что у меня есть в моих настроенных интеграциях, - это входящие веб-перехватчики (помимо всего прочего, что сейчас не имеет значения). У меня есть одна функция, которая использует URL: hooks.slack.com/services ..... и файл, который я отправляю в API ... может мне стоит там еще что-то настроить? :(   -  person Eru    schedule 21.04.2015
comment
проблема решена - ›см. сообщение, последнее редактирование   -  person Eru    schedule 21.04.2015
comment
Вау, это действительно странно, я всегда использовал только это имя. Рад, что у вас все получилось!   -  person maccettura    schedule 21.04.2015
comment
Спасибо за помощь :)   -  person Eru    schedule 22.04.2015
comment
Отличная статья. Кстати, если вы тестируете локальные веб-перехватчики, я рекомендую программу под названием ngrok с сайта ngrok.com. Как только вы его настроите. Вы можете выполнить командную строку на своем компьютере разработчика, чтобы протестировать локальный API с помощью ngrok http -host-header = localhost: 9000 9000 Если ваш порт api был на 9000, например   -  person Rudy Hinojosa    schedule 21.06.2016


Ответы (3)


Если вы добавите pretty = 1 после свойства channel, это будет работать лучше.

Пример:

string url = "https://slack.com/api/files.upload?token=" + token + "&content=" + nfile + "&channels=[" + Channel + "]&pretty=1"
person CurseZzZzz    schedule 17.05.2017

Привет, чистый пример с RestSharp

public void UploadFile(string token, string filePath, string channel)
{
    var client = new RestClient("https://slack.com");

    var request = new RestRequest("api/files.upload", Method.POST);
    request.AddParameter("token", token);
    request.AddParameter("channels", channel);

    var fileInfo = new FileInfo(filePath);
    request.AddFile("file", File.ReadAllBytes(filePath), fileInfo.Name, contentType:"multipart/form-data");

    //Execute the request
    var response = client.Execute(request);
    var content = response.Content;
}
person live2    schedule 15.09.2017

Мне пришлось немного изменить ваш код, чтобы он работал для тех, кто все еще ищет это. Мне нужно было преобразовать массив файлов в строку в кодировке ASCII, а затем преобразовать детали в параметры.

    public static void SlackSendFile(string token, string channelId, string filepath)
    {
        FileStream str = File.OpenRead(filepath);
        byte[] fBytes = new byte[str.Length];
        str.Read(fBytes, 0, fBytes.Length);
        str.Close();

        var webClient = new WebClient();
        string boundary = "------------------------" + DateTime.Now.Ticks.ToString("x");
        webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
        var fileData = webClient.Encoding.GetString(fBytes);
        var package = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", boundary, "Testing.txt", "multipart/form-data", fileData);

        var nfile = webClient.Encoding.GetBytes(package);
        var encodedfile = System.Text.Encoding.ASCII.GetString(nfile);
        string url = "https://slack.com/api/files.upload?token=" + token + "&content=" + encodedfile + "&channels=" + channelId + "";

        byte[] resp = webClient.UploadData(url, "POST", nfile);

        var k = System.Text.Encoding.Default.GetString(resp);
        Console.WriteLine(k);
    }
person SumGuy    schedule 31.10.2017