Інколи приходиться ділитись скриншотами, чи розміщати картинку на якомусь сервісі. Популярні програми для створення скрішнотів вішають поряд багато реклами і через деякий час видаляють зображення. А сервіс 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, яке також буде зберігатись на серверах цього сервісу.