Отправляйте запросы к API Discourse с помощью Zapier

Запросы к API Discourse можно автоматизировать, создав Zap, в котором в качестве действия используется вебхук Zapier. В этой теме описывается, как выполнять запросы для следующих действий:

  • добавление пользователя в группу
  • выдача пользовательского значка

Чтобы узнать, как выполнять другие типы запросов к API с помощью Zapier, прочитайте эту тему, а затем найдите в документации API Discourse действие, которое вы хотите выполнить. Также вы можете узнать, как создать запрос API для конкретного действия, прочитав статью Reverse engineer the Discourse API.

Настройка шага триггера

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

Чтобы настроить шаг действия, перейдите в панель управления Zapier и нажмите кнопку «Make a Zap» (Создать Zap). Откроется форма поиска, в которой вам предложат выбрать приложение-триггер.

В примерах этой темы в качестве шага действия используется событие «Новый пользователь» в WordPress. Это связано с тем, что его легко настроить для тестирования вызовов API.

Узел «Test This Step» (Протестировать этот шаг) на шаге триггера позволяет выбрать образец данных из вашего приложения-триггера, которые будут переданы в шаг действия вашего Zap. Эти данные пригодятся при настройке шага действия.

Добавление необязательного шага для получения данных из Discourse

В зависимости от того, какие данные передаются из вашего приложения-триггера, вам может потребоваться получить некоторые данные из Discourse перед выполнением окончательного запроса к API. Например, триггер «Новый пользователь» в WordPress передает имя пользователя WordPress и адрес электронной почты пользователя. Я знаю, что адрес электронной почты совпадет с адресом электронной почты пользователя в Discourse, но для запросов API в этом примере мне нужно знать имя пользователя в Discourse.

Чтобы получить данные пользователя Discourse по его адресу электронной почты, добавьте в Zap шаг действия. В меню действий вебхука выберите «GET».

На шаге редактирования шаблона вебхука введите базовый URL вашего сайта Discourse, за которым следует /admin/users/list/all.json, в поле URL. Например, базовый URL моего сайта — https://demo.scossar.com, поэтому я ввожу https://demo.scossar.com/admin/users/list/all.json в поле URL.

В разделе «Query String Params» (Параметры строки запроса) введите «email» в качестве ключа, затем нажмите значок «Insert a Field» (Вставить поле), чтобы открыть выпадающее меню. Выберите значение, переданное шагом триггера, которое содержит адрес электронной почты пользователя.

Аутентификация запроса

Прокрутите форму вниз до раздела Headers (Заголовки). Этот раздел используется для аутентификации запроса. Он требует трех пар ключ/значение:

  • Api-Username: имя пользователя администратора на вашем сайте. В большинстве случаев хорошим выбором будет пользователь «system».
  • Api-Key: ключ API, связанный с именем пользователя, которое вы указали в первой паре ключ/значение.
  • Content-Type: multipart/form-data

Заполненный раздел Headers должен выглядеть примерно так, но с вашим ключом API:

Нажмите кнопку Continue (Продолжить), чтобы увидеть данные, полученные из Discourse для этого запроса.

Добавление окончательного шага действия

После настройки шага триггера и необязательного шага для получения данных из Discourse нажмите ссылку «Add a Step» (Добавить шаг) и выберите «Webhooks by Zapier» в меню действий. Затем вам будет предложено выбрать метод запроса, который вы хотите использовать в запросе API к Discourse.

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

  • добавление пользователя в группу: PUT
  • выдача пользовательского значка: POST

Чтобы настроить запросы API, отличные от примеров в этой теме, ознакомьтесь с документацией API Discourse, чтобы узнать, есть ли пример запрашиваемого вами действия. Если вы не найдете пример там, прочитайте статью Как реверс-инжинирить API Discourse, чтобы узнать, как найти URL и метод запроса для желаемого действия. После того как вы найдете метод запроса, выберите его в меню действий.

Примечание: если ваш запрос использует метод DELETE, выберите в меню действий «Custom Request» (Пользовательский запрос).

Настройка окончательного шага действия

Раздел Headers действия можно настроить одинаковым образом для всех запросов API. Подробную информацию см. в разделе «Аутентификация запроса» этой темы. Если вы добавили необязательный шаг для получения данных из Discourse, вы можете настроить раздел Headers окончательного действия точно так же, как и для этого шага.

После добавления пар ключ/значение в заголовки вам нужно заполнить поля URL и Data формы для вашего запроса API.

Добавление пользователя в группу

Чтобы добавить пользователя в группу, выполняется запрос PUT к /groups/<group_id>/members.json. Самый простой способ найти ID группы — перейти на страницу группы через интерфейс Discourse, а затем добавить .json в конец URL в адресной строке браузера. Например, на моем сайте есть группа «support» по адресу https://demo.scossar.com/g/support. Перейдя по адресу https://demo.scossar.com/g/support.json, я вижу, что ID группы равен 41. Базовый URL моего форума — https://demo.scossar.com. URL в моем окончательном шаге действия для добавления пользователей в группу устанавливается как https://demo.scossar.com/groups/41/members.json.

Для запроса на добавление пользователей в группу требуется один параметр — список имен пользователей через запятую. В разделе Data формы введите «usernames» в качестве ключа. Затем нажмите значок «Insert a Field» (Вставить поле), чтобы найти свойство имени пользователя, переданное либо триггером, либо необязательным шагом действия GET.

В моем случае мне нужно имя пользователя, полученное на шаге GET, поэтому я раскрываю меню «GET» и выбираю Username (Имя пользователя) из выпадающего списка.

Все остальные разделы формы можно оставить со значениями по умолчанию.

Нажмите кнопку Continue (Продолжить), а затем протестируйте шаг. Если пользователь, переданный через предыдущие шаги, существует на вашем сайте Discourse и еще не является участником выбранной вами группы, он должен быть добавлен в группу при тестировании шага.

Если все работает как ожидалось, включите ваш Zap.

Выдача пользовательского значка

Чтобы выдать пользовательский значок пользователю, выполняется запрос POST к базовому URL вашего форума + /user_badges. Для моего сайта URL для выдачи значков — https://demo.scossar.com/user_badges. Заполненное поле URL в Zapier выглядит следующим образом:

Раздел Data формы требует двух пар ключ/значение. Добавьте ключ «username» и установите его в поле, возвращающее имя пользователя. Добавьте ключ «badge_id» и установите его в ID значка, который вы хотите выдать. Вы можете найти ID значка, перейдя на страницу Администрирование / Значки и выбрав значок в меню слева. Вы увидите ID значка как последнее значение URL в адресной строке браузера.

Значок, который я выдаю, имеет ID 105, поэтому заполненный раздел Data выглядит следующим образом:

Убедитесь, что вы настроили раздел Headers формы, затем нажмите Continue (Продолжить). После этого нажмите кнопку Send Test (Отправить тест), чтобы протестировать ваш Zap. Пользователь, переданный через предыдущие шаги, должен получить значок.

Если все работает правильно, включите Zap.

15 лайков

Можно ли использовать этот рабочий процесс для автоматического создания учетной записи нового пользователя и добавления его в определенную группу Discourse?

В данном случае речь идет о том, что кто-то покупает обучающий продукт, и я хочу автоматически добавить этого человека в соответствующий подфорум Discourse для этого продукта.

Я могу передать данные о новом клиенте в Zapier, но стандартный интеграционный модуль (Zap) для Discourse не поддерживает создание учетных записей — просто интересно, можно ли это сделать через API и ссылку веб-хука, как вы описываете в этом примере.

Спасибо!

2 лайка

Самый простой способ — отправить приглашение по электронной почте пользователю после покупки. Вы можете настроить приглашение так, чтобы пользователь автоматически добавлялся в группу Discourse при принятии приглашения. Подробнее см. по ссылке: Automate sending Discourse invite emails with Zapier.

Если отправка приглашений для вас не подходит, можно использовать вебхук Zapier для создания пользователя в Discourse. В документации Discourse API Docs подробно описан запрос на создание пользователя.

8 лайков

Спасибо, @simon, я попробую пригласение по электронной почте. Безусловно, некоторые люди не получат его/не найдут/не откроют, но это, безусловно, более простой вариант.

Также благодарю за быстрый ответ!

Часто проще, чтобы API-вызовы к Discourse делало само приложение, продающее товар.

1 лайк

Есть ли причина, почему это работает у меня в Zapier, но при попытке выполнить собственный запрос fetch я получаю пустой ответ?

Я использую ObservableHQ, но суть та же. Разве это не должно работать?

fetch("https://mycommunity.com/g.json", {
  headers: {
    "Content-Type": "multipart/form-data",
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
  method: "GET",
  mode: "no-cors"
})

Смогли ли вы выполнить какие-либо API-запросы к Discourse с ObservableHQ, используя вызовы в этом формате? Похоже, что в формате запроса есть ошибка.

Вы также можете проверить запросы, выполнив вызовы curl из терминала или используя Postman.

1 лайк

Хорошо, я понял, что нужно сделать:

  1. Установить cors-anywhere локально и запустить сервер.
  2. Изменить запрос, добавив обратный прокси перед конечной точкой API, и вызвать метод json у объекта Fetch Response:
await (fetch("http://localhost:8080/mycommunity.com/g.json", {
  headers: {
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
})).json()
2 лайка

Оставляю это здесь, возможно, стоит посмотреть:

2 лайка

Привет, @simon, спасибо за эту инструкцию. Я настраиваю это в Zapier, но на моём форуме нет такого URL для выдачи значков.

Подскажите, это не стандартный URL для всех установок Discourse, или адрес мог измениться в недавнем обновлении?

Он должен быть. Однако это не URL, который можно открыть через интерфейс пользователя Discourse. Я только что перепроверил маршрут на своём сайте, следуя шагам, описанным здесь: Как провести реверс-инжиниринг API Discourse. Исходя из этого, похоже, что детали, приведённые в теме, всё ещё актуальны.

2 лайка

Это, как и следовало ожидать, была моя собственная ошибка.

1 лайк