Публикувайте съобщение с прикачен файл в 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();
    }

EDIT1: В този ред:

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

URL адресът е:

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

След това предавам масива от байтове.

РЕДАКТИРАНЕ:

Реших проблема. Работата беше, че каналът трябваше да бъде ID на канала, а не името на канала... глупава грешка :(


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 след свойството на канала, ще работи по-добре.

Пример:

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