Имя: Пароль:
1C
1С v8
Отправка файла в телегу
0 Chameleon1980
 
26.02.23
14:50
Приветствую всем.
Простите меня все.

Ребят поделитесь кодом отправки файла в телегу.

кучу примеров перепробовал: код ответа 400 и все.
день уже бьюсь. АПИ, вроде читал. Примеров кучу перебрал. Может что-то менялось накануне
и примеры из инета уже не актуальные.
1 Chameleon1980
 
26.02.23
15:49
все жгут чучело? :) :) :)
2 Chameleon1980
 
26.02.23
17:06
похоже нужно:
добавить бота в админы канала телеграмм

но нифига не понял как это сделать.
нет таких кнопок ни в десктопной телеге ни на мобилке.

https://softolet.ru/telegramm/boty/dlya-chego-delat-bota-administratorom-i-kak-eto-delaetsya.html
3 mdao
 
26.02.23
19:49
Пишешь тг бота, в бот кидаешь URL,
бот отправляет тебе файл, учти что файл может быть только gif, zip, pdf
Далее из бота пересылать можно, бот может быть назначен админом и копировать файл в группы
4 Chameleon1980
 
27.02.23
08:16
(3) xls тоже запросто отправляет
5 fbear
 
27.02.23
09:45
СтрокаСоединения = "/bot" + "<ID>" + "/sendphoto";
    
    Boundary = "----"+Строка(Новый УникальныйИдентификатор());
    
    //Определяем массив для процедуры ОбъединитьФайлы
    МассивФайловДляОбъединения = Новый Массив;
    
    //Формируем начальный фрагмент файла POST-запроса
    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8);
    
    //Формируем конечный фрагмент файла POST-запроса
    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
    ФайлаОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8);
    
    ТекстДляОтправки = "";
    
    ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary + Символы.ПС;
    ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""chat_id""" + Символы.ПС + Символы.ПС;
    ТекстДляОтправки = ТекстДляОтправки + "172070948" + Символы.ПС;
    
    ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary + Символы.ПС;
    ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""photo""; filename=""пример.gif""" + Символы.ПС;
    
    ФайлОтправкиНачало.ЗаписатьСтроку(ТекстДляОтправки);
    ФайлОтправкиНачало.Закрыть();
    
    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
    
    МассивФайловДляОбъединения.Добавить(СокрЛП("<ИМЯФАЙЛА>"));
    
    ТекстДляОтправки = "" + Символы.ПС;
    ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary+"--";
    ФайлаОтправкиКонец.ЗаписатьСтроку(ТекстДляОтправки);
    ФайлаОтправкиКонец.Закрыть();
    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
    
    ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
    
    HTTPЗапрос = Новый HTTPЗапрос;
    Заголовки = Новый Соответствие;
    
    HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
    
    HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
    HTTPЗапрос.АдресРесурса = СтрокаСоединения;
    
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows, Новый СертификатыУдостоверяющихЦентровWindows);
    HTTPСоединение = Новый HTTPСоединение("api.telegram.org",,,,,, ЗащищенноеСоединение);
    
    Попытка
        ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        
        Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
6 fbear
 
27.02.23
09:47
Пропустил в строке
ТекстДляОтправки = ТекстДляОтправки + "172070948" + Символы.ПС;
Заменить на свой id
ТекстДляОтправки = ТекстДляОтправки + "<IDTG>" + Символы.ПС;
7 fbear
 
27.02.23
09:54
И еще - это для картинки, а для других типов файлов надо будет использовать другие методы, а не sendPhoto, но думаю будет подобно
8 Chameleon1980
 
27.02.23
10:38
тут что угодно отправляется через ДД

Процедура ОтправитьФайл(Токен, ИдентификаторПолучателя, ДвоичныеДанные, ИмяФайла = "", Сообщение = "") Экспорт

    // Сформировать тело запроса
    Разделитель     = Строка(Новый УникальныйИдентификатор());
    
    // Формируем основное составное сообщение
    Тело            = Новый ПотокВПамяти();
    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Истина);
    
    // chat_id
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку(ИдентификаторПолучателя);
    
    // disable_notification
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""disable_notification""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("True");
    
    Если Не ПустаяСтрока(Сообщение) Тогда
        // caption
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку(Сообщение);        
        
        // parse_mode
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""parse_mode""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку("HTML");
    КонецЕсли;
    
    // document    
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    //ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1.pdf""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()) + ".pdf", ИмяФайла)));
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()) + ".pdf", ИмяФайла)));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
    ЗаписьДанных.ЗаписатьСтроку("");  
    //ЗаписьДанных.Закрыть();    
    
    // Добавим файл
    //ЗаписьДанных    = Новый ЗаписьДанных(...);
    ЗаписьДанных.Записать(ДвоичныеДанные);
    //ЗаписьДанных.Закрыть();
    
    // Завершение записи
    //ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Ложь);
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
    ЗаписьДанных.Закрыть();
    
    ДанныеТела          = Тело.ЗакрытьИПолучитьДвоичныеДанные();  
    
    // Сформировать соединение и запрос
    Соединение  = ПолучитьСоединение();
    Заголовки   = Новый Соответствие;
    Заголовки.Вставить("Content-Type",      "multipart/form-data; boundary=" + Разделитель);
    Заголовки.Вставить("Accept",            "*/*");
    Заголовки.Вставить("Cache-Control",     "no-cache");
    Заголовки.Вставить("Host",              "api.telegram.org");
    Заголовки.Вставить("Accept-Encoding",   "gzip, deflate");
    Заголовки.Вставить("Content-Length",    Формат(ДанныеТела.Размер(), "ЧДЦ=0; ЧН=0; ЧГ=0"));
    Заголовки.Вставить("Connection",        "close");
    Адрес       = СтрШаблон("/bot%1/sendDocument", Токен);
    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);
    Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
    
    // POST
    Ответ       = Соединение.ОтправитьДляОбработки(Запрос);
    
    // Разбор ответа
    Если Ответ.КодСостояния <> 200 Тогда
        ОтветСтрокой    = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.
        |Код состояния: %1
        |Тело: %2"
        , Ответ.КодСостояния
        , ОтветСтрокой
        );
    КонецЕсли;
    
КонецПроцедуры // ОтправитьФайлВТелеграм()
9 Chameleon1980
 
27.02.23
10:43
вопрос сейчас в другом.
почему не отправляется на другой ИдентификаторПолучателя

как правильно в телеге привязывать ИдентификаторПолучателя к боту
свой я как-то привязал, но не до конца понял как.
мне отправляется, товарищу - нет.
10 Chameleon1980
 
27.02.23
10:44
+ (8)

Функция ПолучитьСоединение()  
    //Прокси      = Новый ИнтернетПрокси(Истина);
    //Если ИспользоватьПрокси И ТипЗнч(ПроксиПротокол) = Тип("Строка") И Не ПустаяСтрока(ПроксиПротокол) Тогда
    //    Прокси.Установить(ПроксиПротокол, ПроксиСервер, ПроксиПорт, ПроксиПользователь, ПроксиПароль, Ложь);
    //КонецЕсли;
    SSL         = Новый ЗащищенноеСоединениеOpenSSL();
    //Соединение  = Новый HTTPСоединение("api.telegram.org", 443,,, Прокси, 30, SSL, Ложь);
    Соединение  = Новый HTTPСоединение("api.telegram.org", 443,,,, 30, SSL, Ложь);
    Возврат Соединение;
КонецФункции
11 arsik
 
гуру
27.02.23
10:54
(9) Пользователь должен быть подключен к боту.
12 arsik
 
гуру
27.02.23
10:55
+(11) Пользователь должен подписаться на бота
13 fbear
 
27.02.23
10:55
А он себе бота добавил, start сделал?
Я при старте у себя сохранял этот chai_id и потом отправлял по этим чатам
14 OldCondom
 
27.02.23
11:15
Ммм...
СтрШаблон("/bot%1/sendDocument?chat_id=%2&document=%3", Токен, IDЧата, URLПутьКФайлу);
15 Chameleon1980
 
27.02.23
11:26
(13) счас попробуем
16 OldCondom
 
27.02.23
11:35
А чего пробовать?
Ты же апи читал)
https://core.telegram.org/bots/api#senddocument
17 Chameleon1980
 
27.02.23
11:42
(16) я же указал, что сейчас попробуем:
... А он себе бота добавил, start сделал? ...

при чем тут уже АПИ?

я уже написал процедуры нужные для отправки. И они работают.
18 OldCondom
 
27.02.23
12:20
(17) Это ты про (8)? А более извращенны и нечитаемый способ слабо придумать?)
И это все точно работает? Бот спокойно принимает эту дичь?
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");

Мсье конечно знает толк и делает очень странный POST вместе компатных и понятных GET, но я всегда думал, что для POST достаточно все теже параметры воткнуть в тело запроса и все.
19 arsik
 
гуру
01.03.23
13:24
А нельзя сообщения рассылать без бота?
Ну есть допустим у меня база клиентов, слать им сообщения о статусах заказов в телеграм?
20 mTema32
 
01.03.23
15:38
(19) А кто, простите, будет эти сообщения отсылать-то?
Бот как раз и служит транспортом сообщений.
21 arsik
 
гуру
01.03.23
18:07
(20) ну есть же апи телеграма. На любой телефон учетку зарегистрировать и от имени этой учетки рассылать. Там вроде разницы нет большой бот или юзербот.
AdBlock убивает бесплатный контент. 1Сергей