Метод sendDocument для Телеграм бота

1. fugu 23 12.04.24 18:54 Сейчас в теме
Добрый день.

Есть задача передать файл pdf в телеграмм-бот по нажатию кнопки в боте.
Данные о нажатии кнопки приходят в 1С.

Я делаю следующее:

Если ДанныеЗапроса.text = "Получить документ" Тогда  
				
стр.Вставить("method", "sendDocument");	 
стр.Вставить("chat_id", Чат); 
ПолныйПуть = "d:\1111.pdf";   
ИмяФайла = "1111.pdf";     
				
Boundary         = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипКонтента        = "multipart/form-data; boundary=" + Boundary;   
				
Док = ""; 
Док = Док + "--"+ Boundary+ РазделительСтрок;   
док = док +  "Content-Disposition: form-data; name=""chat_id"""+РазделительСтрок; 
док = док + СтрЗаменить(Строка(Чат), Символы.НПП, "") + РазделительСтрок;
Док = Док + "--"+ Boundary+ РазделительСтрок;   
док = док +  "Content-Disposition:  form-data; name=""document""; filename="""+ ИмяФайла+""""+РазделительСтрок;
док = док +  "Content-Type: application/pdf"+РазделительСтрок;    
ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть);
				

док = док + ДвоичныеДанные + РазделительСтрок;    
док = док + "--" +   Boundary + "--" + РазделительСтрок;

стр.Вставить("document", док);

Ответ = Новый HTTPСервисОтвет(200); 
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON(стр));                    
Ответ.Заголовки.Вставить("Content-Type",  ТипКонтента);   
 Ответ.Заголовки.Вставить("Connection", "keep-alive");  
Возврат Ответ;
Показать


код проходит без ошибок, но ничего не передается.
я понимаю, что как-то я не так передаю сам файл.

Все что нашёл - это передача файла через getUpdates

Прошу помочь...
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
4. Xershi 1505 12.04.24 22:21 Сейчас в теме +1 $m
(3)
МойToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11";
АдресTelegramAPI = "api.telegram.org";
ПроксиАдрес = "159.138.22.170";
ПроксиПорт = 3128;
ЧатID = "882646417";

ПутьКФайлу = "C:\1.pdf";
Boundary = "----"+Строка(Новый УникальныйИдентификатор());

Файл = Новый Файл(ПутьКФайлу);

//Определяем массив для процедуры ОбъединитьФайлы
МассивФайловДляОбъединения = Новый Массив;

МассивФайловДляОбъединения.Добавить(ПолучитьИмяВременногоФайла("txt"));
ФайлОтправкиНачало = Новый ЗаписьТекста(МассивФайловДляОбъединения[0], КодировкаТекста.UTF8);
НачальныеДанные = "--%Разделитель%
|Content-Disposition: form-data; name=""chat_id""
|
|%ЧатID%
|--%Разделитель%
|Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
|";
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%Разделитель%",Boundary);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ЧатID%",ЧатID);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ИмяФайла%",Файл.Имя);

ФайлОтправкиНачало.ЗаписатьСтроку(НачальныеДанные );
ФайлОтправкиНачало.Закрыть();

МассивФайловДляОбъединения.Добавить(ПутьКФайлу);

МассивФайловДляОбъединения.Добавить(ПолучитьИмяВременногоФайла("txt"));
ФайлаОтправкиКонец = Новый ЗаписьТекста(МассивФайловДляОбъединения[2], КодировкаТекста.UTF8);
КонечныеДанные = "
|--%Разделитель%--";
КонечныеДанные = СтрЗаменить(КонечныеДанные,"%Разделитель%",Boundary);

ФайлаОтправкиКонец.ЗаписатьСтроку(КонечныеДанные);
ФайлаОтправкиКонец.Закрыть();

ИмяИтоговогоФайла = ПолучитьИмяВременногоФайла("txt");
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяИтоговогоФайла);

Прокси = Новый ИнтернетПрокси;
Прокси.Установить("https", ПроксиАдрес, ПроксиПорт);
Прокси.Установить("http", ПроксиАдрес, ПроксиПорт);

СоединениеHTTP = Новый HTTPСоединение(АдресTelegramAPI,443,,,Прокси,,Новый ЗащищенноеСоединениеOpenSSL());

АдресЗапроса = "bot" 
                + МойToken 
                + "/sendDocument";
				
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.Заголовки.Вставить("Connection", "keep-alive");
ЗапросHTTP.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);

ЗапросHTTP.УстановитьИмяФайлаТела(ИмяИтоговогоФайла);

Попытка
	ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;
Показать

Какой вебхук? Пост запрос же!
14. fugu 23 15.04.24 17:21 Сейчас в теме +1 $m
Всё получилось.

Резюмирую.
1. Через вебхук нельзя передать файл с компьютера, т.е. ответом на запрос бота (можно только когда он доступен в интернете или уже был загружен в телеграм).
2. Чтобы загрузить файл при получении запроса по вебхуку, нужно его выгрузить методом, который указал - (4.) Xershi
Метод всё же рабочий, но нужно уделить внимание, что chat_id выгружается, как число. Поэтому его нужно привести в вид -
СтрЗаменить(Строка(ДанныеЗапроса.chat.id), Символы.НПП,"");
3. После того, как будет загружен файл обязательно нужно ответить на вебхук запрос, чтобы он не завис.

2 и 3 пункты можно поменять местами, это как на любителя.

Всем большое спасибо за помощь.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1505 12.04.24 20:53 Сейчас в теме
(1)
sendDocument

Сразу нашел статью Telegram bot API - разбор документации с примерами
Копировать код, который работал у автора думаю не стоит сюда?
Остались вопросы как его под вас переписать?
3. fugu 23 12.04.24 21:32 Сейчас в теме
(2) Супер, но там нет отправки по вебхуку, отправка по гейтапдейт. я читал эту статью.
В гейтапдейт, я инициирую отправку файла, а в вебхуке, я просто отвечаю на запрос телеграм бота.
4. Xershi 1505 12.04.24 22:21 Сейчас в теме +1 $m
(3)
МойToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11";
АдресTelegramAPI = "api.telegram.org";
ПроксиАдрес = "159.138.22.170";
ПроксиПорт = 3128;
ЧатID = "882646417";

ПутьКФайлу = "C:\1.pdf";
Boundary = "----"+Строка(Новый УникальныйИдентификатор());

Файл = Новый Файл(ПутьКФайлу);

//Определяем массив для процедуры ОбъединитьФайлы
МассивФайловДляОбъединения = Новый Массив;

МассивФайловДляОбъединения.Добавить(ПолучитьИмяВременногоФайла("txt"));
ФайлОтправкиНачало = Новый ЗаписьТекста(МассивФайловДляОбъединения[0], КодировкаТекста.UTF8);
НачальныеДанные = "--%Разделитель%
|Content-Disposition: form-data; name=""chat_id""
|
|%ЧатID%
|--%Разделитель%
|Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
|";
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%Разделитель%",Boundary);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ЧатID%",ЧатID);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ИмяФайла%",Файл.Имя);

ФайлОтправкиНачало.ЗаписатьСтроку(НачальныеДанные );
ФайлОтправкиНачало.Закрыть();

МассивФайловДляОбъединения.Добавить(ПутьКФайлу);

МассивФайловДляОбъединения.Добавить(ПолучитьИмяВременногоФайла("txt"));
ФайлаОтправкиКонец = Новый ЗаписьТекста(МассивФайловДляОбъединения[2], КодировкаТекста.UTF8);
КонечныеДанные = "
|--%Разделитель%--";
КонечныеДанные = СтрЗаменить(КонечныеДанные,"%Разделитель%",Boundary);

ФайлаОтправкиКонец.ЗаписатьСтроку(КонечныеДанные);
ФайлаОтправкиКонец.Закрыть();

ИмяИтоговогоФайла = ПолучитьИмяВременногоФайла("txt");
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяИтоговогоФайла);

Прокси = Новый ИнтернетПрокси;
Прокси.Установить("https", ПроксиАдрес, ПроксиПорт);
Прокси.Установить("http", ПроксиАдрес, ПроксиПорт);

СоединениеHTTP = Новый HTTPСоединение(АдресTelegramAPI,443,,,Прокси,,Новый ЗащищенноеСоединениеOpenSSL());

АдресЗапроса = "bot" 
                + МойToken 
                + "/sendDocument";
				
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.Заголовки.Вставить("Connection", "keep-alive");
ЗапросHTTP.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);

ЗапросHTTP.УстановитьИмяФайлаТела(ИмяИтоговогоФайла);

Попытка
	ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;
Показать

Какой вебхук? Пост запрос же!
5. fugu 23 13.04.24 09:56 Сейчас в теме
(4) Что такое webhook - это когда стучится телеграм бот в 1С... он всегда стучится методом ПОСТ!!!
Что такое getUpdates - это когда я стучусь из 1С в телеграм бот и тоже методом ПОСТ!!!

Все передачи между телеграм-ботом и 1С через POST работают.

Да, Вы правы, если я принудительно отправлю телеграм-боту Файл, то всё как Вы описали.
Но я хочу просто ответить на его запрос файлом.
Такое возможно???
6. Xershi 1505 13.04.24 10:51 Сейчас в теме
(5) на пост запрос в 1с ответить (именно результатом ответа) пост запросом? Мне кажется так запросы не работают.
Обычно ответ только строчка что все приняли 200.
Кто мешает во время выполнения чтения одного запроса сделать второй и отправить?
7. fugu 23 13.04.24 11:58 Сейчас в теме
(6) пост -ответ так и работает для телеграм-бота.
Запустить отправку файла до ответа телеграм-боту возможно.

Но думал, что это не "красиво" делать публикацию до ответа, хотя возможно единственный возможный вариант...
8. Xershi 1505 13.04.24 12:04 Сейчас в теме
(7) тут больше у веб разработчиков спросить нужно, но пост запрос не предполагает ответ в теле запроса, ответ отправить можно конечно же, но никто его не будет обрабатывать, т.к. для этого гет запросы!
10. user1880116 14.04.24 11:25 Сейчас в теме
(8)
пост запрос не предполагает ответ в теле запроса, ответ отправить можно конечно же, но никто его не будет обрабатывать,
Какая милота.

Ты сейчас очень мужественным и волевым голосом оповестил всех о том, что 99% REST сервисов интернета не работают, потому что их ответы "никто не будет обрабатывать"
9. fugu 23 14.04.24 10:59 Сейчас в теме
(8) Ответ в телеграм-боте точно в теле.
Я собираю структуру, форматирую ее в json и отправляю.
Это точно не get
11. fugu 23 14.04.24 16:00 Сейчас в теме
(4) Данный код тоже не работает выдается ошибка 400

я уже прочитал, что сразу ответом на запрос телеграм-бота отправить файл нельзя, нужно его как-то положить на сервера телеграм-бота.

Но как??
Подскажите, кто-нибудь рабочий код для отправки файла в телеграм-бот с компьютера.
12. fugu 23 15.04.24 11:10 Сейчас в теме
неужели никто не отправляет документы в телеграм-бот?
13. DENSKR 16 15.04.24 16:19 Сейчас в теме
(12) Увидел тут статью расписано как раз по методам на сайте этого проекта
14. fugu 23 15.04.24 17:21 Сейчас в теме +1 $m
Всё получилось.

Резюмирую.
1. Через вебхук нельзя передать файл с компьютера, т.е. ответом на запрос бота (можно только когда он доступен в интернете или уже был загружен в телеграм).
2. Чтобы загрузить файл при получении запроса по вебхуку, нужно его выгрузить методом, который указал - (4.) Xershi
Метод всё же рабочий, но нужно уделить внимание, что chat_id выгружается, как число. Поэтому его нужно привести в вид -
СтрЗаменить(Строка(ДанныеЗапроса.chat.id), Символы.НПП,"");
3. После того, как будет загружен файл обязательно нужно ответить на вебхук запрос, чтобы он не завис.

2 и 3 пункты можно поменять местами, это как на любителя.

Всем большое спасибо за помощь.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот