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

StillUnknown

Новичок
Joined
Jan 27, 2019
Messages
1
Reaction score
0
Points
1
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод SendPhoto - всё отлично.
Но нужно 2-3 фото именно альбомом, через sendMediaGroup - не может подхватить файлы.
или же прилетает - "can't parse media JSON object".
Может кто помочь?
 

GREXA

Client
Joined
Sep 16, 2017
Messages
276
Reaction score
103
Points
43
Столкнулся с такой же проблемой)
Нашёл решение?
 

Prometeus

Client
Joined
Dec 25, 2019
Messages
27
Reaction score
2
Points
3
Скажите зенка в однопоток. Есть смысл замарачиваться с запросами или это актуально только для многопотоков. Получю ли прибавку в скорости?
 

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,914
Reaction score
2,666
Points
113
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод SendPhoto - всё отлично.
Но нужно 2-3 фото именно альбомом, через sendMediaGroup - не может подхватить файлы.
или же прилетает - "can't parse media JSON object".
Может кто помочь?
Вот, таким кодом отправляю 2 картинки с использованием метода sendMediaGroup.
Уверен, что код можно написать более правильно, лаконично, но всё таки предоставляю в виде "как есть".
Основная проблема у всех кто пытается решить эту проблему в том, что либо сборка JSON производится строками вручную.
Также при отправке фоток нужно указывать Content-Type - без него телеграмм возвращает также ошибки.

Code:
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
Joined
Sep 22, 2015
Messages
6,998
Reaction score
1,305
Points
113
JSON производится строками вручную.
т.е. в одну строку надо составлять?
 

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,914
Reaction score
2,666
Points
113
т.е. в одну строку надо составлять?
Нужно думать какие символы и как экранировать, чтобы каких-то лишних пробелов не было.
Если же собирать автоматически - эта проблема пропадает.
 
  • Thank you
Reactions: one

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
825
Points
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 в папке зенки.
 

Attachments

booms1

Client
Joined
Aug 20, 2019
Messages
139
Reaction score
19
Points
18
Вот, таким кодом отправляю 2 картинки с использованием метода sendMediaGroup.
Уверен, что код можно написать более правильно, лаконично, но всё таки предоставляю в виде "как есть".
Основная проблема у всех кто пытается решить эту проблему в том, что либо сборка JSON производится строками вручную.
Также при отправке фоток нужно указывать Content-Type - без него телеграмм возвращает также ошибки.

Code:
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;
Как к этому запросу добавить текст?
Т.е несколько фото + текст?
 
  • Thank you
Reactions: PavelK

vasyaya

Client
Joined
Feb 9, 2015
Messages
573
Reaction score
36
Points
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 ?
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)