Пользовательские действия

Действия Frame.io обеспечивают быстрый доступ к часто используемым операциям с медиафайлами, таким как загрузка, переименование и дублирование элементов, а также позволяют осуществлять интеграцию со сторонними инструментами и сервисами прямо в пользовательском интерфейсе Frame.io.

О действиях

С появлением функции «Пользовательские действия» разработчики могут настраивать собственные действия и управлять ими в Frame.io V4. Используя ту же базовую систему событий, что и веб-перехватчики, пользовательские действия предоставляют разработчикам альтернативный механизм для связывания своих ресурсов с наиболее важными для пользователей инструментами в их учетной записи Frame.io.

Действия может выполнять любой пользователь, являющийся участником рабочей среды Frame.io, в которой это действие включено. При выполнении действия Frame.io отправляет полезную нагрузку на указанный вами URL-адрес. Принимающее приложение отвечает кодом состояния HTTP для подтверждения получения или специальным обратным вызовом для рендеринга дополнительных полей формы в интерфейсе Frame.io. В качестве принимающего приложения может выступать как ваша собственная размещенная на сервере программа, так и сторонний сервис или даже малокодовый/бескодовый инструмент IPaaS, например Workfront Fusion или Zapier.

Используйте пользовательские действия для создания интеграций непосредственно в Frame.io в качестве программируемых компонентов интерфейса. Это позволяет получить рабочие процессы, запускаемые пользователями в приложении, используя ту же базовую систему маршрутизации событий, что и веб-перехватчики. Вы можете создавать запускаемые пользователями одно- или многошаговые формы, которые возвращаются в Frame.io в виде новой формы или базового ответа. Когда пользователь нажимает пользовательское действие для ресурса, Frame.io отправляет полезную нагрузку на указанный вами URL-адрес. Принимающее приложение отвечает кодом состояния HTTP для подтверждения получения или специальным обратным вызовом для рендеринга дополнительных элементов интерфейса в Frame.io.

Улучшение действий в версии V4

Опираясь на опыт пользователей нашей предыдущей версии, мы внесли ряд улучшений в набор функций «Действия» в Frame.io V4.

Новые типы полей

Если раньше поддерживались только текстовые поля и поля с возможностью выбора одного варианта, то теперь мы добавили возможность множественного выбора, текстовые области (для более объемных текстовых полей) и логические поля (в виде переключателя).

Гиперссылки

Текстовые поля неудобны для копирования и вставки URL-адресов. Используйте наше новое поле для ссылок, чтобы копировать их всего одним нажатием.

Динамические модальные окна

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

Действия, направленные на множество ресурсов

Настройте свое действие так, чтобы оно применялось сразу к множеству объектов (до 100 ресурсов в одном запросе).


НОВОЕ

Различные типы ресурсов

Действия не ограничиваются только одним типом ресурсов — их можно запускать одновременно для комбинации файлов, папок и стеков версий.

Форма обратной связи в приложении

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

Перенесенные действия

При переносе в версию Frame.io V4 учетной записи с пользовательскими действиями, созданными в предыдущей версии Frame.io, следует учесть несколько моментов.

Статус действий

После переноса учетной записи в Frame.io V4 все пользовательские действия, созданные в более ранних версиях, получат статус null и будут автоматически отключены. Это дает пользователям возможность сначала обновить свои действия для работы с API-интерфейсом V4 перед их включением, любые необновленные действия будут завершаться ошибкой. Чтобы определить действия, имеющие этот статус, перейдите на страницу настроек действий и посмотрите их состояние в столбце «Статус» или, если вы используете API-интерфейс, проверьте поле is_active.

Доступные для действий ресурсы: файлы, папки и стеки версий

Учитывая разделение типов ресурсов в API-интерфейсе Frame.io V4, следует учитывать логику поведения при интерпретации идентификатора ресурса, полученного в полезной нагрузке вашего действия. Логика для отдельных файлов предельно проста: идентификатор будет указывать на конкретный файл, для которого было выполнено действие. Аналогично и для папок — вы получите идентификатор той папки, для которой было выполнено действие. Однако, в зависимости от сценария использования, есть несколько вариантов при определении поведения вашего действия. Используйте идентификатор папки для выполнения последующих вызовов к API-интерфейсу Frame.io, если хотите взаимодействовать с самим ресурсом папки. В качестве альтернативы можно получить дочерние элементы этой папки для выполнения дальнейшей обработки ресурсов внутри нее. Когда действие выполняется для стека версий, ваша полезная нагрузка будет содержать идентификатор «головного ресурса» — файла, который находится на самом верху стека и отображается в интерфейсе.

Подробнее о различиях между предыдущей версией API-интерфейса Frame.io и версией V4 — в нашем руководстве по миграции.

Настройте пользовательские действия с помощью API-интерфейса.

Для пользовательского действия требуются следующие поля.

Название поляОписание
ИмяНазвание, которое вы выбираете для пользовательского действия. Оно будет отображаться в меню доступных пользовательских действий в Frame.io.
ОписаниеОбъяснение того, что делает это действие, для справки (описание не будет отображаться в веб-приложении Frame.io).
СобытиеВнутренний ключ события для различения стандартных событий веб-перехватчика и ваших собственных.
URL-адресАдрес, на который будут отправляться события.
Рабочая средаРабочая среда, которая будет использовать это пользовательское действие.

Настройка пользовательского действия

Когда пользователь запускает пользовательское действие, Frame.io отправляет полезную нагрузку на указанный вами URL-адрес. Принимающее приложение отвечает кодом состояния HTTP для подтверждения получения или специальным обратным вызовом для рендеринга дополнительных элементов интерфейса в Frame.io.

Чтобы создавать пользовательские действия для рабочей среды, требуются разрешения администратора учетной записи. Попросите администратора изменить ваши разрешения, если у вас нет доступа.

Настройка работы с множеством ресурсов

Поддержка множества ресурсов задается в настройках и должна быть прямо включена в модальном окне настроек действия в веб-версии. Это можно сделать как при создании нового действия, так и при обновлении уже существующего. 

При включении поддержки множества ресурсов формат полезной нагрузки сразу переключается. Предыдущий формат полезной нагрузки и формат с поддержкой множества ресурсов являются взаимоисключающими.

Полезная нагрузка от Frame.io

Когда пользователь нажимает ваше пользовательское действие, полезная нагрузка отправляется на URL-адрес, указанный вами в поле URL. Используйте эту полезную нагрузку для определения следующего.

Контекст действия
  • Какое пользовательское действие было нажато

  • Какие ресурсы были нажаты

  • Какой пользователь выполнил действие

  • Какой тип события был запущен

Контекст организации
  • Какая учетная запись связана с пользовательским действием

  • Какая рабочая среда связана с пользовательским действием

  • Какой проект содержит ресурс или ресурсы

Изначально пользовательские действия принимали только один ресурс на запрос, используя объект resource, содержащий один ресурс. При включенной поддержке множества ресурсов полезная нагрузка использует список resources, включающий один или множество ресурсов (максимум 100 ресурсов в одном запросе).

1 POST /your/url
2 {
3 "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504",
4 "action_id": "0aeb9feb-f8eb-4100-a8c2-b39b66d354ab",
5 "data": {
6 "description": "Pretty cool video.",
7 "title": "Hey there!"
8 },
9 "interaction_id": "985559de-865a-40e5-a687-2bbed4497eaa",
10 "project": {
11 "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea"
12 },
13 "resources": [
14 {
15 "id": "fe41c5a8-1b8d-417d-a7df-0b88bc19b476",
16 "type": "file"
17 },
18 {
19 "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39",
20 "type": "file"
21 }
22 ],
23 "type": "some.event",
24 "user": {
25 "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935"
26 },
27 "workspace": {
28 "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f"
29 }
30 }
1 POST /your/url
2 {
3 "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504",
4 "action_id": "0e38b93a-9f10-4bc7-90bc-bd07a16e510a",
5 "data": {
6 "description": "Wow look at this.",
7 "title": "Hey there!!"
8 },
9 "interaction_id": "dff6d369-7150-41f9-8e6f-4f0895f6b416",
10 "project": {
11 "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea"
12 },
13 "resource": {
14 "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39",
15 "type": "file"
16 },
17 "type": "some.event",
18 "user": {
19 "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935"
20 },
21 "workspace": {
22 "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f"
23 }
24 }

Переход с устаревшей полезной нагрузки

Планируется прекращение поддержки устаревшей полезной нагрузки

Планируется прекращение поддержки устаревшей полезной нагрузки, поэтому пользователям настоятельно рекомендуется перевести свои сервисы на обработку нового формата данных.

Включение конфигурационного флага и обновление логики обработки полезной нагрузки позволят действию легко перейти на поддержку множества ресурсов.

  1. Замените использование одиночного объекта resource на список resources. 2. Обновите код для итерации по списку resources.

  2. Включите флаг множества ресурсов в конфигурации действий.

Название поляОписание
account_idУникальный идентификатор учетной записи действия.
action_idУникальный идентификатор действия.
interaction_idУникальный идентификатор, созданный Frame.io для отслеживания транзакции в разных запросах, например в цепочках обратных вызовов сообщений или форм. Остается неизменным на протяжении всей последовательности выполнения действия.
project_idУникальный идентификатор проекта действия.
resource.idИдентификатор ресурса, из которого запущено действие.
resource.typeТип ресурса, из которого запущено действие.
typeИмя, указанное в поле event при настройке действия.
user.idИдентификатор пользователя, который запустил действие.
workspace.idИдентификатор рабочей среды, использующей действие.
dataПары ключ-значение, содержащие названия полей формы и значения, выбранные пользователем. Ваше приложение получает эти данные, чтобы определить, какие именно варианты были выбраны.

Взаимодействия, повторные попытки и таймауты

interaction_id — это уникальный идентификатор для отслеживания взаимодействия по мере его развития. Если вам не нужно отвечать пользователю, просто верните код состояния 200, и все готово. Хотя это необязательно, мы рекомендуем включить информацию о результате действия, например сообщение о выполнении или предупреждение об ошибке. Пользовательские действия поддерживают обратные вызовы сообщений.

Frame.io ожидает ответ менее чем за 10 секунд и совершает до 5 повторных попыток в ожидании ответа. В идеале ответ должен быть мгновенным, а асинхронные действия должны выполняться после запуска через пользовательское действие.

Создание обратного вызова для сообщений

В своем ответе HTTP на событие веб-перехватчика можно вернуть объект JSON с описанием сообщения, которое отобразится запустившему действие пользователю в интерфейсе Frame.io.

1{
2 "title": "Success!",
3 "description": "The thing worked! Nice."
4}

Сообщения позволяют отправлять обратную связь пользователю непосредственно в интерфейсе Frame.io. Если вам нужно собрать дополнительную информацию от пользователя, используйте вместо них обратные вызовы форм.

Создание обратного вызова для форм

Допустим, вам требуется получить больше информации перед началом процесса. Например, вы добавляете контент в систему, которая требует ввода дополнительных данных. В таком случае вы можете описать форму в своем ответе — пользователь заполнит ее и отправит обратно вам. Пример

1{
2 "title": "Need some more info!",
3 "description": "Getting ready to submit this file!",
4 "fields": [
5 {
6 "type": "text",
7 "label": "Title",
8 "name": "title",
9 "value": "MyVideo.mp4"
10 },
11 {
12 "type": "select",
13 "label": "Captions",
14 "name": "captions",
15 "options": [
16 {
17 "name": "Off",
18 "value": "off"
19 },
20 {
21 "name": "On",
22 "value": "on"
23 }
24 ]
25 }
26 ]
27}

Когда пользователь отправит форму, вы получите событие по тому же URL-адресу, что и в исходном запросе POST.

1POST /your/url
2{
3 "type": "your-specified-event-name",
4 "interaction_id": "the-same-id-as-before",
5 "action_id": "unique-id-for-this-custom-action",
6 "data":{
7 "title": "MyVideo.mp4",
8 "captions": "off"
9 }
10}

Все пользовательские поля, добавленные в форму, отображаются в разделе data полезной нагрузки JSON, которая отправляется Frame.io. Используйте interaction_id для сопоставления исходного запроса с этими новыми данными формы. Вы можете ответить сообщением или вызвать другую форму в цепочке. Связывая в цепочку действия, формы и сообщения, можно эффективно программировать многоэтапные рабочие процессы в Frame.io с бизнес-логикой из внешней системы.

Сведения о форме

Как и сообщения, формы поддерживают атрибуты title и description, которые отображаются в верхней части формы. Помимо этого, каждое поле формы принимает следующие базовые атрибуты.

Свойства поля
  • type — указывает пользовательскому интерфейсу Frame.io, какой тип данных ожидать и рендеринг какого компонента выполнять. * label — отображается в пользовательском интерфейсе как заголовок над полем.
Данные поля
  • name — ключ, по которому поле будет идентифицироваться в последующей полезной нагрузке. * value — значение для предварительного заполнения поля.

Поддерживаемые типы полей

Текстовое поле

Простое текстовое поле без дополнительных параметров.

1{
2 "type": "text",
3 "label": "Title",
4 "name": "title",
5 "value": "MyVideo.mp4"
6}

Текстовая область

Простая текстовая область без дополнительных параметров.

1{
2 "type": "textarea",
3 "label": "Description",
4 "name": "description",
5 "value": "This video is really, really popular."
6}

Список выбора

Определяет список вариантов, из которых пользователь может выбирать. Должен включать в себя массив вариантов options. Каждый элемент этого массива должен содержать легко читаемое человеком имя name и считываемое машиной значение value.

1{
2 "type": "select",
3 "label": "Captions",
4 "name": "captions",
5 "value": "off",
6 "options": [
7 {
8 "name": "Off",
9 "value": "off"
10 },
11 {
12 "name": "On",
13 "value": "on"
14 }
15 ]
16}

Флажок

Простой флажок без дополнительных параметров.

1{
2 "type": "boolean",
3 "name": "enabled",
4 "label": "Enabled",
5 "value": "false"
6}

Ссылка

Простая ссылка без дополнительных параметров.

1{
2 "type": "link",
3 "name": "videoLink",
4 "label": "Video Link",
5 "value": "https://www.youtube.com/watch?v=XtX1zv9CEVc"
6}

Модель разрешений Frame.io

Пользовательские действия имеют специальную модель разрешений: они принадлежат рабочей среде, а не конкретному пользователю, существующему в учетной записи. Это означает следующее.

Создание и управление
  • Любой администратор может создать пользовательское действие в рабочей среде.

  • Любой администратор может изменить или удалить пользовательское действие, существующее в команде.

Обновления в реальном времени
  • Как только будут внесены изменения, все пользователи сразу же увидят результат обновления.

Безопасность и проверка

По умолчанию для всех пользовательских действий генерируется ключ подписи при их создании. Эту установку нельзя изменить. Данный ключ можно использовать для проверки того, действительно ли запрос исходит от Frame.io. В запрос POST включается следующее.

ИмяОписание
X-Frameio-Request-TimestampВремя запуска пользовательского действия.
X-Frameio-SignatureВычисленная подпись.
Проверка временной метки

Временная метка указывает время, когда запрос был подписан при отправке из сети Frame.io. Можно использовать для предотвращения атак повторного воспроизведения. Мы рекомендуем проверять, чтобы это время отличалось от локального времени не более чем на 5 минут.

Проверка подписи

Подпись — это хеш HMAC SHA-256, использующий ключ подписи, предоставленный при первом создании пользовательского действия.

Проверка подписи

1

Извлечение подписи

Извлеките подпись из заголовков HTTP.

2

Создание сообщения для подписи

Создайте сообщение для подписи, объединив версию, время доставки и тело запроса в формате v0:timestamp:body.

3

Вычисление HMAC SHA256

Вычислите подпись HMAC SHA256 с помощью вашего секретного ключа подписи.

4

Сравнение подписей

Сравните вычисленную вами подпись с той, которая была предоставлена.

Предоставленная подпись имеет префикс v0=. В настоящее время в Frame.io существует только одна версия для подписи запросов. Необходимо добавить этот префикс к вычисленной вами подписи.

Python
1import hmac
2import hashlib
3
4def verify_signature(curr_time, req_time, signature, body, secret):
5 """
6 Verify webhook/custom action signature
7 :Args:
8 curr_time (float): Current epoch time
9 req_time (float): Request epoch time
10 signature (str): Signature provided by the frame.io API for the given request
11 body (str): Custom Action body from the received POST
12 secret (str): The secret for this Custom Action that you saved when you first created it
13 """
14 if int(curr_time) - int(req_time) < 500:
15 message = 'v0:{}:{}'.format(req_time, body)
16 calculated_signature = 'v0={}'.format(hmac.new(
17 bytes(secret, 'latin-1'),
18 msg=bytes(message, 'latin-1'),
19 digestmod=hashlib.sha256).hexdigest())
20 if calculated_signature == signature:
21 return True
22 return False

Обратная связь

Мы будем рады узнать от разработчиков и пользователей, как вы бы хотели использовать действия в Frame.io V4. Обязательно делитесь с нами своими вопросами, идеями и сценариями использования, чтобы мы могли правильно определить приоритеты.