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

StillUnknown

Новичок
Регистрация
27.01.2019
Сообщения
1
Реакции
0
Баллы
1
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод SendPhoto - всё отлично.
Но нужно 2-3 фото именно альбомом, через sendMediaGroup - не может подхватить файлы.
или же прилетает - "can't parse media JSON object".
Может кто помочь?
 
Столкнулся с такой же проблемой)
Нашёл решение?
 
Скажите зенка в однопоток. Есть смысл замарачиваться с запросами или это актуально только для многопотоков. Получю ли прибавку в скорости?
 
Очень много времени убил на попытки отправить фото в телегу с помощью бота.
Одно фото через метод 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
Уверен, что код можно написать более правильно, лаконично
Ты прав, можно более лаконично сделать. Тем более все уже давно изобретено.
Вот нравится же народу ковыряться с голыми запросами, усложняя себе жизнь.:-)


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 в папке зенки.
 

Вложения

Вот, таким кодом отправляю 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
Ты прав, можно более лаконично сделать. Тем более все уже давно изобретено.
Вот нравится же народу ковыряться с голыми запросами, усложняя себе жизнь.:-)


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 ?
 

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