Telegram bot API - разбор документации с примерами

24.07.20

Интеграция - Мессенджеры и боты

Перевод документации на язык 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Документация Telegram Bot API ver.4.7
.pdf 616,12Kb
93
93 Скачать (1 SM) Купить за 1 850 руб.
Telegram bot API Библиотека методов
.epf 7,28Kb
172
172 Скачать (1 SM) Купить за 1 850 руб.

Хоть и с большим запозданием, публикую шпаргалку по telegram bot api, может, будет полезна.

Прикладываю официальную документацию, и готовый набор методов для работы с telegram. Обработку тестировал на 8.3.15.1747.

Ссылки:

Официальная документация

Документация с частичным переводом (документация не полная, но рабочая)

В тексте я буду давать ссылки на вторую документацию т.к. для ее просмотра не нужны премудрости для обхода блокировок.

 

 
 Создание бота

 

Соединение

В документации написано:

Все запросы к Telegram Bot API должны осуществляться через HTTPS в следующем виде: https://api.telegram.org/bot<token>/НАЗВАНИЕ_МЕТОДА

Подчеркнуто, что соединение именно HTTPS, а значит не забываем указывать порт 443 и создать объект ЗащищенноеСоединениеOpenSSL

Код создания соединения :


АдресTelegramAPI = "api.telegram.org";
ПроксиАдрес = "159.138.22.170";
ПрокcиПорт = 3128;

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

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

 

Прокси

Прокси нужен для обхода блокировок РосКомНадзора, если у вас провайдер не блокирует сайт telegram.org, то прокси можно не создавать.

Есть огромное количество сайтов предоставляющий список таких бесплатных прокси, я использую https://free.proxy-sale.com/https/ т.к. там есть возможность скачать списков нужном мне формате для автоматической загрузки.

Я реализовал у себя регистр сведений, где храню флаг доступности, ip и порт прокси. Флаг доступности актуализируется регламентным заданием

Проверка соединения

Для проверки соединения или проверки работает прокси или нет реализован специальный GET-метод getMe

Я специально буду повторять блоки кода, дабы Вы копировали сразу рабочий вариант, конечно это все нужно обернуть в функции и процедуры


МойToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11";
АдресTelegramAPI = "api.telegram.org";
ПроксиАдрес = "159.138.22.170";
ПроксиПорт = 3128;
ТаймаутСоединения = 2;//Ставим таймаут в пару секунд, чтобы долго не ждать исключения при неудачной проверке соединения

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

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

АдресЗапроса = "bot" + МойToken.token + "/getMe";
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
Попытка
    ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
    ПроксиДоступен = Истина;
Исключение
    ПроксиДоступен = Ложь;
КонецПопытки;

Сообщить("Прокси доступен - " + ПроксиДоступен);

 

Метод getMe вернет в теле ответа JSON структуру

{
    "ok": true,
    "result": {
        "id": 12345678912,
        "is_bot": true,
        "first_name": "Представление имени моего бота",
        "username": "unikalnoe_imya_bot",
        "can_join_groups": true,
        "can_read_all_group_messages": false,
        "supports_inline_queries": true
    }
}

"ok":true - Означает, что авторизация прошла успешно и Ваш токен валидный.

 

Получение сообщений

Для получения сообщений существуют 2 совершенно разных способа

  1. Через HTTP-запросы к методу getUpdates
  2. Через Webhook

 

Запрос к методу getUpdates инициирует 1С, и есть 2 варианта использования

 

Short polling - это классическая схема, когда отправляя запрос мы сразу получаем результат его выполнения.

В случае с getUpdates мы сразу получаем ответ, где в поле result будет массив объектов с типом Update

 
Примитивный запрос на получение всех сообщений

Данный запрос каждый раз будет возвращать повторяющиеся данные и отслеживание новых сообщений ложится на 1С

т.е. вы заводите РС с обработанными update_id и каждый раз анализируете - обработан полученный id или нет. Можно завести константу с последним обработанным update_id и сравнивать ее на < или > с полученным

МойToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11";
АдресTelegramAPI = "api.telegram.org";
ПроксиАдрес = "159.138.22.170";
ПроксиПорт = 3128;

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

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

АдресЗапроса = "bot" + МойToken + "/getUpdates";
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
Попытка
   ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
   Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
Исключение
   ВызватьИсключение "Ошибка получения запроса";
КонецПопытки;

 

Пример ответа:

{
	"ok": true,
	"result": [
		{
			"update_id": 910197276,
			"message": {
				"message_id": 55,
				"from": {
					"id": 882646417,
					"is_bot": false,
					"first_name": "Александр",
					"last_name": "Леонов",
					"username": "Rentgengl",
					"language_code": "ru"
				},
				"chat": {
					"id": 882646417,
					"first_name": "Александр",
					"last_name": "Леонов",
					"username": "Rentgengl",
					"type": "private"
				},
				"date": 1585628272,
				"text": "Привет"
			}
		}
	]
}

 

 
 Запрос на получение новых сообщений после последнего запроса

 

Long polling - это схема, когда сервер возвращает ответ на запрос не сразу, а в момент появления данных. Проще говоря ваше HTTP соединение висит пока не появятся новые сообщения или не закончится таймаут.

Для работы в такой схеме необходимо договориться с сервером - какой таймаут считать допустимым, для этого у метода getUpdates есть параметр timeout, для удобства еще будем отправлять номер начального сообщения (offset)

 
 Запрос на ожидание получения новых сообщений

 

Получение сообщений через Webhook

Данные способ подразумевает наличие опубликованного наружу HTTP-сервиса, куда и будут приходить запросы от telegram с новыми сообщениями

Следует отметить 2 важные детали - сервис должен быть HTTPS и обрабатывать POST-запросы

Для переключения режима обмена на вебхуки существует метод setWebhook

Основной плюс данного метода - отсутствие необходимости в рег.заданиях, которые с определенным интервалом опрашивают или ждут ответа от сервера telegram. Новые сообщения приходят в режиме реального времени, причем если ваш сервис будет недоступен, то запрос будет повторен (сколько раз и с каким интервалом не понятно)

 

Обработка входящих сообщений

Сообщения, полученные от сервера telegram это массив объектов с типом Update. У данного типа есть обязательное поле update_id и ряд опциональных, зависящих от типа входящего сообщения. Основное доп.поле - message с типом Message заполнено у входящих текстовых сообщениях, входящих файлах, фотографиях, аудио сообщениях, входящем сообщении с контактом, георасположением, видео и стикеры.

Второе доп.поле - callback_query с типом CallbackQuery - это результат нажатия на кнопку клавиатуры InlineKeyboardMarkup

Примеры сообщений с типом Message

 
 Сообщение
 
 Фото
 
 Документ
 
 Аудио сообщение
 
 Геоданные
 
 Опрос
 
 Контакт
 
 Музыка
 
 Нажатие на кнопку ReplyKeyboard

Пример сообщения с типом CallbackQuery

 
 Нажатие на кнопку InlineKeyboard

 

Загрузка полученных файлов

Т.к. в сообщении приходит только идентификатор файла, то необходимо его как то получить.

Для этого существует GET-метод getFile, у которого есть один обязательный параметр file_id

Метод возвращает объект типа File, это еще не файл, но он уже доступен по ссылке, которую необходимо собрать из полученных данных.

Ссылка имеет вид https://api.telegram.org/file/bot<token>/<file_path>, где file_path - это свойство объекта File

 
 Пример загрузки файла

 

Отправка сообщения

Для отправки сообщения используется GET-метод sendMessage, обязательных параметров всего два chat_id и text

chat_id можно взять из полученных сообщений

 
 Отправка простого сообщения

 

У метода sendMessage есть еще ряд необязательных параметров, один из них это parse_mode, который включает нужный синтаксис оформления текста сообщения. Таких режимов два - HTML и Markdown

Проще говоря, этот параметр говорит по каким правилам должно оформляться сообщение

Я приведу пример отправки сообщения в синтаксисе HTML

 
 Отправка оформленного сообщения

В чат при этом запросе прилетит вот такое сообщение

Показ привью отправленной ссылки можно отключить с помощью параметра disable_web_page_preview

Для этого нужно к запросу добавить строку &disable_web_page_preview=true

Также у метода есть параметр reply_to_message_id, который принимает идентификатор сообщения, на которое делается ответ.

 

Кнопки (клавиатуры)

У метода sendMessage есть еще один очень интересный параметр - reply_markup, который отвечает за быстрые ответы.

Типов таких быстрых ответов на данный момент 4: InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardHide и ForceReply.

 

InlineKeyboardMarkup

Это клавиатура, которая привязана к сообщению. У этого объекта всего одно поле inline_keyboard, которое содержит массив строк с массивами кнопок (2 мерный массив кнопок или массив массивов с кнопками)

Кнопка - это объект InlineKeyboardButton, у которого только одно обязательное поле - text

Есть еще ряд полей, основное из которых - callback_data. Это данные, которые будут отправлены после нажатия кнопки пользователем. Сюда можно записывать идентификаторы из 1С (документа или справочника), числа и т.д. для последующей обработки.

Второй полезный параметр - url, в котором указывается ссылка, которая будет открыта при нажатии на кнопку

 
 Пример отправки InlineKeyboardMarkup

 

ReplyKeyboardMarkup

Набор кнопок, которые не привязаны к конкретному сообщению а закреплены внизу окна диалога.

Объект имеет одно обязательное поле keyboard, которое содержит массив массивов кнопок с более простым типом нежели InlineKeyboard - KeyboardButton с основным полем text, данный объект можно не использовать и сразу формировать массив строк.

Еще один важный параметр клавиатуры, но не обязательным, является resize_keyboard, который отвечает за "авто высоту" кнопок.

По умолчанию данный параметр установлен в false и клавиатура растягивается на высоту основной клавиатуры, что выглядит громоздко (см. скрин в примере).

Еще один опциональный параметр - one_time_keyboard, который при установке в true скрывает клавиатуру после нажатия кнопки.

 
 Пример отправки ReplyKeyboardMarkup

 

ReplyKeyboardHide - Своего рода команда управления видимостью для клавиатуры ReplyKeyboardMarkup 

ForceReply - команда инициирующая цитату на отправляемое сообщение

 

Отправка контактов

GET-метод sendContact позволяет отправить контакт пользователю спец.сообщением.

Метод похож на sendMessage за исключением нескольких обязательных полей:

phone_number - строковое представление телефонного номера

first_name - Имя контакта

 
 Пример отправки контакта

 

Отправка документов (файлов)

За отправку файлов отвечает POST-метод sendDocument, у которого 2 обязательных поля - chat_id и document.

Поле document может иметь тип строки, это нужно тогда, когда мы переотправляем уже полученный файл и в этом случае указываем идентификатор файла.

Второй тип, который может содержать поле document - это сам отправляемый файл в формате multipart/form-data

Сам формат multipart/form-data достаточно простой, его цель - оправить серверу ряд разнородных данных (файлы, строки и т.д.) в одном сообщении (файле). Это своего рода zip-архив без сжатия, где не только файлы, но и другие данные.

Сервер, получив сообщение, должен понять где заканчиваются/начинаются блоки с данными и что там за данные. Для этого ему необходим разделитель данных - boundary и некая запись о характере данных блока.

Вернемся к нашему методу sendDocument, которому необходимо передать 2 параметра - строковый chat_id и файл document

Шаблон тела запроса будет выглядеть следующим образом:

--%Разделитель%
Content-Disposition: form-data; name="chat_id"

%ЧатID%
--%Разделитель%
Content-Disposition: form-data; name="document"; filename="%ИмяФайла%"

%СодержимоеФайла%
--%Разделитель%--

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

Для решения этой проблемы у 1С есть метод ОбъединитьФайлы, который объединяет переданный в него массив файлов в один.

Разделим шаблон на части - певая это текст до %СодержимоеФайла%, а вторая это текст после %СодержимоеФайла%. Запишем эти 2 текста в файлы и используем ОбъединитьФайлы подсунув между текстовиками отправляемый файл.

 
Пример отправки файла

 

telegram

См. также

Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Интеграция мессенджера WhatsApp и 1С: УНФ, УТ, КА, ERP - отправка и получение сообщений, картинок, файлов и видео прямо в 1С. Расширение работает с сервисом GreenApi.

15600 руб.

23.06.2023    9482    58    12    

34

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 руб.

27.12.2021    38198    108    161    

201

SALE! 25%

Мессенджеры и боты Системный администратор Программист Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 Платные (руб)

Развитие популярного решения для интеграции мессенджера Telegram с нашей любимой 1С - конструктор чат-ботов в Телеграм.

15000 11250 руб.

18.06.2021    65561    312    272    

369

Документооборот и делопроизводство (СЭД) Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Платные (руб)

Расширение для согласования справочников и документов в основных типовых конфигурациях. Ролевая адресация, условная маршрутизация, чат-бот telegram, интеграция с n8n, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для 1cfresh.com. Сертификат 1С-Совместимо.

14900 руб.

15.11.2018    30270    35    49    

71

Мессенджеры и боты Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Данное расширение представляет собой интерфейс взаимодействия 1С с сервисом Wazzup. Данный сервис позволяет вести беседу с использованием номера телефона, привязанного к Whatsapp. Почитать о сервисе и его условиях использования можно по ссылке https://wazzup24.com/. На данный момент расширение поддерживает почти все доступные через API функции. Обновление от 19.05.2023, версия 2.1!

14400 руб.

30.11.2020    13594    8    13    

15

Мессенджеры и боты SMS рассылки Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Решение реализовано в виде расширения. Заменяет отправку смс на отправку в WhatsApp через Green-api. Отправка чека картинкой.

7800 руб.

15.05.2024    1544    3    6    

6
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. serg-lom89 76 06.04.20 10:39 Сейчас в теме
тема хоть и "заезженная" но тем не менее почитал с удовольствием,вспомнил как сам разбирался с API_)
Totoro; TreeDogNight; +2 Ответить
2. feva 525 06.04.20 13:52 Сейчас в теме
Хорошее развитие темы ботов телеги и 1с) Грамотно написано! Однозначно луцк!
3. CyberCerber 872 06.04.20 14:13 Сейчас в теме
(2) Кажется, это уже правило Инфостарта. В комментах к любой статье появится автор другой статьи на эту тему, и порекламирует себя.
CepeLLlka; Maden; alfakorea; savauu; Lacoste4life; simuljakr; izidakg; leongl; +8 1 Ответить
4. feva 525 06.04.20 14:22 Сейчас в теме
(3) ну тема на самом дела не одинаковая. Тут глубже развернуты команды бота телеги, с примерами. А расширение информационного поля полезно всем - как автору, так и читателю и журналу
Lacoste4life; cleaner_it; Evg-Lylyk; +3 Ответить
5. Nikola23 705 06.04.20 15:04 Сейчас в теме
(3) рынок диктует свои правила. Вам не нравится что-то конкретное в его поведении?
6. CyberCerber 872 06.04.20 15:21 Сейчас в теме
(5) Вообще такая откровенная самореклама не очень нравится. Комменты к этой статье посвящены именно этой публикации, а не всем на эту тему. Найти интересные мне статьи я и сам смогу.
Конкретно в этой фразе не понравилось "Хорошее развитие темы...". Какое развитие? Как будто автор взял именно его статью как эталон и что-то дополнил... Здесь подробный разбор функционала API, там - просто краткий пример базовой возможности.
MCV; MrFlanker; alfakorea; simuljakr; BiLBelarus; softgarant; +6 Ответить
7. Nikola23 705 07.04.20 09:21 Сейчас в теме
(6) "Комменты к этой статье посвящены именно этой публикации". Ну это правило вы сами придумали.

ИМХО, вы придираетесь. В каждом форуме с момента появления такого понятия, есть темы и есть админы.
Да, принято писать "по теме", но не запрещено (по умолчанию). На инфостарте - не запрещено.
Админы принимают решение что и где писать, а не пользователи.

Выбор за вами - адаптироваться или нет.
Кстати и вы и я сейчас пишем совсем не по теме, но никто же не возмущается :)
user785225; Fox-trot; +2 1 Ответить
8. izidakg 172 07.04.20 16:23 Сейчас в теме
(3) когда статья не то что хуже, но существенно менее информативна, это наверное и не плохо
но в данном случае эта статья более полная, а значит лучше
9. Anton64 192 08.04.20 09:53 Сейчас в теме
Вы только в тексте статьи описания клавиатур делаете обычным текстом? или в обработке так же?
Непонятно как вы динамически собираетесь при таком подходе формировать клавиатуры.
10. leongl 544 08.04.20 10:44 Сейчас в теме
(9)В тексте не стал делать динамически для прозрачности.
В обработке 2 экспортных метода
ПрикрепитьКнопки(Получатель, ТекстСообщения, МассивМассивовКнопок, ЭтоФорматированноеСообщение = Ложь)
ОтправитьСообщениеСКнопками(Получатель, ТекстСообщения, МассивМассивовInlineКнопок, ЭтоФорматированноеСообщение = Ложь)
и обертка для получения описания inlineКнопки
ПолучитьКнопкуInline(Заголовок, ДанныеДляВозврата = Неопределено, СсылкаURL = Неопределено)

Использование простое - для прикрепления кнопки делаете 2мерный массив строк и скармливаете ПрикрепитьКнопки
Для inlineКлавиатуры делаете 2мерный массив из результатов функции ПолучитьКнопкуInline(
cleaner_it; CyberCerber; +2 Ответить
11. Anton64 192 08.04.20 11:50 Сейчас в теме
(10) Тогда понятно)) а то в публикации как-то слишком странно выглядело
73. cleaner_it 209 27.02.22 18:20 Сейчас в теме
(10)
ми(Получатель, ТекстСообщения, МассивМассивовInlineКнопок, ЭтоФорматированноеСообщение = Ложь)
и обертка для получения описания inlineКнопки
ПолучитьКнопкуInline(Заголовок, ДанныеДляВозврата = Неопределено, СсылкаURL = Неопределено)

Использование простое - для прикрепления кнопки делаете 2мерный массив строк и скармливаете ПрикрепитьКнопки
Для inlineКлавиатуры делаете 2мерный массив из резу


Спасибо) Как раз ищу, как сделать кнопки, и задался этим же вопросом)
12. nestokay 62 10.04.20 08:26 Сейчас в теме
Воооот, отличная статья, спасибо!!!
13. hardcodder2020 13.04.20 11:38 Сейчас в теме
Статья крутейшая! Автору респектую!
14. Pixar0000 13.04.20 18:46 Сейчас в теме
А отправка смайликов - не раскрыта вообще, если добавить, то настольное руководство на связке 1С + Тележка
Автору респект!
72. METAL 299 27.01.22 23:17 Сейчас в теме
(14) Вот да, тоже интересно! Помню раньше были с этим проблемы, а сейчас как? Доступны ли для отправки из 1С большинство смайликов(эмодзи), что есть на айфоне?
15. AlexK_2012 14.04.20 17:29 Сейчас в теме
а обработка запускабельна?
16. leongl 544 14.04.20 18:11 Сейчас в теме
17. leongl 544 14.04.20 18:13 Сейчас в теме
(15)Запускабельны примеры из статьи
18. AlexK_2012 15.04.20 12:38 Сейчас в теме
(17) Добрый день! Большая просьба добавить пример разбора полученных сообщений, вижу только примеры получаемых данных
19. leongl 544 15.04.20 16:55 Сейчас в теме
(18)Это немного выходит за рамки статьи, но я могу посоветовать:
1. Получив ОтветHTTP проверить его свойство КодСостояния, при удачном выполнении он должен быть равен 200
2. Получить тело ответа через метод ПолучитьТелоКакСтроку и преобразовать его из JSON в объект 1С через Новый ЧтениеJSON
3. Проверить получившийся объект 1С на наличие поля "ok" и его значение = Истина
4. Обработать свойство result объекта
В обработке с библиотекой методов есть экспортный метод ПолучитьИОбработатьСообщения() там есть и получение сообщений и их обработка.
Merkalov; softgarant; semagin@gmail.com; igormiro; TerveRus; AlexK_2012; CyberCerber; +7 Ответить
20. mvgfirst 6 17.04.20 16:00 Сейчас в теме
Не то что бы я придирался
но вот есть кусочек
где ошибка:

ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
Попытка
   ОтветHTTP = СоединениеHTTP.Получить(HTTPЗапрос);
   Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку())
21. leongl 544 17.04.20 21:37 Сейчас в теме
22. igormiro 714 28.04.20 09:41 Сейчас в теме
Хорошая статья.
Есть вопрос бот работает, у некоторых пользователей вот перестаёт реагировать на все команды.
Что делать в таких случаях?
23. leongl 544 28.04.20 11:11 Сейчас в теме
(22) Команды от пользователя приходят в сообщениях?
24. igormiro 714 28.04.20 11:46 Сейчас в теме
25. igormiro 714 28.04.20 11:49 Сейчас в теме
Уже было такое пришлось пересоздать бот. Тогда все ок.
26. doctordre 30.04.20 21:55 Сейчас в теме
ошибочка в адресе запроса для получения файла. там не bot a /file/bot
поправьте пожалуйста
27. leongl 544 06.05.20 11:55 Сейчас в теме
28. uno-c 264 18.06.20 20:24 Сейчас в теме
для ее просмотра не нужны премудрости для обхода блокировок.

Случайно обнаружил, что теперь справка https://core.telegram.org/bots/api открывается без премудростей. Да и https://api.telegram.org/botXXX/getMe тоже отвечает - прямо в браузере без VPN и прокси. Это у всех теперь так в нашей стране?
29. dvk09 2 19.06.20 07:21 Сейчас в теме
30. vladnet 367 10.07.20 09:48 Сейчас в теме
Подскажите sendDocument посылается через multipart/form-data. Все нормально работает, но кроме основных параметров существуют еще параметры:

reply_markup
reply_to_message_id
reply_markup

Как их правильно засунуть в запрос?
31. leongl 544 10.07.20 13:11 Сейчас в теме
(30)
НачальныеДанные = "--%Разделитель%
|Content-Disposition: form-data; name=""chat_id""
|
|%ЧатID%
|--%Разделитель%
|Content-Disposition: form-data; name=""reply_markup""
|
|%ДанныеReply_markup%
|--%Разделитель%
|Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
|";
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%Разделитель%",Boundary);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ЧатID%",ЧатID);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ДанныеReply_markup%", ДанныеReply_markup);
НачальныеДанные = СтрЗаменить(НачальныеДанные,"%ИмяФайла%",Файл.Имя);
Показать
tuzmich007; +1 Ответить
32. vladnet 367 10.07.20 16:42 Сейчас в теме
(31) Спасибо! Основную суть ухватил, остался вопрос, а как должна выглядеть переменная ДанныеReply_markup? Это ведь структура, к примеру в ней может быть:
{
"inline_keyboard": [
{"text": "123", "callback_data", "333"}
]
}
tuzmich007; +1 Ответить
33. vladnet 367 10.07.20 18:23 Сейчас в теме
(32) Нашел, записывается обычным JSON )
34. ROM_1C 692 12.07.20 21:04 Сейчас в теме
А отложение сообщения можно отправить по апи или нет такой функции?
В документации что-то не нашел((
Спасибо.
35. leongl 544 13.07.20 06:53 Сейчас в теме
(34)Скорее всего это только фишка приложения.
36. ROM_1C 692 13.07.20 10:16 Сейчас в теме
(35) точно нет, экспортируется на все устройства, и уведомления прийдет даже если устройства будут выключены
37. maksa2005 550 23.07.20 13:11 Сейчас в теме
АдресЗапроса = "bot" + МойToken.token + "/getUpdates";


исправьте на

АдресЗапроса = "bot" + МойToken+ "/getUpdates";
38. leongl 544 24.07.20 07:38 Сейчас в теме
39. maksa2005 550 24.07.20 09:43 Сейчас в теме
Скажите, а можно отправить команду в телеграмм не через телефон для регистрации бота?
Для чего это? суть такова что нужно сделать 40 ботов для 40 людей и каждому их настроить. Чтобы у каждого не брать телефоны и настраивать, а прописать команду и получить от него токен.
40. leongl 544 24.07.20 13:31 Сейчас в теме
(39)На самом деле телега дает возможность реализовать свой кастомный клиент, по этому вполне реально реализовать автоматизацию по созданию ботов)
Почитайте тут https://core.telegram.org/api#telegram-api
41. rinik88 32 28.07.20 15:27 Сейчас в теме
добрый день. А отправка фото-картинки такая же как и файла? хотя наверное необходимо использовать /sendPhoto...
42. leongl 544 29.07.20 09:00 Сейчас в теме
(41)Добрый день. Можно использовать sendDocument и sendPhoto. У меня работало и то и то
Igor253; rinik88; +2 Ответить
43. rinik88 32 29.07.20 09:25 Сейчас в теме
(42) если в статью добавите пример по отправке фото не как вложения, было бы замечательно)
44. umni4ka 52 27.08.20 22:51 Сейчас в теме
Крутая статья, спасибо!
Velement; +1 Ответить
45. CAIN 16 20.10.20 23:09 Сейчас в теме
Как отправить просто фото, это даже нужнее чем просто файл вложение
46. leongl 544 21.10.20 07:46 Сейчас в теме
(45)Можно использовать вместо sendDocument - sendPhoto. У меня работало и то и то
47. oneman@yandex.ru 20.11.20 17:25 Сейчас в теме
Внимание, вопрос! Как запросом бота получить обратно сообщения, отправленные этим же ботом ?
В методе "getUpdates" возвращаются сообщения, отправленные только прочими пользователями чата.
tuzmich007; +1 Ответить
66. gubanoff 63 08.07.21 15:20 Сейчас в теме
(47)
запросом бота получить обратно сообщения, отправленные этим же ботом ?

Когда отправляете сообщение от бота, то приходит ответ. Вот этот ответ и есть сообщение, отправленное ботом. По другому я не нашел варианта.
48. maksa2005 550 25.11.20 20:44 Сейчас в теме
Скажите, а что делать если кол-во запросов превысело 100. он не обновляет. Как быть?
49. user1524956 17.01.21 08:56 Сейчас в теме
здравствуйте! у меня вопрос был такой. я создал инлайн кнопки, т.е. эти кнопки ссылаются на мои телеграм каналы. вот я сделал 3 инлайн кнопки, а потом хочу сделать кнопку 4ую, т.е. кнопка на проверку подписался ли на эти каналы или нет. помогите пжл.
50. Oleg_nsk 279 29.01.21 13:30 Сейчас в теме
Кто-нибудь смог реализовать метод sendMediaGroup? Никак не могу понять как в параметр media закинуть массив объектов, включающий двоичные данные
51. leongl 544 01.02.21 08:18 Сейчас в теме
(50) Судя по документации закидываете в media JSON сериализованный массив объектов InputMedia
Сам объект довольно прост и состоит из двух полей - это тип и файл (ссылка, айди или имя параметра multipart/form-data)
как пример значения:
[{"type": "photo", "media":"attach://document"},
{"type": "video", "media":"https://infostart.ru/МоеВидео.avi"}]
52. Oleg_nsk 279 01.02.21 10:12 Сейчас в теме
(51)
Сам объект довольно прост и состоит из двух полей - это тип и файл (ссылка, айди или имя параметра multipart/form-data)

С ссылкой и айди все понятно, но как передать здесь двоичные данные?
"media":"attach://document".... Вот здесь вместо document что? Двоичные данные?
53. leongl 544 01.02.21 10:30 Сейчас в теме
(52) document это имя параметра в блоке multipart/form-data
Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
Как закинуть туда файл - см. отправку документа.
54. Oleg_nsk 279 01.02.21 11:03 Сейчас в теме
(53)

(52) document это имя параметра в блоке multipart/form-data
Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
Как закинуть туда файл - см. отправку документа.

Как отправлять документ мне известно. Но здесь получается что тип контента у нас JSON, следовательно внутри JSON в поле media я запишу attach://document, но как мне передавать это сообщение одновременно и как "multipart/form-data" и как "JSON"?
56. leongl 544 01.02.21 11:23 Сейчас в теме
55. leongl 544 01.02.21 11:22 Сейчас в теме
JSON это не тип, в любом случае тип будет строка.
Что вам мешает закинуть строку в запрос?

НачальныеДанные = "--%Разделитель%
|Content-Disposition: form-data; name=""chat_id""
|
|%ЧатID%
|--%Разделитель%
|Content-Disposition: form-data; name=""media""
|
|%ВашJSON%
|--%Разделитель%
|Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
|";
Показать
57. Oleg_nsk 279 01.02.21 11:57 Сейчас в теме
(55)
НачальныеДанные = "--%Разделитель%
|Content-Disposition: form-data; name=""chat_id""
|
|%ЧатID%
|--%Разделитель%
|Content-Disposition: form-data; name=""media""
|
|%ВашJSON%
|--%Разделитель%
|Content-Disposition: form-data; name=""document""; filename=""%ИмяФайла%""
|";


Я говорил про тип контента, а не про тип. И для типа контента (content-type) JSON является валидным значением. Но не в этом дело.
Т.е. вы предлагаете значение content-type в запросе установить multipart/form-data, а весь текст json запроса вставить как отдельный параметр внутри multipart/form-data, а сами двоичные данные добавить внизу отдельными параметрами, имена которых будут следовать после attach:// в теле json? Так делать я еще не пробовал. Если получится отпишусь.
58. Oleg_nsk 279 02.02.21 11:50 Сейчас в теме
(55)Попробовал ваш способ. Не получается.
Записал два параметра мультипарт:
chat_id и media =
{
"chat_id": мой_ид,
"media": [
{
"type": "document",
"media": "attach://txt1"
},
{
"type": "document",
"media": "attach://txt2"
}
]
}
Показать

Потом прикрепил два файла txt1 и txt2 и в результате ошибка:

{"ok":false,"error_code":400,"description":"Bad Request: expected an Array of InputMedia"}


PS
У меня получилось. Оказывается в attach надо писать не то что в filename, а то что в name и в media надо передавать сериализованный массив, а не всю структуру. В любом случае спасибо вам большое за помощь!
146323; zFire; leongl; +3 Ответить
64. zFire 23.06.21 13:06 Сейчас в теме
(58)

Скажите, а Вы бы не могли прислать пример заголовка отправки файлов sendMediaGroup?
Не могу понять, почему у меня сервер не отвечает на попытку отправить хоть какой-то файл
59. IvanPoh 25 16.02.21 19:28 Сейчас в теме
А вот как отправить сообщение в группу от бота, но конкретному пользователю через @, такое возможно?
60. bulpi 217 16.03.21 15:19 Сейчас в теме
Вопрос :
Я отправил в бот сообщение с файлом. Можно как-то узнать, скачали его, или нет ?
61. simuljakr 203 02.05.21 15:19 Сейчас в теме
Здравствуйте!

Подскажите пожалуйста - а как удалить клавиатуру с кнопками (любую и InlineKeyboardMarkup, ReplyKeyboardMarkup) ?

Нужно сделать чтобы после того, как пользователь нажал одну из кнопок - клавиатура исчезала.
В случае с ReplyKeyboardMarkup есть признак one_time_keyboard - но установка этого признака - лишь скрывает кнопки - а хочется именно удалить - чтобы не было возможности повторно их нажимать....
viktor3d; +1 Ответить
62. simuljakr 203 02.05.21 15:24 Сейчас в теме
Столкнулся со странным ограничением - при использовании InlineKeyboardMarkup: поле callback_data позволяет передавать в него только до 32 символов.... Как-то совсем мало... Причем сам заголовок кнопки (поле text) такого ограничения не имеет.... КТо сталкивался с этим ограничением ? Как решили проблему?
63. zFire 23.06.21 12:43 Сейчас в теме
я не могу понять почему у меня не работает в выходном файле вот так:

-----8d936432d8e4243
Content-Disposition: form-data; name="chat_id"

<мой чат ИД>
-----8d936432d8e4243
Content-Disposition: form-data; name="media"

[{"type": "document", "media": "attach://file"}]
-----8d936432d8e4243
Content-Disposition: form-data; name="file" filename="Right.pdf"
Content-Type: multipart/form-data
Content-Type: application/pdf
Content-Transfer-Encoding: binary

Здесь бинарные данные
-----8d936432d8e4243--

При этом происходит соединение и вываливается по таймауту, сервер ничего не присылает
Пробовал sendDocument за место sendMediaGroup тот же эффект.
Помогите разобраться пожалуйста. При этом отправка сообщений проходит на ура
65. пользователь 07.07.21 18:26
Сообщение было скрыто модератором.
...
67. gubanoff 63 08.07.21 17:37 Сейчас в теме
(0) Большое спасибо за качественный материал! Все очень подробно, аккуратно и со смыслом написано, структурировано и изложено.
68. Oleg_nsk 279 30.07.21 08:22 Сейчас в теме
С long polling возникает странная проблема. Запускаю фоновое задание, где в бесконечном цикле идет опрос с таймаутом 10 минут. Однако, через 3-4 дня бот перестает отвечать на команды. Причем, что интересно, фоновое задание в 1с определяется как активное. Спасает только сброс фонового задания и его перезапуск. Если кто-то знает как решить отпишитесь, пожалуйста.
71. nkp14108 94 21.12.21 17:04 Сейчас в теме
(68) Подскажи как формировать структуру исходящего опроса(генерировать опрос в 1с и посылать боту)? Текстовое представление запроса можно.
69. Snus71 234 18.10.21 11:54 Сейчас в теме
Не раскрыта тема: а можно ли добавить в существующий приватный канал юзера? Не прислать ссылку-инвайт, что понятно как реализуется, а именно добавить без участия того самого пользователя
70. nkp14108 94 09.12.21 17:26 Сейчас в теме
Подскажите, можно ли присвоить уникальный ID исходящего сообщения с КНОПКАМИ(например посылаю 2 кнопки(согласовать/не согласовать), по нажатию одной из кнопок, что бы при переборе всех входящих я мог определить, что это именно от нужной кнопки).
Решаю задачу - посылаю сообщения с КНОПКАМИ с привязкой к документу(файлу) и их в ленте несколько. По косвенным признакам могу, но хочется однозначный вариант.
74. user1478951 12.04.22 17:30 Сейчас в теме
Подскажите как отправить кнопки(клавиатурные) с галочками для выбора нескольких вариантов и как их потом обработать (ответ)
75. gigapevt 25 03.07.22 12:38 Сейчас в теме
Отлично написанная статья! Благодарность автору за его труд. Очень помогла статья при разработке бота + http-сервиса.
76. UPKA 15.07.22 07:33 Сейчас в теме
Подскажите пожалуйста, как удалять системные сообщения?
77. mrfills 19.07.22 14:42 Сейчас в теме
А как отправить одновременно 2 клавиатуры? под сообщением и внизу кнопки
78. user1861964 19.10.22 21:53 Сейчас в теме
(77) так нельзя, к одному сообщению - одну клавиатуру
79. chupetkiniv 10.11.22 13:41 Сейчас в теме
можно 2 sendMessage вызвать с inline keyboard и replykeyboard
80. Dipod 114 02.06.23 16:22 Сейчас в теме
Не очень красиво в случае multipart/form-data, чтобы запихнуть двоичные данные файла пользоваться объединением файлов. Легче это делать через поток, как в примере ниже

	boundary = СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
	
	ПотокТело = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);

	ЗаписьДанных.ЗаписатьСтроку("");
	ЗаписьДанных.ЗаписатьСтроку("--"+Boundary);        
	ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");  

	ЗаписьДанных.ЗаписатьСтроку("Content-Transfer-Encoding: binary");
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename="""+ ИмяФайла +"""");  
	
	ЗаписьДанных.ЗаписатьСтроку("");
	ЗаписьДанных.Записать(ДвоичныеДанныеФайла);
	ЗаписьДанных.ЗаписатьСтроку("");     
	
	ЗаписьДанных.ЗаписатьСтроку("--"+Boundary+"--");
	ЗаписьДанных.Закрыть();
	
	ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
	
	HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
Показать
CepeLLlka; +1 Ответить
81. Evgen13 01.12.23 10:34 Сейчас в теме
Добрый день. Подскажите пожалуйста, есть тч, в ней 2 колонки "ИмяСсылки" и "СсылкаНаСайт", как отправить из тг данные ссылки, чтобы сообщение пришло "ИмяССылки" (ссылка на сайт). Делаю все через "sendMessage"

	ИначеЕсли ТекстЗапроса = "/фотографии" Тогда
		СсылкаНаФото = Справочники.ПользовательскиеПоля.НайтиПоКоду("000000001");
		Ссылка = СсылкаНаФото.СсылкиНаФотографии;
		Длина2 = 0; 
		МассивURL = Новый Массив;
		МаасивСсылок = Новый Массив;
			Для каждого Элемент из Ссылка Цикл
			
			МаасивСсылок.Добавить(Элемент.ИмяСсылки);
			ДлинаСтр = СтрДлина(Элемент.ИмяСсылки);
		Длина2 = Длина2+ДлинаСтр;
			СтруктураURL = Новый Структура("url", Элемент.СсылкаНаСайт);
			СтруктураURL.Вставить("type","text_link");
			СтруктураURL.Вставить("offset",0);
			СтруктураURL.Вставить("length",ДлинаСТр);
			//
			////МассивURL = Новый Массив;
			МассивURL.Добавить(СтруктураURL);
		КонецЦикла;
	
	       	СтруктураСообщения.Вставить("text",МаасивСсылок); 

			СтруктураСообщения.Вставить("entities",МассивURL);
Показать


но так не работает. Выводит сообщение в виде

"ИмяСсылки1" но тут есть ссылка и то как то наполовину
"ИмяСсылки2" - тут просто текст и дальше тоже пошел текст
82. simuljakr 203 06.12.23 17:27 Сейчас в теме
Здравствуйте.
Спасибо за статью!

Скажите, а есть ли возможность использовать в 1С UserBot -ов ?
Есть куча информации на эту тему на Питона. а вот чтобы ЮзерБотов прикручивали к 1С - я не нашел...
83. leongl 544 09.12.23 12:28 Сейчас в теме
(82)
Добрый день! Думаю нет проблем реализовать аналог в 1с. У telegram есть 2 api - bot-api и user-api, скорее всего используя второй можно получить функционал юзерБота. Вот ссылка https://core.telegram.org/methods
simuljakr; +1 Ответить
84. simuljakr 203 12.12.23 10:26 Сейчас в теме
(83) Может быть можете сделать пример ?
Авторизация - Получение новых сообщений - Отправка сообщений?
Возможно за плату ?
85. Saldorin 16.01.24 17:23 Сейчас в теме
Может кто помочь?
ForceReply - команда инициирующая цитату на отправляемое сообщение
Как ее вызвать?
86. Win98 29.03.24 07:55 Сейчас в теме
Всем добрый день!
Вопрос похожий на предыдущий: ReplyKeyboardHide - как она вызывается?
87. gtrr34 7 10.05.24 16:41 Сейчас в теме
Здравствуйте! Весь день убил, чтобы поставить реакцию на сообщение с помощью метода ТГ setMessageReaction
не могу понять, как создается объект, передаваемый в параметре reaction :
Array of ReactionType (Строка) Optional A JSON-serialized list of reaction types to set on the message

перебрал всевозможные вариации.

пример HTTP запроса:

https://api.telegram.org/***токен***/setMessageReaction?chat_id=***&message_id=4939&reaction=
{ReactionType:[{"type":"emoji","emoji":"✅"}]}
// И тут перебирал варианты с массивами, структурами, скобками, кавычками...
Ответ - "Bad Request: can't parse reaction types JSON object"}

[{"ReactionType":[{"type":"emoji"},{"emoji":"✅"}]}]
Ответ - Bad Request: can't parse ReactionType: Can't find field \"type\"}
// если поле переименовать [{"ReactionType":[{"type\":"emoji"},{"emoji":"✅"}]}] то первая ошибка

[{"type":"emoji","emoji":"✅"}]
Ответ - Bad Request: REACTION_INVALID


И вопрос в какой кодировке отправлять emoji?
88. tigcorp 4 06.06.24 14:37 Сейчас в теме
Подскажите, пожалуйста, сталкивались ли вы с ограничениями из-за версии платформы или версии совместимости конфигурации?
Рисуется задача рассылки сообщений на платформе 8.3.5.1248 и конфигурации ДГУ 1.4.6.2 (Режим совместимости 8.3.4) Вопрос обновления не рассматривается.
89. PSKMOL 05.07.24 16:47 Сейчас в теме
Всем привет!

Пример отправки нескольких фото в чат телеграмм в виде альбома с использованием метода sendMediaGroup
Результат прикреплен во вложении, в коде в переменной Токен необходимо указать токен своего бота

//--------------------------------------------------------/
//
//ПАРАМЕТРЫ
//
//масМассивФото - массив фото для отправки, содержит полные пути к файлам для отправки
//стрТекстПодписи - подпись, которая будет выводиться внизу альбома
//ИдентификаторЧата - идентификатор чата телеграм, в который будут отправлены фото
//
//--------------------------------------------------------/
Процедура ОтправитьАльбомВТелеграм(масМассивФото,стрТекстПодписи, ИдентификаторЧата)
	
	//метод sendmediaGroup  поддерживает отправку групп файлов (фото, документов, видео и т.п.) в виде альбома с количеством элементов
	//от 2 до 10
	
	//описание метода на английском: https://core.telegram.org/bots/api#sendmediagroup
	
	//1. формируем содержимое параметра "media" метода sendMediaGroup
	//это сериализованный в строку массив JSON, в котором хранится описание передаваемых данных,
	//каждый элемент содержит описание типа (для фотографий "photo") и имя файла, которое будет указано в параметре name
	//в блоке, multipart/form-data, в котором передается сам файл
	
	МассивЗначений = Новый Массив;
	ИдФото=строка(новый УникальныйИдентификатор());

	// в первом элементе массива содержится подпись ко всему альбому, если добавлять подпись к каждому элементу
	// телеграм не выведет подпись к альбому - подписи будут выводиться при просмотре альбома для каждого элемента
	структураСподписью = новый Структура;
	структураСподписью.Вставить("type","photo");
	структураСподписью.Вставить("media","attach://"+Идфото);
	структураСподписью.Вставить("caption",стрТекстПодписи);
	МассивЗначений.Добавить(структураСподписью);
	
	для эл=1 по масМассивФото.Количество()-1 цикл
		структЭлемент = новый Структура;
		структЭлемент.Вставить("type","photo");
		структЭлемент.Вставить("media","attach://"+Идфото+строка(эл));
		МассивЗначений.Добавить(структЭлемент);
	КонецЦикла;
	
	ЗначениеДляЗаписи = Новый ФиксированныйМассив(МассивЗначений);
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ЗначениеДляЗаписи);
	СтрокаJSON = ЗаписьJSON.Закрыть();
	
	////////////////////////////////////////////////////////////­//////////////////////////
	//2.Формируем текст POST-запроса для отправки в телеграм
	Токен = "ДобавитьСвойТокен"; //токен бота         
	
	//разделитель
	Boundary = "----" + Строка(Новый УникальныйИдентификатор());

	//Определяем массив для процедуры ОбъединитьФайлы
	//в массиве содержатся имена временных файлов, содержащих фрагменты запроса и сами файлы изображений
	//в итоге они объединятся в один файл, содержимое которого будет содержать итоговый запрос
	//текст из текстовых файлов и двоичные данные из картинок
	МассивФайловДляОбъединения = Новый Массив;
	
	//определяем массив для удаления временных файлов
	МассивФайловДляУдаления = новый массив;
	
	//Формируем начальный фрагмент файла POST-запроса
	ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
	МассивФайловДляУдаления.Добавить(ИмяФайлаОтправкиНачало);
	ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8);
	
	ТекстДляОтправки = "";                             
	
	//ИД-чата
	ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""chat_id""" + Символы.ПС + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + Формат(ИдентификаторЧата, "ЧГ=") + Символы.ПС;
	
	//отключение уведомлений - необязательный параметр
	ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""disable_notification""" + Символы.ПС + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "True" + Символы.ПС;
	//окончание блока отключения уведомлений
	
	//блок передачи параметра "media"
	ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""media""" + Символы.ПС + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + СтрокаJSON + Символы.ПС;
	
	//передача первого файла из массива в альбом
	//имена файлов в параметре "name" должны совпадать с именами в массиве media
	//"media","attach://"+Идфото
	ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name="""+ИдФото+"""; filename= """+Строка(Новый УникальныйИдентификатор())+".jpg""" + Символы.ПС;

	ФайлОтправкиНачало.ЗаписатьСтроку(ТекстДляОтправки);
	ФайлОтправкиНачало.Закрыть();
		
	//добавляем начало запроса и первый файл
	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
	МассивФайловДляОбъединения.Добавить(сокрлп(масМассивФото.Получить(0)));
	
	//передача всех последующих файлов - сначала идет заголовок блока в формате multipart/form-data, а затем сам файл
	для эл=1 по масМассивФото.Количество()-1 цикл
		
		ИмяФайлаОтправкиПромежуток = ПолучитьИмяВременногоФайла("txt");
		МассивФайловДляУдаления.Добавить(ИмяФайлаОтправкиПромежуток);
		ФайлаОтправкиПромежуток = Новый ЗаписьТекста(ИмяФайлаОтправкиПромежуток, КодировкаТекста.UTF8);
		
		ТекстДляОтправки = "" + Символы.ПС;
		ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
		ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name="""+ИдФото+строка(эл)+"""; filename= """+Строка(Новый УникальныйИдентификатор())+".jpg""" + Символы.ПС;
		
		ФайлаОтправкиПромежуток.ЗаписатьСтроку(ТекстДляОтправки);
		ФайлаОтправкиПромежуток.Закрыть();
			
		МассивФайловДляОбъединения.Добавить(СокрЛП(ИмяФайлаОтправкиПромежуток));	
		МассивФайловДляОбъединения.Добавить(СокрЛП(масМассивФото.Получить(эл)));
		
	Конеццикла;
		 
	//Формируем конечный фрагмент файла POST-запроса
	ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
	МассивФайловДляУдаления.Добавить(ИмяФайлаОтправкиКонец);
	ФайлаОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8);
	
	ТекстДляОтправки = "" + Символы.ПС;
	ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + "--";
	
	ФайлаОтправкиКонец.ЗаписатьСтроку(ТекстДляОтправки);
	ФайлаОтправкиКонец.Закрыть();
	
	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
	
	//объединяем файлы для формирования итогового запроса
	ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
	МассивФайловДляУдаления.Добавить(ИмяФайлаОтправки);
	ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
	
    //создаем соединение с сервером телеграм и отправляем запрос
	Ресурс 	= "bot" + Токен + "/sendMediaGroup";   
			  
	HTTPСоединение = Новый HTTPСоединение("api.telegram.org",,,,,, Новый ЗащищенноеСоединениеOpenSSL);

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

	HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
    
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);  
	ЧтениеJSON = Новый ЧтениеJSON();
	СтрокаОтвет = HTTPОтвет.ПолучитьТелоКакСтроку();
	ЧтениеJSON.УстановитьСтроку(СтрокаОтвет);				
	 
	СоответствиеОтвет = ПрочитатьJSON(ЧтениеJSON, Истина);    
	
	Если СоответствиеОтвет["ok"]=ложь Тогда
		текстошибки="Ошибка при отправке фото в телеграм: "+символы.ПС+"Код: "+СоответствиеОтвет["error_code"]+символы.ПС+"Описание: "+СоответствиеОтвет["description"];
		//также можно записать текст ошибки в лог файл	
		сообщить(текстОшибки);
	КонецЕсли;
	
	//освобождаем ресурсы и убираем за собой 
	HTTPЗапрос=неопределено;
	HTTPСоединение=неопределено;
	
	для каждого ф из МассивФайловДляУдаления цикл
		УдалитьФайлы(ф);
	Конеццикла;

КонецПроцедуры
Показать
Прикрепленные файлы:
CepeLLlka; +1 Ответить
91. kembrik 10 06.08.24 14:30 Сейчас в теме
(89) Вот спасибо, дорогой товарищ, перепишу кусок на Элемент и буду пользоваться
90. пользователь 24.07.24 13:01
Сообщение было скрыто модератором.
...
92. ВИЛенин 2 31.10.24 18:21 Сейчас в теме
Что делать если при загрузке файле нет раздела file_path, а если есть, то появляется без расширения?
93. ВИЛенин 2 31.10.24 19:32 Сейчас в теме
Имеется ввиду вот этот блок. Когда я пытаюсь получить документ/изображение...

{
"ok": true,
"result": {
"file_id": "CQACAgIAAxkBAANmXoc4ft2Lvo9TAxiyyCcUq1ipBnAAAswIAAKPMzhI7jX­uFr4VwA8YBA",
"file_unique_id": "AgADzAgAAo8zOEg",
"file_size": 8080469,
"file_path": "music/file_0.mp3"
}
}
Оставьте свое сообщение