Обзор пользовательских действий

Примеры приложений

Если вы хотите создать собственное приложение с пользовательскими действиями, наши примеры приложений помогут вам начать работу:

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

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

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

Проверка разрешений

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

Пользовательские действия можно настроить в области Пользовательские действия на developer.frame.io. Для действия требуется:

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

Нажмите «Содержимое полезной нагрузки Frame.io»

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

1POST /your/url
2{
3 "action_id": "2444cccc-7777-4a11-8ddd-05aa45bb956b",
4 "interaction_id": "aafa3qq2-c1f6-4111-92b2-4aa64277c33f",
5 "project": {
6 "id": "a7d6a74b-d45d-4019-9069-24651e0b9f64"
7 },
8 "resource": {
9 "id": "9q2e5555-3a22-44dd-888a-abbb72c3333b",
10 "type": "asset"
11 },
12 "team": {
13 "id": "54353cd2-c6ee-4aa1-954a-ce9e19602aa9"
14 },
15 "type": "my.action",
16 "user": {
17 "id": "fb57eee0-79f2-4bc7-9b70-99fbc175175c"
18 }
19}

Эту полезную нагрузку можно использовать для определения следующего:

  • Какое из ваших пользовательских действий нажато
  • Какой ресурс нажат
  • Какой пользователь выполнил действие
Имя поляОписание
action_idУникальный идентификатор этого действия. Он всегда будет одинаковым для данного действия.
interaction_idЭто уникальный идентификатор, созданный Frame.io, который можно использовать для отслеживания транзакции. Этот идентификатор будет одинаковым на протяжении всей последовательности действия, включая формы обратного вызова.
типНазвание события, введенное в поле Event при настройке действия.
resource.idИдентификатор ресурса, из которого вы запустили действие (обычно ресурс).
resource.typeТип ресурса, из которого вы запустили действие (обычно ресурс)
О взаимодействиях

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

Повторные попытки и таймауты

Наше приложение ожидает ответ менее чем за 5 секунд и будет повторять попытки до 5 раз в ожидании ответа. Лучше всего отвечать незамедлительно и выполнять любые действия асинхронно после запуска через пользовательское действие.

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

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

Пример объекта:

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

Для пользователя отобразится предупреждение, которое выглядит так:

actions-3

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

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

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

Допустим, требуется дополнительная информация, прежде чем начать процесс. Например, можно добавлять контент в систему, которая требует дополнительных сведений и настроек. Можно «описать» в своем ответе форму, которую пользователь действительно увидит! И заполнит! И она будет отправлена прямо вам!

Вот пример формы, которая будет выполнять рендеринг формы в пользовательском интерфейсе 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}
actions-form

Когда пользователь отправит форму, вы получите событие по тому же 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 с бизнес-логикой из внешней системы.

Проявите фантазию!Нет никаких ограничений.

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

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

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

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

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

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

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}

Select list Defines a picklist that the user can choose from. Must include an options list, each member of which should include a human-readable name, and a machine-parseable 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
3
4
5
6"type": select",
7
8
9
10
11"label": "Captions",
12
13
14
15
16"name": "captions",
17
18
19
20
21"value": "off",
22
23
24
25
26"options": [
27
28
29
30
31{
32
33
34
35
36"name": "Off",
37
38
39
40
41"value": "off"
42
43
44
45
46},
47
48
49
50
51{
52
53
54
55
56"name": "On",
57
58
59
60
61"value": "on"
62
63
64
65
66}
67
68
69
70
71]
72
73
74
75
76}

Пользовательские действия и модель разрешений Frame.io

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

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

Безопасность

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

Проверка

В запрос POST включается следующее:

ИмяОписание
X-Frameio-Request-TimestampВремя запуска пользовательского действия.
X-Frameio-SignatureВычисленная подпись
Метка времени — это время подписи запроса на выходе из сети Frame.io. Можно использовать для предотвращения атак повторного воспроизведения. Мы рекомендуем проверять, чтобы это время отличалось от локального времени не более чем на 5 минут. Подпись — это хеш HMAC SHA-256, использующий ключ подписи, предоставленный при первом создании пользовательского действия.

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

  1. Извлечение подписи из заголовков HTTP
  2. Создайте сообщение для подписи путем объединения версии, времени доставки и тела запроса
  • v0:timestamp:body
  1. Вычислите подпись HMAC SHA256 с помощью вашего секретного ключа подписи.

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

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