Как настроить отправку сообщений из 1С в Skype?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработчики часто сталкиваются с задачей автоматизации уведомлений пользователей через популярные мессенджеры. В этой статье мы подробно разберем, как подружить 1С и Skype для отправки текстовых сообщений, почему старые методы интеграции больше не работают и какие современные инструменты стоит использовать для решения этой задачи.

Почему библиотека Skype4COM.dll больше не работает

При поиске решений в интернете часто можно встретить примеры кода с использованием конструкции ПолучитьCOMОбъект("", "Skype4COM.Skype"). При попытке запустить такой код в современных операционных системах вы неизбежно столкнетесь с ошибкой инициализации COM-объекта.

Выясним причину этой проблемы. Дело в том, что библиотека Skype4COM базировалась на старом программном интерфейсе Skype Desktop API. Компания Microsoft полностью прекратила поддержку и отключила этот API еще несколько лет назад. Современные версии Skype (начиная с 8-й версии) больше не поддерживают локальные COM-интерфейсы. Пытаться зарегистрировать эту библиотеку в операционной системе бессмысленно — она не сможет пройти авторизацию в облачной сети Skype.

Нам необходимо использовать современные, официально поддерживаемые протоколы веб-взаимодействия.

Официальное решение: Microsoft Bot Framework через HTTP-запросы

Для реализации вменяемого механизма взаимодействия со Skype мы будем использовать стандартные объекты платформы 1С: HTTPСоединение и HTTPЗапрос для работы с Microsoft Bot Framework REST API.

Рассмотрим по шагам процесс настройки интеграции.

Шаг 1. Регистрация бота

Для начала нам необходимо зарегистрировать чат-бота в облачной панели управления Microsoft Azure Bot Service. После успешной регистрации система сгенерирует два ключевых параметра:

  1. Microsoft App ID — уникальный идентификатор вашего приложения.
  2. Client Secret — секретный пароль (токен) вашего бота.

Обязательно сохраните эти данные, так как они понадобятся нам для авторизации запросов со стороны 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Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    Исключение
        ЗаписатьЛогОшибки(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Как узнать идентификатор чата (Conversation ID)?

Главная сложность при работе с Bot Framework заключается в том, что бот не может отправить сообщение пользователю по его логину или номеру телефона напрямую. Сделано это для предотвращения спам-рассылок. Бот должен получить уникальный Conversation ID (идентификатор диалога), который генерируется только тогда, когда пользователь сам добавляет бота в контакты или в групповой чат и отправляет ему первое сообщение.

Разберем по шагам, как настроить получение этого идентификатора в 1С:

  1. Создание HTTP-сервиса в 1С: Нам необходимо создать в конфигурации собственный HTTP-сервис и опубликовать его на веб-сервере (например, IIS или Apache).
  2. Настройка Webhook в Azure: В настройках зарегистрированного бота на портале Azure укажите публичный URL-адрес вашего HTTP-сервиса в поле Messaging endpoint.
  3. Обработка входящего JSON: Когда пользователь напишет боту любое приветственное сообщение (например, «Привет»), Microsoft перенаправит JSON-пакет на ваш HTTP-сервис.

Рассмотрим структуру входящего запроса. 1С должна принять POST-запрос, распарсить JSON и извлечь идентификатор диалога из пути conversation.id. Полученный идентификатор (он обычно начинается с префикса 29: для личных сообщений или 19: для групп) следует сохранить в справочнике 1С (например, привязать к карточке «Физические лица» или «Контрагенты»). В дальнейшем 1С будет использовать именно этот сохраненный ID для автоматической рассылки.

Альтернативный неофициальный способ: Использование Python-скрипта (библиотека SkPy)

Если процесс регистрации официального бота в облаке Azure кажется вам избыточным, или ваша база 1С развернута локально без возможности публикации HTTP-сервисов во внешний интернет, существует альтернативный обходной путь. Мы можем использовать язык программирования Python и стороннюю библиотеку SkPy.

Суть метода: библиотека SkPy умеет эмулировать поведение обычного клиента Skype Web API. Вы можете программно авторизоваться под учетной записью обычного пользователя (используя логин и пароль) и отправить сообщение в чат.

Для реализации этого подхода выполните следующие действия:

  1. Установите интерпретатор Python на сервере 1С.
  2. Установите библиотеку командной строкой: pip install SkPy.
  3. Создайте Python-скрипт (например, 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. Теперь вы можете выбрать оптимальный путь решения задачи в зависимости от сетевой инфраструктуры вашего предприятия и требований к безопасности.

← На главную