POST-запрос Telegram (sendMediaGroup)

StillUnknown

Новичок
Регистрация
27.01.2019
Сообщения
1
Благодарностей
0
Баллы
1
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод SendPhoto - всё отлично.
Но нужно 2-3 фото именно альбомом, через sendMediaGroup - не может подхватить файлы.
или же прилетает - "can't parse media JSON object".
Может кто помочь?
 

GREXA

Client
Регистрация
16.09.2017
Сообщения
180
Благодарностей
61
Баллы
28
Столкнулся с такой же проблемой)
Нашёл решение?
 

Prometeus

Client
Регистрация
25.12.2019
Сообщения
26
Благодарностей
0
Баллы
1
Скажите зенка в однопоток. Есть смысл замарачиваться с запросами или это актуально только для многопотоков. Получю ли прибавку в скорости?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
886
Благодарностей
1 125
Баллы
93
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод SendPhoto - всё отлично.
Но нужно 2-3 фото именно альбомом, через sendMediaGroup - не может подхватить файлы.
или же прилетает - "can't parse media JSON object".
Может кто помочь?
Вот, таким кодом отправляю 2 картинки с использованием метода sendMediaGroup.
Уверен, что код можно написать более правильно, лаконично, но всё таки предоставляю в виде "как есть".
Основная проблема у всех кто пытается решить эту проблему в том, что либо сборка JSON производится строками вручную.
Также при отправке фоток нужно указывать Content-Type - без него телеграмм возвращает также ошибки.

Код:
string TOKEN="354870981:AAFdcMFтокенRt56kb_Gunw19M1-JL0";
string CHAT_ID="126256687";
string url_telegram = string.Format("https://api.telegram.org/bot{0}/sendMediaGroup?chat_id={1}",TOKEN, CHAT_ID);
string sBoundary = DateTime.Now.Ticks.ToString("x");
string contentType = "multipart/form-data";

// Формируем данные JSON
Func<string, string, string, string> multiFormDataText = delegate(string key, string value, string boundary) {
var output = string.Format("--{0}\r\n", boundary);
output += string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", key);
output += value + "\r\n";
return output;
};

// Формируем данные о файлах
Func<string, string, string, string> multiFormDataText1 = delegate(string k, string v, string boundary) {
var output = string.Format("--{0}\r\n", boundary);
output += (string.Format(@"Content-Disposition: name=""{0}""; filename=""{1}""", k, v)+ "\r\n");
output += "Content-Type: image/jpeg\r\n"; // тип файла
output += v + "\r\n";
return output;
};

// Пути к файлам
string [email protected]"c:\1.jpg"; // первый файл
string [email protected]"c:\2.jpg"; // второй файл

// Формируем вложение
string image1=string.Format(@"attach://{0}", Path.GetFileName(file1));
string image2=string.Format(@"attach://{0}", Path.GetFileName(file2));

// Перечисляем вложения
List<object> list = new List<object>();
list.Add(new {type="photo", media= image1});
list.Add(new {type="photo", media= image2});

// Оформляем JSON
string media = Global.ZennoLab.Json.JsonConvert.SerializeObject(list);

// Подготавливаем данные для запроса
string content= multiFormDataText("media", media, sBoundary);
content+= multiFormDataText1(Path.GetFileName(file1), file1, sBoundary);
content+= multiFormDataText1(Path.GetFileName(file2), file2, sBoundary);

// Отправляем запрос
string post = ZennoPoster.HttpPost(url: url_telegram, content: content,contentPostingType: contentType);
return post;
 
  • Спасибо
Реакции: booms1, kul0n и Mikhail B.

BAZAg

Client
Регистрация
08.11.2015
Сообщения
886
Благодарностей
1 125
Баллы
93
т.е. в одну строку надо составлять?
Нужно думать какие символы и как экранировать, чтобы каких-то лишних пробелов не было.
Если же собирать автоматически - эта проблема пропадает.
 
  • Спасибо
Реакции: one

Moadip

Client
Регистрация
26.09.2015
Сообщения
508
Благодарностей
778
Баллы
93
Уверен, что код можно написать более правильно, лаконично
Ты прав, можно более лаконично сделать. Тем более все уже давно изобретено.
Вот нравится же народу ковыряться с голыми запросами, усложняя себе жизнь.:-)


C#:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

var chatId = 12345678;
var token = "tokenBotApi";

// с прокси
//var proxy = new WebProxy("123.123.123.123:8888");
//proxy.Credentials = new NetworkCredential("login", "password");
//var tgBot = new TelegramBotClient(token, proxy);

// без прокси
var tgBot = new TelegramBotClient(token);

//---

var imgsFolder = project.Directory + "//Imgs//";

var fileList = new List<string>()
{
    imgsFolder + "CatFilterReaction.jpg",
    imgsFolder + "Cat.jpg",
    imgsFolder + "539814-istock-821264870.jpg",
    imgsFolder + "1800x1200_cats_and_excessive_meowing_ref_guide.jpg",
};

var mediaGroup = new List<IAlbumInputMedia>();

foreach (var path in fileList)
{
    var imp = new InputMediaPhoto(
        new InputMedia(
            new FileStream(path, FileMode.Open),
            Path.GetFileName(path)));

    mediaGroup.Add(imp);
}

try
{
    tgBot.SendMediaGroupAsync(mediaGroup, new ChatId(chatId)).Wait();
}
catch(Exception ex)
{
    project.SendInfoToLog(ex.ToString());
}

Кому нужны сокс прокси

Результат
50964


PS: Из папки References перекинуь все в папку ExternalAssemblies в папке зенки.
 

Вложения

booms1

Client
Регистрация
20.08.2019
Сообщения
124
Благодарностей
13
Баллы
18
Вот, таким кодом отправляю 2 картинки с использованием метода sendMediaGroup.
Уверен, что код можно написать более правильно, лаконично, но всё таки предоставляю в виде "как есть".
Основная проблема у всех кто пытается решить эту проблему в том, что либо сборка JSON производится строками вручную.
Также при отправке фоток нужно указывать Content-Type - без него телеграмм возвращает также ошибки.

Код:
string TOKEN="354870981:AAFdcMFтокенRt56kb_Gunw19M1-JL0";
string CHAT_ID="126256687";
string url_telegram = string.Format("https://api.telegram.org/bot{0}/sendMediaGroup?chat_id={1}",TOKEN, CHAT_ID);
string sBoundary = DateTime.Now.Ticks.ToString("x");
string contentType = "multipart/form-data";

// Формируем данные JSON
Func<string, string, string, string> multiFormDataText = delegate(string key, string value, string boundary) {
var output = string.Format("--{0}\r\n", boundary);
output += string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", key);
output += value + "\r\n";
return output;
};

// Формируем данные о файлах
Func<string, string, string, string> multiFormDataText1 = delegate(string k, string v, string boundary) {
var output = string.Format("--{0}\r\n", boundary);
output += (string.Format(@"Content-Disposition: name=""{0}""; filename=""{1}""", k, v)+ "\r\n");
output += "Content-Type: image/jpeg\r\n"; // тип файла
output += v + "\r\n";
return output;
};

// Пути к файлам
string [email protected]"c:\1.jpg"; // первый файл
string [email protected]"c:\2.jpg"; // второй файл

// Формируем вложение
string image1=string.Format(@"attach://{0}", Path.GetFileName(file1));
string image2=string.Format(@"attach://{0}", Path.GetFileName(file2));

// Перечисляем вложения
List<object> list = new List<object>();
list.Add(new {type="photo", media= image1});
list.Add(new {type="photo", media= image2});

// Оформляем JSON
string media = Global.ZennoLab.Json.JsonConvert.SerializeObject(list);

// Подготавливаем данные для запроса
string content= multiFormDataText("media", media, sBoundary);
content+= multiFormDataText1(Path.GetFileName(file1), file1, sBoundary);
content+= multiFormDataText1(Path.GetFileName(file2), file2, sBoundary);

// Отправляем запрос
string post = ZennoPoster.HttpPost(url: url_telegram, content: content,contentPostingType: contentType);
return post;
Как к этому запросу добавить текст?
Т.е несколько фото + текст?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)