Руководством была поставлена задача взаимодействия с клиентами через Viber.
Была старта работ была использована публикация: //infostart.ru/public/1061585/
Вот моё решение.
-
Необходимо зарегистрировать Viber бота, как это делать описывать не буду, есть куча статей
-
Получаем токен бота на из вашего кабинета https://partners.viber.com/account/----------------/info
-
Для получения данных от бота надо подключить вэб-хук. Возможности завести свой HTTPS пока нет. По этому я использовал https://webhook.site/
Нормально переадресацию смог настроить только с премиум доступом к сервису за 3.6$ в месяц, на мой взгляд не дорого.
Может можно и на бесплатном функционале сервиса, но смог только так разобраться.
На нём была настроена переадресация на мой HTTP сервис опубликованный из 1С
а. Настройка редикректа
2. Структура вэб-сервиса
4. После публикации вэб-сервиса, подключаем вэб-хук к боту:
Процедура УстановитьВебхук(Токен, Вебхук)
//Токен = "##################################################";
//Вебхук ="https://webhook.site/########-####-####-####-############";
Если ПустаяСтрока(Токен) Тогда
Сообщить("Укажите токен");
Возврат;
КонецЕсли;
Если ПустаяСтрока(Вебхук) Тогда
Сообщить("Заполните вебхук");
Возврат;
КонецЕсли;
Сервер = "chatapi.viber.com";
Статусы = Новый Массив; //ограничиваем события которые будут к нам прилетать по вэб-хуку.
Статусы.Добавить("subscribed");
Статусы.Добавить("unsubscribed");
Статусы.Добавить("conversation_started");
ТелоЗапроса = ПолучитьСтруктуруСообщения(Новый Структура("url, event_types", Вебхук, Статусы));
Адрес = ПолучитьТекстЗапросаВайбер("set_webhook");
Соединение = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows,Новый СертификатыУдостоверяющихЦентровWindows()));
Запрос = Новый HTTPЗапрос(Адрес);
Если ТелоЗапроса <> Неопределено Тогда
Запрос.Заголовки.Вставить("X-Viber-Auth-Token",Токен);
Запрос.Заголовки.Вставить("Content-Type","application/json");
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Иначе
Ответ = Соединение.Получить(Запрос);
КонецЕсли;
Чтение = Новый ЧтениеJSON;
ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
Чтение.УстановитьСтроку(ОтветСтрокой);
Результат = ПрочитатьJSON(Чтение);
Если Результат.status = 1 Тогда
Сообщить("При установке вебхука произошла ошибка " + ОтветСтрокой);
ИначеЕсли Результат.status = 0 Тогда
Сообщить("Вебхук успешно установлен");
КонецЕсли;
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("При установке вебхука произошла ошибка " + ОтветСтрокой);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСтруктуруСообщения(СтруктураПараметров = Неопределено)
СтруктураНастроек = Новый Структура();
Если СтруктураПараметров <> Неопределено Тогда
Для Каждого стрПараметр Из СтруктураПараметров Цикл
СтруктураНастроек.Вставить(стрПараметр.Ключ, стрПараметр.Значение);
КонецЦикла;
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураНастроек);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Функция ПолучитьТекстЗапросаВайбер(ИмяКоманды)
Адрес = "/pa/";
Адрес = Адрес + ИмяКоманды;
Возврат Адрес;
КонецФункции
5. После подключения к вэб-хука в боте включится возможность отправки сообщений пользователем боту.
6. В процедуре вэб-сервиса создадим обработчик:
Функция Hookviber(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
ПроцедурыViber.ОбработатьЗапрос(Запрос);
Возврат Ответ;
КонецФункции
Пример: Получим список админов и отправим им сообщение:
Процедура ОтправитьСообщениеВПубличныйЧатАдминистраторам(Текст = Неопределено) Экспорт
Админы = ПолучитьСписокАДминистраторов();
Для Каждого Получатель из Админы Цикл
Структура = Новый Структура();
Структура.Вставить("receiver", Получатель);
sender = Новый Соответствие();
sender.Вставить("name", "Чат-бот");
Структура.Вставить("sender", sender);
Структура.Вставить("type", "text");
Структура.Вставить("text", ?(Текст = Неопределено, "Добрый день!", Текст));
ОтправитьЗапросНаСерверВайбера("send_message", Структура);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокАДминистраторов()
Ответ = ОтправитьЗапросНаСерверВайбера("get_account_info");
Админы = Новый Массив;
Если ТипЗнч(Ответ) = Тип("Структура") Тогда
Если Ответ.Свойство("members") Тогда
Подписчики = Ответ.members;
Для Каждого Подписчик Из Подписчики Цикл
Если Подписчик.role = "admin" Тогда
Админы.Добавить(Подписчик.id);
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Админы;
КонецФункции
Функция ОтправитьЗапросНаСерверВайбера(ИмяКоманды, СтруктураПараметров = Неопределено)
Сервер = "chatapi.viber.com";
ТелоЗапроса = ПолучитьСтруктуруСообщения(СтруктураПараметров);
Адрес = ПолучитьТекстЗапросаВайбер(ИмяКоманды);
Соединение = Новый HTTPСоединение(Сервер,,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(Адрес);
Если ТелоЗапроса <> Неопределено Тогда
Запрос.Заголовки.Вставить("Content-Type","application/json");
Запрос.Заголовки.Вставить("X-Viber-Auth-Token","Токен");
Если СтрДлина(ТелоЗапроса) > 4 тогда
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
КонецЕсли;
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Иначе
Ответ = Соединение.Получить(Запрос);
КонецЕсли;
Чтение = Новый ЧтениеJSON;
ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
Чтение.УстановитьСтроку(ОтветСтрокой);
Результат = ПрочитатьJSON(Чтение);
Возврат Результат;
КонецФункции
Пример: отправим администраторам запрос на согласование с кнопками в тексте
Процедура ЗапроситьСогласование() Экспорт
Админы = ПолучитьСписокАДминистраторов();
Стр = ПолучитьСтруктуруЗапросаСогласование("Простое согласование");
Для Каждого Админ из Админы Цикл
Структура = Новый Структура();
Структура.Вставить("receiver", Админ);
sender = Новый Соответствие();
sender.Вставить("name", "Бот-Согласование");
Стр.receiver = Админ;
ОтправитьЗапросНаСерверВайбера("send_message", Стр);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСтруктуруЗапросаСогласование(Текст)
//Формируем структуру
Структура = Новый Структура();
Структура.Вставить("receiver", "");
Структура.Вставить("min_api_version", 2);
sender = Новый Соответствие();
sender.Вставить("name", "Бот-Согласование");
Структура.Вставить("sender", sender);
Структура.Вставить("type", "rich_media");
rich_media = Новый Структура;
rich_media.Вставить("Type", "rich_media");
rich_media.Вставить("BgColor", "#FFFFFF");
rich_media.Вставить("ButtonsGroupColumns", 6);
rich_media.Вставить("ButtonsGroupRows", 7);
Кнопки = Новый Массив;
Кнопка = Новый Структура;
Кнопка.Вставить("Columns", 6);
Кнопка.Вставить("Rows", 5);
Кнопка.Вставить("ActionType", "none");
Кнопка.Вставить("ActionBody", "text");
Кнопка.Вставить("TextSize", "medium");
Кнопка.Вставить("TextVAlign", "middle");
Кнопка.Вставить("TextHAlign", "left");
Кнопка.Вставить("Text", "[<b>" + Текст + "</b>]");
Кнопки.Добавить(Кнопка);
Кнопка = Новый Структура;
Кнопка.Вставить("Columns", 6);
Кнопка.Вставить("Rows", 1);
Кнопка.Вставить("ActionType", "reply");
Кнопка.Вставить("ActionBody", "Ok");
Кнопка.Вставить("Text", "<font color=#000000>Согласовать</font>");
Кнопка.Вставить("BgColor", "#00a86b");
Кнопка.Вставить("TextSize", "large");
Кнопка.Вставить("TextVAlign", "middle");
Кнопка.Вставить("TextHAlign", "middle");
Кнопки.Добавить(Кнопка);
Кнопка = Новый Структура;
Кнопка.Вставить("Columns", 6);
Кнопка.Вставить("Rows", 1);
Кнопка.Вставить("ActionType", "reply");
Кнопка.Вставить("ActionBody", "No");
Кнопка.Вставить("BgColor", "#ff4f00");
Кнопка.Вставить("Text", "<font color=#000000>Отказать</font>");
Кнопка.Вставить("TextSize", "large");
Кнопка.Вставить("TextVAlign", "middle");
Кнопка.Вставить("TextHAlign", "middle");
Кнопки.Добавить(Кнопка);
rich_media.Вставить("Buttons", Кнопки);
Структура.Вставить("rich_media", rich_media);
Возврат Структура;
КонецФункции
Пример: обработаем ответ на согласование.
Процедура ОбработатьЗапрос(Запрос) Экспорт
Попытка
СтруктураДанных = ПрочитатьJSON(Запрос.ПолучитьТелоКакСтроку());
Отправитель = СтруктураДанных.Получить("sender");
Сообщение = СтруктураДанных.Получить("message");
Если Сообщение<>Неопределено и Отправитель<>Неопределено Тогда
ТипСообщения = Сообщение["type"];
ТекстСообщения = "" + Сообщение["text"];
Если ТекстСообщения = "Ok" или ТекстСообщения = "No" Тогда
ОтправитьСообщениеВПубличныйЧатАдминистраторам("" + Отправитель["name"] + " выполнил согласование: " + ТекстСообщения);
КонецЕсли;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Ошибка обработки запроса из Viber", УровеньЖурналаРегистрации.Ошибка,,,"" + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Как итог через 1с менеджеры отправляют на согласования различные запросы и получают ответы от руководителей, так же реализовал получение и отправку картинок. В примере оно есть. Для отправки картинки она должна быть видна из интернета.
Работает сей функционал уже полгода, полет нормальный.
Тестировалось на платформе 8.3.16.1224.