Інколи приходиться ділитись скриншотами, чи розміщати картинку на якомусь сервісі. Популярні програми для створення скрішнотів вішають поряд багато реклами і через деякий час видаляють зображення. А сервіс Pinterest який я колись використовував для розміщення там своїх зображеннь також має властивість блокувати аккаунт, що призводить до втрати всіх завантажених раніше зображень. Тому як варіант – використовувати сервіс Telegra.ph
Власне перевага його очевидна – зображення завантажуються на сервери Telegra.ph без використання даних користувача (тобто анонімно). Це в свою чергу означає, що сервіс не може заблокувати всі зображення одночасно – максимум якщо якесь одне зображення нарушає правила, то саме воно і буде видалено.
Я не знаю, скільки часу зберігається зображення на цьому сервісі. Але щось мені підказує, що якщо завантажена картинка буде використовуватись в якійсь публікації, тобто її час від часу хтось буде переглядати – то видаляти її ніхто не буде.
Сказано – зроблено! Нижче фрагмент коду C#, який використовуючи методи програми ZennoPoster відправляє HTTP запит методом POST в форматі даних multipart. Тобто, в одному фрагменті цього коду є інформація:
– як згенерувати випадкове ім’я файла
– як сформувати boundary,
– як прочитати файл в масив байт
– як підготувати дані в форматі multipart
– як відправляти запити,
– як десеріалізувати JSON в List
– як одержати значення в першого Dictionary
// Добавити в GAS бібліотеку System.Net.Http.dll string[] domains = new[]{ "telegra.ph", "graph.org" }; string url = string.Format("https://{0}/upload",domains[0]); string path = @"C:\image.jpg"; string proxy = string.Empty; var sBoundary = DateTime.Now.Ticks.ToString("x"); string file_name = project.Profile.RegenerateLogin("[Lat|4][RndNum|1970|1990]") +".jpg"; var file_data = new System.Net.Http.ByteArrayContent(File.ReadAllBytes(path)); file_data.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "photo", FileName = file_name }; var content = new System.Net.Http.MultipartFormDataContent(sBoundary); content.Add(file_data, "photo"); string content_type = string.Format("multipart/form-data;boundary={0}", sBoundary); byte[] multipart_byte = content.ReadAsByteArrayAsync().Result.ToArray(); var method = ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST; string encoding =Encoding.UTF8.WebName; var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; string json = ZennoPoster.HTTP.Request( method: method, // метод яким буде відправлено запит url: url,// по якому адресу буде відправлено запит content: multipart_byte, // які дані буде відправляти запит contentPostingType: content_type, // який тип контенту буде відправляти запит proxy: proxy, // з якого IP відправляти запит Encoding: encoding, // в якому кодуванні відправляти запит respType: type, // в якому вигляді повернути результат Timeout: 180 * 1000, // скільки часу очікувати результат UseRedirect: false, // включити слідування переадресаціям MaxRedirectCount: 0, // слідувати php переадресаціям UseOriginalUrl: true, // не змінювати параметри запиту removeDefaultHeaders: true // видалення стандартних заголовків );
Результат приходить приблизно в такому JSON, який містить масив об’єктів:
[{"src":"\/file\/d92217bd5451a4c34cca7.jpg"}]
Власне необхідно просто десеріалізувати JSON в список словників, після чого вже можна одержати звідти значення посилання поля src, яке і буде містити посилання на завантажене зображення:
var dic = Global.ZennoLab.Json.JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(json); return dic.First()["src"];
Тепер, якщо до результату добавити домен, получиться посилання на зображення яке вже можна використовувати в своїх цілях, при чому зображення буде доступним на декількох доменах:
https://telegra.ph/file/0cce0b06286dc5e704263.jpg https://graph.org/file/0cce0b06286dc5e704263.jpg
Також, якщо є необхідність завантажити відео mp4 розміром до 5 мегабайт, то потрібно подавати шлях до відео і рядку генерації імені замінити jpg на mp4.
В такому випадку, відео буде завантажено і буде відкриватись наприклад по такому посиланню:
https://telegra.ph/file/f3a80cd55b5b500175fe3.mp4
Перейти на: тестове відео превью
Якщо часу на завантаження замало, наприклад на при використанні повільних проксі – час у очікування в коді потрібно збільшити (Timeout: 180 * 1000), хоча в моєму випадку достатньо 180 секунд.
В цій публікації було розказано як завантажити зображення на сервери сервісу Telegra.ph за допомогою програми ZennoPoster, а також у випадку необхідності цим способом можна завантажити коротке відео mp4, яке також буде зберігатись на серверах цього сервісу.