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
Сообщения
276
Благодарностей
103
Баллы
43
Столкнулся с такой же проблемой)
Нашёл решение?
 

Prometeus

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 452
Баллы
113
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод 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 file1=@"c:\1.jpg"; // первый файл
string file2=@"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;
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

BAZAg

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

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
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
Сообщения
136
Благодарностей
18
Баллы
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 file1=@"c:\1.jpg"; // первый файл
string file2=@"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;
Как к этому запросу добавить текст?
Т.е несколько фото + текст?
 
  • Спасибо
Реакции: PavelK

vasyaya

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


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());
}

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

Результат


PS: Из папки References перекинуь все в папку ExternalAssemblies в папке зенки.
А как обычные пост гет запросы составлять используя этот Net client ?
 

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