Як завантажити зображення на сервери сервіса Telegra.ph

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *