Разработчики часто сталкиваются с задачей автоматизации уведомлений пользователей через популярные мессенджеры. В этой статье мы подробно разберем, как подружить 1С и Skype для отправки текстовых сообщений, почему старые методы интеграции больше не работают и какие современные инструменты стоит использовать для решения этой задачи.
При поиске решений в интернете часто можно встретить примеры кода с использованием конструкции ПолучитьCOMОбъект("", "Skype4COM.Skype"). При попытке запустить такой код в современных операционных системах вы неизбежно столкнетесь с ошибкой инициализации COM-объекта.
Выясним причину этой проблемы. Дело в том, что библиотека Skype4COM базировалась на старом программном интерфейсе Skype Desktop API. Компания Microsoft полностью прекратила поддержку и отключила этот API еще несколько лет назад. Современные версии Skype (начиная с 8-й версии) больше не поддерживают локальные COM-интерфейсы. Пытаться зарегистрировать эту библиотеку в операционной системе бессмысленно — она не сможет пройти авторизацию в облачной сети Skype.
Нам необходимо использовать современные, официально поддерживаемые протоколы веб-взаимодействия.
Для реализации вменяемого механизма взаимодействия со Skype мы будем использовать стандартные объекты платформы 1С: HTTPСоединение и HTTPЗапрос для работы с Microsoft Bot Framework REST API.
Рассмотрим по шагам процесс настройки интеграции.
Шаг 1. Регистрация бота
Для начала нам необходимо зарегистрировать чат-бота в облачной панели управления Microsoft Azure Bot Service. После успешной регистрации система сгенерирует два ключевых параметра:
Обязательно сохраните эти данные, так как они понадобятся нам для авторизации запросов со стороны 1С.
Шаг 2. Подключение канала Skype
В панели управления Azure Bot Service перейдите в раздел каналов (Channels) и активируйте канал «Skype». Если планируется отправлять сообщения не только в личные чаты, но и в группы, обязательно включите опцию «Enable adding to a group» в настройках канала Skype.
Шаг 3. Получение авторизационного токена из 1С
Безопасность Microsoft Bot Framework требует обязательной авторизации по протоколу OAuth 2.0. Бот не сможет отправить сообщение без временного токена доступа. Напишем код в 1С для получения этого токена.
Проанализируем пример кода для получения токена:
Функция ПолучитьТокенАвторизации(Знач AppID, Знач ClientSecret) Экспорт
СерверАвторизации = "login.microsoftonline.com";
ПутьЗапроса = "/botframework.com/oauth2/v2.0/token";
HTTPСоединение = Новый HTTPСоединение(СерверАвторизации, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(ПутьЗапроса);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
ПараметрыТела = "grant_type=client_credentials"
+ "&client_id=" + КодироватьСтроку(AppID, СпособКодированияСтроки.КодироватьИменаПолей)
+ "&client_secret=" + КодироватьСтроку(ClientSecret, СпособКодированияСтроки.КодироватьИменаПолей)
+ "&scope=" + КодироватьСтроку("https://api.botframework.com/.default", СпособКодированияСтроки.КодироватьИменаПолей);
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыТела, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
Возврат ДанныеОтвета.access_token;
Иначе
ВызватьИсключение "Ошибка авторизации: " + HTTPОтвет.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Шаг 4. Отправка сообщения из 1С
Имея на руках полученный токен доступа, мы можем отправить текстовое сообщение в конкретный чат Skype. Для этого отправляется POST-запрос на специальный URL-адрес службы доставки сообщений.
Посмотрим на пример функции отправки сообщения:
Процедура ОтправитьСообщениеSkype(Знач ТокенДоступа, Знач ConversationID, Знач ТекстСообщения) Экспорт
// Адрес API-интерфейса Microsoft Bot Framework Connector
СерверAPI = "smba.trafficmanager.net";
РесурсAPI = "/apis/v3/conversations/" + ConversationID + "/activities";
HTTPСоединение = Новый HTTPСоединение(СерверAPI, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(РесурсAPI);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
// Формируем JSON-тело запроса согласно спецификации API
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СтруктураАктивности = Новый Структура;
СтруктураАктивности.Вставить("type", "message");
СтруктураАктивности.Вставить("text", ТекстСообщения);
ЗаписатьJSON(ЗаписьJSON, СтруктураАктивности);
ТелоJSON = ЗаписьJSON.Закрыть();
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоJSON, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния <> 201 И HTTPОтвет.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("ОтправкаSkype", УровеньЖурналаРегистрации.Предупреждение,,, HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Главная сложность при работе с Bot Framework заключается в том, что бот не может отправить сообщение пользователю по его логину или номеру телефона напрямую. Сделано это для предотвращения спам-рассылок. Бот должен получить уникальный Conversation ID (идентификатор диалога), который генерируется только тогда, когда пользователь сам добавляет бота в контакты или в групповой чат и отправляет ему первое сообщение.
Разберем по шагам, как настроить получение этого идентификатора в 1С:
Рассмотрим структуру входящего запроса. 1С должна принять POST-запрос, распарсить JSON и извлечь идентификатор диалога из пути conversation.id. Полученный идентификатор (он обычно начинается с префикса 29: для личных сообщений или 19: для групп) следует сохранить в справочнике 1С (например, привязать к карточке «Физические лица» или «Контрагенты»). В дальнейшем 1С будет использовать именно этот сохраненный ID для автоматической рассылки.
Если процесс регистрации официального бота в облаке Azure кажется вам избыточным, или ваша база 1С развернута локально без возможности публикации HTTP-сервисов во внешний интернет, существует альтернативный обходной путь. Мы можем использовать язык программирования Python и стороннюю библиотеку SkPy.
Суть метода: библиотека SkPy умеет эмулировать поведение обычного клиента Skype Web API. Вы можете программно авторизоваться под учетной записью обычного пользователя (используя логин и пароль) и отправить сообщение в чат.
Для реализации этого подхода выполните следующие действия:
pip install SkPy.send_skype.py), который принимает параметры командной строки.Рассмотрим пример такого Python-скрипта:
import sys
from skpy import Skype
def send_message(username, password, chat_id, message_text):
try:
# Авторизация в облаке Skype под обычным аккаунтом
sk = Skype(username, password)
# Получаем объект чата по его ID
chat = sk.chats.chat(chat_id)
# Отправляем текстовое сообщение
chat.sendMsg(message_text)
print("Success")
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
if len(sys.argv) > 4:
send_message(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
Теперь из 1С мы можем вызывать данный скрипт с помощью стандартного метода ЗапуститьПриложение, передавая в него нужные параметры:
ИмяСкрипта = "C:\SkypeScripts\send_skype.py";
Логин = "my_skype_login";
Пароль = "my_secret_password";
ИдентификаторПолучателя = "live:.cid.123456789";
ТекстСообщения = """Привет из 1С! Тестовое сообщение.""";
ПараметрыЗапуска = СтрШаблон(""" "%1" "%2" "%3" "%4" "%5" """,
ИмяСкрипта, Логин, Пароль, ИдентификаторПолучателя, ТекстСообщения);
ЗапуститьПриложение("python.exe" + ПараметрыЗапуска, , Истина);
Обратите внимание на важные ограничения неофициального метода:
Мы подробно проанализировали варианты интеграции 1С со Skype. Теперь вы можете выбрать оптимальный путь решения задачи в зависимости от сетевой инфраструктуры вашего предприятия и требований к безопасности.