Не переносится клавиатура в телеграмм с 1с
Пока Выборка.Следующий() Цикл
СсылкаОбъект = Выборка.Ссылка;
Объект = СсылкаОбъект.ПолучитьОбъект();
Если Объект.Отправлено = Ложь Тогда
МассивКнопокСтрок = Новый Массив;
Кнопки = Новый Структура;
Кнопки.Вставить("text", Лев(Выборка.НазваниеЗадания, 80));
Кнопки.Вставить("callback_data", "/Gettask" + Выборка.ID);
МассивКнопокСтрок.Добавить(Кнопки);
МассивСтрок.Добавить(МассивКнопокСтрок);
Клавиатура = Новый Структура;
Клавиатура.Вставить("inline_keyboard", МассивСтрок);
ТекстСообщения = "Новое задание!";
Если ОтправитьСообщениеВTelegram(ТекстСообщения, Клавиатура) Тогда
//Объект.Отправлено = Истина;
//Объект.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
СоединениеHTTP = Новый HTTPСоединение(АдресTelegramAPI, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
АдресЗапроса = "bot" + МойToken + "/sendMessage?chat_id=" + ЧатID + "&parse_mode=HTML&text=";
АдресЗапроса = АдресЗапроса + ТекстСообщения;
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ЧатID);
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Если Клавиатура <> Неопределено Тогда
ПараметрыЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
ЗапросHTTP.Заголовки.Вставить("Connection", "keep-alive");
Попытка
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Показатьвот код, отправляет сообщение только "Новое задание", но не кнопки на которые можно будет нажать
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)
Функция ОтправитьСообщениеВTelegram(ТекстСообщения, Клавиатура = Неопределено)
МойToken = "123"; // Токен
АдресTelegramAPI = "api.telegram.org";
ЧатID = "123"; // Chat ID
СоединениеHTTP = Новый HTTPСоединение(АдресTelegramAPI, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
АдресЗапроса = "bot" + МойToken + "/sendMessage?chat_id=" + ЧатID + "&parse_mode=HTML&text=";
АдресЗапроса = АдресЗапроса + ТекстСообщения;
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ЧатID);
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Если Клавиатура <> Неопределено Тогда
ПараметрыЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
ЗапросHTTP.Заголовки.Вставить("Connection", "keep-alive");
Попытка
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Показать
(6) да, вот держите весь код
&НаСервере
Процедура ОтправитьНовоеЗадание() Экспорт
МойToken = "123"; // Токен
АдресTelegramAPI = "api.telegram.org";
ЧатID = "123"; // Chat ID
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| Заявки.Ссылка КАК Ссылка,
| Заявки.НазваниеЗадания КАК НазваниеЗадания,
| Заявки.ID КАК ID
|ИЗ
| Документ.Заявки КАК Заявки
|ГДЕ
| Заявки.Исполнитель = &Исполнитель
| И Заявки.Отправлено = ЛОЖЬ
| И Заявки.Статус = &Статус
|УПОРЯДОЧИТЬ ПО
| Заявки.Дата УБЫВ";
Запрос.УстановитьПараметр("Исполнитель", Справочники.Пользователи.НайтиПоНаименованию("Иван Иванов"));
Запрос.УстановитьПараметр("Статус", Справочники.Статус.НайтиПоНаименованию("Ждёт выполнения"));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
МассивСтрок = Новый Массив;
Пока Выборка.Следующий() Цикл
СсылкаОбъект = Выборка.Ссылка;
Объект = СсылкаОбъект.ПолучитьОбъект();
Если Объект.Отправлено = Ложь Тогда
МассивКнопокСтрок = Новый Массив;
Кнопки = Новый Структура;
Кнопки.Вставить("text", Лев(Выборка.НазваниеЗадания, 80));
Кнопки.Вставить("callback_data", "/Gettask" + Выборка.ID);
МассивКнопокСтрок.Добавить(Кнопки);
МассивСтрок.Добавить(МассивКнопокСтрок);
Клавиатура = Новый Структура;
Клавиатура.Вставить("inline_keyboard", МассивСтрок);
ТекстСообщения = "Новое задание!";
Если ОтправитьСообщениеВTelegram(ТекстСообщения, Клавиатура) Тогда
//Объект.Отправлено = Истина;
//Объект.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОтправитьСообщениеВTelegram(ТекстСообщения, Клавиатура = Неопределено)
МойToken = "123"; // Токен
АдресTelegramAPI = "api.telegram.org";
ЧатID = "123"; // Chat ID
СоединениеHTTP = Новый HTTPСоединение(АдресTelegramAPI, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
АдресЗапроса = "bot" + МойToken + "/sendMessage?chat_id=" + ЧатID + "&parse_mode=HTML&text=";
АдресЗапроса = АдресЗапроса + ТекстСообщения;
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ЧатID);
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Если Клавиатура <> Неопределено Тогда
ПараметрыЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
ЗапросHTTP.Заголовки.Вставить("Connection", "keep-alive");
Попытка
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Показать
Чтобы в сообщение Телеграм отправлялся параметр `reply_markup`, вам нужно изменить способ отправки запроса к API Телеграм. В текущем коде параметры запроса добавляются к URL, и запрос отправляется методом GET, что не позволяет корректно передать вложенный JSON-объект `reply_markup`.
Вам нужно:
1. Изменить метод запроса на POST.
2. Удалить параметры из URL и отправлять их в теле запроса.
3. Сериализовать структуру параметров, включая `reply_markup`, в JSON.
4. Установить заголовок `Content-Type` на `application/json`.
**Исправленный код будет выглядеть так:**
```1C
// Формируем адрес запроса без параметров
АдресЗапроса = "bot" + МойToken + "/sendMessage";
// Формируем структуру параметров
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ЧатID);
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Если Клавиатура <> Неопределено Тогда
ПараметрыЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
// Сериализуем параметры в JSON
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
ТекстЗапросаJSON = ЗаписьJSON.Закрыть();
// Создаем HTTP-запрос
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстЗапросаJSON, "UTF-8");
// Устанавливаем заголовки
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
// Устанавливаем метод запроса на POST
ЗапросHTTP.УстановитьМетод("POST");
// Отправляем запрос
Попытка
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
```
**Пояснение:**
- **Удаление параметров из URL:** Теперь `АдресЗапроса` содержит только базовый путь к методу API без параметров.
- **Формирование структуры параметров:** Все необходимые параметры запроса, включая `reply_markup`, добавляются в структуру `ПараметрыЗапроса`.
- **Сериализация в JSON:** Используя объект `ЗаписьJSON`, мы сериализуем структуру параметров в строку JSON.
- **Настройка HTTP-запроса:**
- Метод запроса устанавливается на POST с помощью `УстановитьМетод("POST")`.
- Тело запроса устанавливается на сериализованный JSON с помощью `УстановитьТелоИзСтроки`.
- Заголовок `Content-Type` устанавливается на `application/json`.
- **Отправка запроса и обработка ответа:** Запрос отправляется, и в зависимости от кода состояния возвращается `Истина` или `Ложь`.
**Важно:** Убедитесь, что ваша версия платформы 1С поддерживает работу с JSON и имеет методы для сериализации данных в JSON. Если таких методов нет, вам может понадобиться использовать внешние библиотеки или самостоятельно реализовать сериализацию.
Таким образом, изменив способ формирования и отправки запроса, вы сможете корректно отправлять `reply_markup` в сообщении Телеграм.
Вам нужно:
1. Изменить метод запроса на POST.
2. Удалить параметры из URL и отправлять их в теле запроса.
3. Сериализовать структуру параметров, включая `reply_markup`, в JSON.
4. Установить заголовок `Content-Type` на `application/json`.
**Исправленный код будет выглядеть так:**
```1C
// Формируем адрес запроса без параметров
АдресЗапроса = "bot" + МойToken + "/sendMessage";
// Формируем структуру параметров
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", ЧатID);
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
ПараметрыЗапроса.Вставить("parse_mode", "HTML");
Если Клавиатура <> Неопределено Тогда
ПараметрыЗапроса.Вставить("reply_markup", Клавиатура);
КонецЕсли;
// Сериализуем параметры в JSON
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
ТекстЗапросаJSON = ЗаписьJSON.Закрыть();
// Создаем HTTP-запрос
ЗапросHTTP = Новый HTTPЗапрос(АдресЗапроса);
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстЗапросаJSON, "UTF-8");
// Устанавливаем заголовки
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
// Устанавливаем метод запроса на POST
ЗапросHTTP.УстановитьМетод("POST");
// Отправляем запрос
Попытка
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
```
**Пояснение:**
- **Удаление параметров из URL:** Теперь `АдресЗапроса` содержит только базовый путь к методу API без параметров.
- **Формирование структуры параметров:** Все необходимые параметры запроса, включая `reply_markup`, добавляются в структуру `ПараметрыЗапроса`.
- **Сериализация в JSON:** Используя объект `ЗаписьJSON`, мы сериализуем структуру параметров в строку JSON.
- **Настройка HTTP-запроса:**
- Метод запроса устанавливается на POST с помощью `УстановитьМетод("POST")`.
- Тело запроса устанавливается на сериализованный JSON с помощью `УстановитьТелоИзСтроки`.
- Заголовок `Content-Type` устанавливается на `application/json`.
- **Отправка запроса и обработка ответа:** Запрос отправляется, и в зависимости от кода состояния возвращается `Истина` или `Ложь`.
**Важно:** Убедитесь, что ваша версия платформы 1С поддерживает работу с JSON и имеет методы для сериализации данных в JSON. Если таких методов нет, вам может понадобиться использовать внешние библиотеки или самостоятельно реализовать сериализацию.
Таким образом, изменив способ формирования и отправки запроса, вы сможете корректно отправлять `reply_markup` в сообщении Телеграм.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот