Работа с сервисами
- Работа с сервисами
- Получить календари
- Получить события календаря
- Первичная синхронизация
- Использование параметра SyncState при повторных запусках
- Обработка событий календаря
- Режим игнорирования ошибок
- Пример использования пакета Microsoft Exchange
- Отправить письмо
- Отправить запрос
- Запуск скрипта с помощью GraphQL-запроса
- Выполнить код
- Запуск скрипта с помощью JS-кода
- Получение файла с Jira
Работа с сервисами осуществляется с помощью блоков:
Получить календари
С помощью блока можно получить список календарей сотрудников.
- Для работы блока необходимо настроить подключение к Microsoft Exchange, которое позволит подключиться к Microsoft Exchange Server и получить данные о календарях для дальнейшего построения отчетов и анализа событий календаря.
- При настройке подключения необходимо загрузить корневой сертификат, если в URL сервера указан протокол HTTPS.
- В настройках подключения можно активировать режим имперсонализации данных, чтобы данные о календарях и событиях поступали от имени пользователя, чей электронный адрес указан в параметрах блока.
В параметрах блока введите домен или логин пользователя или добавьте его с помощью маппинга в поле Домен\логин.
После выполнения блок возвращает список календарей пользователя, которые можно использовать в блоке Получить события календаря.
Блок возвращает следующие поля:
Поле | Описание |
---|---|
address | Адрес |
display_name | Наименование календаря |
routing_type | Тип маршрутизации адреса, используемого для обращения к почтовому ящику пользователя |
unique_id | Уникальный идентификатор календаря |
Получить события календаря
Блок позволяет извлечь список событий календаря, полученного в блоке Получить календари.
Параметры блока:
- Идентификатор календаря (заполняется вручную или с помощью маппинга)
- Условие сбора событий (заполнить поле можно значением даты в миллисекундах или значением SyncState)
Если поле Условие сбора событий:
- Заполнить значением даты в миллисекундах, то в выходных данных отобразятся только те события, которые начинаются с этой даты. Значение даты ориентируется на время начала события. В этом случае в выходных данных отобразятся неповторяющиеся события, а повторяющиеся события разобьются на отдельные встречи. Отмененные события отображаться не будут
- Заполнить значением SyncState, то в выходных данных отобразятся все повторяющиеся, неповторяющиеся и отмененные события, которые были созданы или обновлены с момента времени последнего выполнения скрипта. Значение SyncState уникально для каждого события и опирается на дату последнего изменения события. Специально объединять новые и старые данные вручную не требуется — использование SyncState обеспечивает автоматическую актуализацию событий
Подробные инструкции по первичной синхронизации и использованию SyncState представлены ниже.
Блок выводит данные событий указанного календаря. На основе полученных данных можно создать таблицу и построить процесс.
Блок возвращает следующие поля:
Поле | Описание |
---|---|
busy | Определяет статус занятости для конкретного временного промежутка, связанного с событием в календаре. Помогает системе и другим пользователям понять, доступен ли человек или ресурс в указанное время |
end | Конец встречи |
i_cal_uid | Глобальный уникальный идентификатор календаря |
id_meeting | Идентификатор собрания |
is_all_day_event | Значение, указывающее, является ли эта встреча событием на весь день |
is_cancelled | Значение, указывающее, была ли встреча отменена |
is_meeting | Значение, указывающее, является ли встреча собранием |
is_recurring | Значение, указывающее, повторяется ли встреча |
last_modified_name | Имя пользователя, который последним изменял этот элемент |
last_modified_time | Дата и время последнего изменения этого элемента |
mailbox_type | Представляет тип почтового ящика, который представлен адресом электронной почты |
meeting_time_zone | Название часового пояса, в котором определена эта встреча |
moment_data_processing | Момент получения данных системой Proceset |
optional_attendees | Коллекция необязательных участников встречи - name — имя, связанное с адресом электронной почты- last_response_time — время последнего ответа- mailbox_type — тип почтового ящика- address — адрес электронной почты- routing_type — тип маршрутизации, связанный с адресом электронной почты |
organizer_address | Адрес организатора события |
organizer_name | Имя организатора события |
request_was_sent | Значение, указывающее, было ли уже отправлено заявление на собрание |
required_attendees | Коллекция обязательных участников встречи - name — имя, связанное с адресом электронной почты- last_response_time — время последнего ответа- mailbox_type — тип почтового ящика- address — адрес электронной почты- routing_type — тип маршрутизации, связанный с адресом электронной почты |
response | Определяет тип отклика получателя на приглашение на встречу |
routing_type | Определяет тип адреса почтового ящика |
start | Начало встречи |
subject | Имя события |
sync_state | Точка времени с получения события |
Первичная синхронизация
Первичная синхронизация выполняется при первом запуске блока Получить события календаря, когда значение параметра SyncState еще отсутствует:
- В поле Условие сбора событий укажите дату начала сбора в формате Unix-времени (в миллисекундах). Например: 1609459200000 (1 января 2021 г.). Система соберет все события, начиная с указанной даты до момента выполнения запроса. Этот шаг необходим для того, чтобы получить начальное значение SyncState, которое в дальнейшем будет использоваться для синхронизации событий. Выбор короткого диапазона (например, один день) позволяет минимизировать нагрузку на систему при первичной синхронизации.
- После успешного запроса система возвращает значение SyncState. Это уникальный идентификатор состояния синхронизации, который можно сохранить в отдельной таблице. В таблице следует сохранять идентификатор календаря (unique_id), идентификатор события (id_meeting) и соответствующий ему SyncState.
Использование параметра SyncState при повторных запусках
Параметр SyncState — это временная метка, которая автоматически генерируется сервисом Microsoft Exchange при выполнении запроса к календарю. Она позволяет исключить из результатов уже обработанные события и получить только новые или измененные с момента последней синхронизации.
Для повторного запуска скрипта необходимо подставить поле SyncState в поле Условие сбора событий. При запуске блока система проверяет наличие сохраненного SyncState:
- Если значение найдено, система вернет только новые или измененные события с момента, зафиксированного в SyncState
- Если значение не найдено, выполнение блока для этого календаря будет прекращено, и скрипт перейдет к обработке следующего календаря. Если сохраненные значения SyncState отсутствуют для всех календарей, скрипт завершит выполнение
SyncState обновляется и возвращается системой только после успешной обработки всех запрашиваемых календарей.
Если в процессе синхронизации происходит ошибка и выполнение блока прерывается, новый SyncState не формируется. В этом случае при следующем запуске будет использовано ранее сохраненное значение SyncState, что позволит загрузить данные, которые не были получены из-за прерывания.
Если в конфигурации включен режим игнорирования ошибок, блок продолжает выполнение при возникновении ошибок в отдельных календарях. В этом случае:
- Для успешно обработанных календарей события сохраняются, и их SyncState обновляется
- Для календарей с ошибками данные не сохраняются, SyncState остается прежним, а информация об ошибке записывается в лог агента автоматизации
При следующем запуске календари с ошибками будут обработаны повторно, поскольку их SyncState не был обновлен.
Преимущества использования SyncState:
- Обрабатываются только новые или измененные события, что снижает нагрузку на систему
- Учитываются только события, измененные после последнего запроса, что исключает дублирование информации
- Пользователю не требуется вручную отслеживать изменения — начальная временная метка (Unix-время) используется для первого запроса, а обновленный SyncState — для следующих запросов, что обеспечивает непрерывность и актуальность собираемых данных
Обработка событий календаря
При использовании временной метки в миллисекундах:
- Неповторяющиеся события возвращаются в обычном виде, начиная с заданной даты
- Повторяющиеся события разбиваются на отдельные встречи, что позволяет детально анализировать каждое повторение
- Отмененные события не включаются в выходные данные
При использовании SyncState:
- Если встреча не изменилась (т. е. ее
last_modified_time
осталось прежним) с момента предыдущей выгрузки, то при использовании параметра SyncState такая встреча не будет возвращена в ответе. Это позволяет избежать повторной обработки неизмененных событий. Значение самого SyncState остается прежним - Если между выгрузками в повторяющемся событии произошли изменения (например, обновились сведения о проведении встречи), в ответе будут возвращены обновленные данные этого события
- Если за период между выгрузками во встрече появилось несколько изменений, то в выходных данных будет возвращено событие с последним значением
last_modified_time
. Таким образом, промежуточные изменения не приводят к множественной выгрузке — учитывается только финальное состояние события
Режим игнорирования ошибок
Включение и выключение режима игнорирования ошибок недоступно в SAAS-версии.
Блок Получить события календаря может работать в режиме игнорирования ошибок, который позволяет продолжить выполнение скрипта, даже если отдельные календари вызывают ошибки. Если ошибка не входит в перечень перезапрашиваемых или игнорируемых, календарь, в котором она возникла, не обрабатывается. Информация об этом фиксируется в логах агента автоматизации и может быть проанализирована позднее. Остальные календари продолжают обрабатываться в штатном режиме.
Режим игнорирования ошибок можно включить и выключить в конфигурационном файле com.infomaximum.subsystem.automation.json с помощью параметра exchange_ignore_exceptions
:
- Если указано
true
— режим игнорирования ошибок включен - Если указано
false
— режим игнорирования ошибок выключен (значение по умолчанию)
После внесения изменений в конфигурацию необходимо перезапустить центральный сервер.
Если ошибка повторяется неоднократно, рекомендуется запустить скрипт в режиме игнорирования ошибок. В логах агента автоматизации будут зафиксированы ошибки и идентификаторы календарей, в которых они возникли. Эту информацию можно использовать для проведения детального анализа/ После устранения причины ошибки рекомендуется отключить режим игнорирования ошибок и перезапустить центральный сервер, чтобы вернуться к стандартному режиму работы.
Пример записи в логах агента автоматизации:
2025-04-07 12:48:50.885+0300 [00000002] [X] DEBUG c.i.s.a.b.e.e.g.AppointmentIteratorItem:64 - Exchange ignoreExceptions mode enabled. All records skipped for id:AAMkAGQ4ZGFlMTU1LWYxYzEtNGQ4Ni1iMDFjLTNmZjAxMTk2YzI4ZgAuAAAAAADfJqMIbKSgS5+alO5Y+noFAQCU/9Lman9lR5EXIo0RRpHGAAAAAAENAAA=
com.infomaximum.platform.exception.PlatformException: The folder to be synchronized could not be found.,
Где:
id
— идентификатор пропущенного календаряPlatformException
— ошибка, из-за которой был пропущен календарь
Пример использования пакета Microsoft Exchange
Чтобы получить список календарей и перенести их в базу данных, необходимо построить скрипт:
- В качестве блока-триггера выберите Планировщик и настройте расписание, когда необходимо получать список календарей и их события.
- Настройте блок Выбрать строки через SQL-запрос нужной базы данных, чтобы получить список электронных адресов пользователей (логин), календари которых необходимо получать.
- Настройте блок Получить календари. В поле Домен\логин с помощью маппинга подставьте колонку, в которой указаны почты пользователей, полученные в блоке Выбрать строки через SQL-запрос на предыдущем шаге. Обратите внимание, что при использовании символа
\
в имени домена может не пройти авторизация. Чтобы авторизация прошла, используйте только имя технической учетной записи. - Чтобы получить события календаря, настройте соответствующий блок, указав в поле Идентификатор календаря с помощью маппинга тег
unique_id
. Чтобы получить события конкретного календаря, укажите идентификатор вручную. Для этого вернитесь в выходные данные предыдущего блока и скопируйте значениеunique_id
необходимого календаря. Для первого сбора событий заполните поле Условие сбора событий временной меткой в миллисекундах. - Чтобы внести в таблицу актуальные значения SyncState, полученные в предыдущем пункте, добавьте в скрипт блок Добавить строки из нужного пакета. В поле Таблица выберите таблицу, в которую необходимо внести данные. Если потребуется добавить новую колонку, нажмите Добавить колонку.
- Протестируйте весь скрипт, нажав соответствующую кнопку в правом верхнем углу. Если скрипт успешно протестирован, опубликуйте и активируйте его.
Отправить письмо
Блок позволяет отправлять письма на указанный адрес электронной почты.
Параметры:
- Подключение (выбор существующего подключения или добавление нового)
- Адрес получателя
- Тема письма
- Сообщение (формат: Текст или HTML)
- Вложение
- Копия
- Скрытая копия
Все параметры блока, кроме подключения, можно указать с помощью маппинга.
Отправить письмо можно с адреса, указанного при настройке подключения SMTP, или из системы, выбрав блок Отправить письмо в пакете Системная почта.
Для отправки письма из пакета Системная почта необходимо настроить сервер исходящей почты.
Особенности работы блока:
- В блоке можно использовать значения только одного блока-источника. Например, перед блоком «4. Отправить письмо» есть еще 2 блока. Данные можно получить только из одного из них. Если указываются значения из обоих блоков, появляется ошибка
- Перед блоком обязательно должен быть другой. Количество отправленных писем будет зависеть от количества возвращенных записей. Например, предыдущий блок вернул 5 записей, значит, будет отправлено 5 писем
- В поле Адрес получателя можно указать нескольких пользователей текстом через запятую
Если при использовании почтового сервера mail.ru в блоке Отправить письмо возникает ошибка, несмотря на то, что все данные указаны корректно, рекомендуем в настройках подключения в поле Имя пользователя указать полный адрес электронной почты в формате username@mail.ru.
Пример:
- Добавляем блок Отправить письмо и вводим адрес получателя. Если получателей несколько, указываем все адреса в поле Адрес получателя текстом через запятую. Заполняем другие поля блока и нажимаем Тестировать.
- Когда тест завершится, письмо будет отправлено на указанные адреса.
Отправить запрос
Блок позволяет отправлять HTTP-запрос на указанный адрес.
Параметры:
- Подключение (выбор существующего подключения или добавление нового)
- URL
- Метод (GET, POST)
- Заголовок (ключ и значение)
- Тело запроса (при методе POST)
- Пакетная обработка (при методе POST, позволяет ускоренно отправлять данные)
Метод выбирается из списка, все остальные параметры могут быть заданы вручную или с помощью маппинга.
Выходные данные возвращаются только в формате JSON.
Если для выполнения запроса к сервису требуется аутентификация, настройте подключение:
- Перейдите во вкладку Подключение.
- Нажмите кнопку + Новое подключение и заполните поля:
- Название
- Имя пользователя
- Пароль
- Нажмите кнопку Создать.
Подключение также можно настроить в Панели управления рабочего пространства.
Блок поддерживает только базовую HTTP-аутентификацию.
Пример:
- Вводим URL и тестируем по нажатию кнопки Тестировать.
- Когда тест завершен, получаем выходные данные во вкладке Тест.
Запуск скрипта с помощью GraphQL-запроса
- Получите GUID скрипта и ID рабочего пространства, выполнив следующий запрос в GraphiQL:
ID пространства можно также получить в системной таблице workspace, если подключена привилегия Системные таблицы.
query{ automation{ script{ script_general(id: <id_скрипта>){ id guid workspace{ id } } } } }
- В блоке HTTP-запрос введите URL-адрес вашего сервера GraphQL с ключом API в формате https://{адрес_сервера}/graphql?api_key=ключ.
- Выберите метод POST.
- В поле Тело запроса введите запрос:
{"query":"mutation{ automation{ script{ execute_by_guid(guid:\"<полученный_GUID_скрипта\", workspace_id:<полученный_id_пространства>){ guid } } } }"}
- Нажмите Тестировать.
- Когда тест завершится, выходные данные отобразятся во вкладке Тест.
Выполнить код
Блок позволяет обрабатывать данные с помощью JS-кода.
Используйте блок, чтобы:
- Выполнять множественные/связанные HTTP-запросы
- Выгружать/загружать файлы с помощью HTTP-запросов
- Совершать математические действия над данными (переменными)
- Обрабатывать строки в JSON и фильтровать значения
Чтобы выполнить действие, введите JS-код в поле JavaScript в параметрах блока. С помощью маппинга в код можно подставить переменные.
Блок может содержать z-метод для хеширования и обработки ошибок. Возможные методы для выполнения в JS-среде:
z.base64Encode()
— производит base64-кодирование входной строки. Например:const auth = z.base64Encode(login + ':' + password);
z.base64Decode()
— производит base64-декодирование входной строки. Например:const originalText = z.base64Decode(encodedText);
z.request()
— выполняет HTTP-запрос. Ожидает на вход объект с конфигурацией запроса. Параметры:url
— адрес, куда будет отправлен запросmethod
— по умолчанию GET. Возможные значения: GET, POST, DELETE, PUTheaders
— список заголовков HTTP-запросаjsonBody/multipartBody
— тело запроса. Обязательный параметр для методов POST и PUTtimeout
— индивидуальное время ожидания ответа от сервера в миллисекундах
Запуск скрипта с помощью JS-кода
- Введите код в поле JavaScript:
const apiKey = 'ключ'; const scriptGuid = 'GUID_скрипта'; const workspaceId = 1; var resp1 = z.request({ url: 'https://адрес_сервера/graphql?api_key=' + apiKey, method: 'POST', jsonBody: '{"query":"mutation{automation{script{execute_by_guid(guid:\\"' + scriptGuid + '\\", workspace_id:' + workspaceId + '){guid}}}}"}' }); const app = { output: () => ({ resp_1_body: JSON.stringify(resp1.response), resp_1_header: JSON.stringify(resp1.headers), resp_1_status: resp1.status, ["var-with-hard-name-1"]: resp1.headers.date, ["var-with-hard-name-2"]: resp1.headers["cache-control"], content_type: resp1.headers["content-type"], content_length: resp1.headers["content-length"] } ) }
- Нажмите Тестировать.
- Когда тест завершится, выходные данные отобразятся во вкладке Тест.
Получение файла с Jira
- Введите код в поле JavaScript:
const login = 'логин'; const password = 'пароль'; const auth = z.base64Encode(login + ':' + password); var resp1 = z.request({ url: 'https://jira.office.infomaximum.com/secure/attachment/76158/Screenshot_1.jpg', method: 'GET', headers: { Authorization: 'Basic ' + auth } }); const app = { output: () => ({ resp_1_body: JSON.stringify(resp1.response), resp_1_header: JSON.stringify(resp1.headers), resp_1_status: resp1.status, file_content: resp1.response, ["var-with-hard-name-1"]: resp1.headers.date, ["var-with-hard-name-2"]: resp1.headers["cache-control"], content_type: resp1.headers["content-type"], content_length: resp1.headers["content-length"] } ) }
- Нажмите Тестировать.
- Когда тест завершится, выходные данные отобразятся во вкладке Тест.
Была ли статья полезна?