Создание пользователя Discourse через запрос Zapier

Я пытаюсь создать активного пользователя через API.

Это работает из curl:

curl -X POST "https://community.co/users.json" -H "Api-Key: $API_KEY" -H "Api-Username: system" -H "Content-Type: multipart/form-data" -F "name=XXXXApp Tester" -F "email=XXXapptester2@example.com" -F "username=XXXapptester21" -F "active=true" -F "approved=true" -F "password=simplepass"

Когда я делаю тот же вызов из Zapier (я вижу, что Parameters в production.log выглядят одинаково), в логах появляется следующее:

Filter chain halted as :respond_to_suspicious_request rendered or redirected

И ничего не происходит.

Есть ли способ обойти это?

  def suspicious?(params)
    return false if current_user && is_api? && current_user.admin?
    honeypot_or_challenge_fails?(params) || SiteSetting.invite_only?
  end

Я предполагаю, что ошибка возникает в is_api?. Просматривая код, я не вижу очевидной причины, по которой это должно было бы не работать с запросом от Zapier, но я также не вижу других мест, где могла бы возникнуть ошибка.

Меня это интересует, потому что несколько недель назад кто-то спрашивал меня о той же проблеме с созданием пользователей через Zapier.

Моя другая мысль заключается в том, что Zapier неправильно передает ключ API, но, думаю, в таком случае я получил бы другую ошибку.

Думаю, это тот же человек. :slight_smile:

Да. Я удивлен, что это не работает, но хотя бы теперь я знаю, что проблема не только у меня.

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

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

Я подозреваю, что проблема связана с тем, как вы формируете запрос в Zapier. Используя действие Webhooks by Zapier, попробуйте следующее:

Выберите «POST» в качестве события. Затем:

URL: <https://forum.example.com/users.json>

Тип полезной нагрузки (Payload Type): «json»

Данные:

  • name: <полное имя пользователя> (в документации указано как обязательное, но, вероятно, можно опустить)
  • username: имя пользователя
  • email: адрес электронной почты пользователя
  • password: пароль, соответствующий требованиям вашего сайта
  • active: "true" (в кавычках)
  • approved: "true" (в кавычках)

Заполните раздел Headers, добавив свой Api-Key и Api-Username (я пробовал это только с system в качестве Api-Username).

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

Вот несколько скриншотов с тестовыми данными:

У меня это работает. Если у вас не получается, проверьте ещё одно: убедитесь, что на вашем сайте Discourse не включена настройка invite only (только по приглашениям).

Чтобы проверить возможность работы, я также создал собственную интеграцию с помощью Zapier CLI для создания новых пользователей. Если команда Discourse захочет, это действие можно добавить в официальный плагин Zap для Discourse. Однако, думаю, что добавление действия для создания пользователей не является приоритетом. Мне кажется, что такие запросы, как создание приглашения или приостановка пользователя, поступают гораздо чаще.

Заметки по результатам дополнительных тестов:

  • Тип полезной нагрузки (Payload Type) можно установить как «json», так и «form». Для установки пользовательских полей в запросе тип полезной нагрузки должен быть установлен в «form».

  • Поля типа Multiselect вызывают некоторые трудности. Zapier не разрешает дублирование ключей в разделе Data. Возможно, пользовательские поля типа Multiselect можно установить с помощью действия Zapier «Custom Request».

  • Значения параметров active и approved не обязательно заключать в кавычки.

@simon Спасибо! У меня получилось! Твой скриншот помог мне разобраться с проблемами в том, как Zapier создаёт поля данных. Он делал что-то странное, но я, по сути, не понимал, как форматировать и сопоставлять данные для Airtable. Мне нужно наладить сквозную автоматизацию, но создание пользователя точно сработало.

к сведению @pfaffman

Привет, @simon — ещё раз спасибо за помощь с форматированием. Сейчас я пытаюсь добавить несколько пользовательских полей в профиль пользователя и проверить, сможет ли Zapier заполнить их при создании нового пользователя в Discourse. Похоже, это приводит к сбою всего запроса, и я получаю сообщение: «Вы не заполнили все обязательные поля пользователя». Я нашёл этот пост, поэтому попробовал переключиться с JSON на форму, но это тоже не сработало. Есть ли какие-либо советы по форматированию пользовательских полей профиля? Спасибо!

Изменение типа полезной нагрузки на “form” работает у меня:

Однако этот подход не сработает для полей выпадающего списка с множественным выбором. Для такого типа полей, думаю, вам придется использовать действие “Custom Request”. Возможно, потребуется немного поэкспериментировать, чтобы заставить это работать.

Вау — вы настоящий великий магистр Zapier и Discourse. Изменил красную стрелку, и всё заработало с первого раза. Я указал название поля, но, конечно, это бессмысленно, так как система не может знать это «наверху». Значит, для каждого нового поля, которое я создаю, достаточно использовать [#], и они будут автоматически сопоставлены по порядку? Я планирую создать несколько — может быть, около 10. Также всё работало нормально, хотя моё тестовое поле было выпадающим списком — возможно, потому что данные просто подтягиваются из Airtable?

На самом деле я не проводил полноценное сквозное тестирование. Я протестировал только зеп, и он сработал на выпадающем поле.

Да, просто укажите id поля в []. Вы можете получить id поля, загрузив JSON-версию вашей страницы «Администрирование / Настройка / Пользовательские поля» (/admin/customize/user_fields.json).

(Его легче читать, если у вас есть расширение браузера для форматирования JSON.)

Выпадающие списки должны работать нормально. Проблемы могут возникнуть только с полями «Множественный выбор». Например, поле «Хобби» на скриншоте, который я опубликовал выше.

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

Это здорово. Спасибо!!!

Интересно, можно ли снова открыть эту тему и спросить о создании групп?

  • Я могу создавать пользователей через Zapier без проблем (даже когда включена опция invite only) :white_check_mark:

Интерфейс Zapier позволяет указывать отдельные заголовки API, но когда он запрашивает объект (что, похоже, требуется для создания group), я получаю следующую ошибку, даже если вручную отредактирую тело запроса в соответствии с документацией API:

Не удалось создать пользовательское действие в Discourse

Прямой запрос не удался. Ошибка при выполнении вашего запроса: Код ошибки 400: отсутствует параметр или его значение пусто: group

Есть ли способ отправить этот начальный объект group { и закрыть его снова с помощью Zapier?

Любые подсказки были бы чудесны и очень ценны!

Я решил проблему — мне пришлось использовать Webhooks от Zapier в полностью кастомизированном режиме, чтобы я мог вручную ввести все заголовки.

Затем я просто вставил данные в область body, и всё заработало… Это не работало ни в каком другом режиме.