Zapier 요청으로 Discourse 사용자 생성

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에서 동일한 호출을 수행하면(production.log의 Parameters가 같아 보입니다) 로그에 다음과 같은 내용이 표시됩니다:

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:

네, 맞아요. 이게 안 되는 게 좀 의외긴 하지만, 적어도 나만의 문제가 아니라는 건 알았으니 다행입니다.

현재 파일럿 프로그램의 POC(개념 검증)로 외부 DB와 Zapier나 Make 같은 자동화 도구를 활용하는 방식을 검토하고 있습니다. (Make에서도 비슷한 오류가 발생했었거든요.)

단기적인 파일럿 단계에서는 이런 도구를 쓰지 않고도 버틸 수 있지만, 장기적으로 Discourse는 더 큰 플랫폼의 일부가 될 예정이고, 멤버 관리를 포함한 다른 서비스들과 함께 외부 DB에서 멤버를 별도로 관리해야 하므로, 이 부분은 꼭 필요합니다.

문제가 Zapier에서 요청을 구성하는 방식과 관련이 있을 것으로 추정됩니다. Zapier의 Webhooks 액션을 사용하여 다음을 시도해 보세요:

이벤트로 "POST"를 선택합니다. 그런 다음:

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

Payload Type: “json”

Data:

  • name: <사용자의 전체 이름> (문서에서 필수로 표시되어 있지만, 생략해도 괜찮습니다)
  • username: 사용자의 사용자 이름
  • email: 사용자의 이메일
  • password: 사이트 요구 사항을 충족하는 어떤 비밀번호
  • active: "true" (따옴표 포함)
  • approved: "true" (따옴표 포함)

Headers 섹션을 채워 Api-Key와 Api-Username을 추가하세요 (Api-Username은 system으로만 테스트해 보았습니다.

나머지 모든 섹션에는 기본값을 사용하세요.

가짜 데이터가 포함된 스크린샷 두 장을 첨부합니다:

저에게는 잘 작동하고 있습니다. 작동하지 않는다면, 확인해야 할 다른 사항은 Discourse 사이트에서 invite only(초대 전용) 설정이 활성화되어 있지 않은지 확인하는 것입니다.

작동 여부를 확인하기 위해, 저는 Zapier CLI를 사용하여 새 사용자를 생성하는 맞춤형 통합도 만들었습니다. Discourse가 원한다면, 이 액션은 공식 Discourse Zap에 추가될 수 있습니다. 그러나 사용자 생성 액션을 추가하는 것이 우선순위인지 확실하지 않습니다. 초대 생성이나 사용자 정지 같은 것들만큼 자주 요청된 것 같지는 않습니다.

추가 테스트에 대한 참고 사항:

  • Payload Type은 “json” 또는 “form” 중 하나로 설정할 수 있습니다. 요청으로 사용자 지정 필드를 설정하려면 payload type을 "form"으로 설정해야 합니다.

  • 다중 선택 사용자 지정 필드는 다소 문제가 됩니다. Zapier는 Data 섹션에서 중복된 키 이름을 허용하지 않습니다. Zapier의 “Custom Request” 액션을 사용하여 다중 선택 사용자 지정 필드를 설정하는 것이 가능해야 합니다.

  • active와 approved 매개변수의 값은 따옴표로 감쌀 필요가 없습니다.

@simon 감사합니다! 작동하게 만들었어요! 캡처 덕분에 Zapier가 데이터 필드를 생성하는 방식에 대한 문제를 해결할 수 있었습니다. 좀 엉뚱한 방식으로 동작하고 있었는데, 기본적으로 데이터를 Airtable에 어떻게 포맷하고 매핑해야 하는지 이해하지 못하고 있었거든요. 엔드투엔드 자동화를 완전히 작동시키는 것이 필요하지만, 사용자 생성 기능은 확실히 잘 작동했습니다.

참고로 @pfaffman 에게 알려드립니다.

안녕하세요 @simon - 포맷팅에 도움을 주셔서 다시 한번 감사합니다. 이제 사용자 프로필에 사용자 정의 필드를 추가하고, Zapier를 통해 새로운 Discourse 사용자에 해당 필드가 자동 입력되는지 테스트해 보고 있습니다. 하지만 이로 인해 전체 요청이 실패하는 것 같고, "모든 사용자 필드를 완료하지 않았습니다"라는 메시지가 표시됩니다.

이 게시물을 찾아서 JSON에서 form으로 전환해 보았지만, 작동하지 않았습니다.

사용자 프로필 필드를 어떻게 포맷팅해야 하는지 조언을 주실 수 있을까요? 감사합니다!

저는 페이로드 유형을 "form"으로 변경하면 작동합니다:

다만 이 방법은 멀티셀렉트 드롭다운 필드에는 작동하지 않습니다. 해당 유형의 필드는 “Custom Request” 액션을 사용해야 할 것 같습니다. 작동하도록 하려면 약간의 조정이 필요할 수 있습니다.

와 - 정말로 Zapier와 Discourse의 대가시네요. 빨간 화살표를 바꾸니 한 번에 작동했어요. 저는 원래 필드 이름으로 설정해뒀는데, 물론 upstream에서는 그것을 알 수 없으니 말이 안 되는 거였죠. 그러면 제가 새로 만드는 모든 필드에 [#]를 사용하면 순서대로 자동으로 매핑되나요? 10개 정도를 계획하고 있어요. 그리고 테스트 필드가 드롭다운인데도 잘 작동한 것 같아요 - Airtable에서 가져오는 것이라 그런 걸까요?

사실 - 저는 실제 엔드투엔드 테스트를 수행하지 않았습니다. 저는 단순히 zap만 테스트했을 뿐인데, 드롭다운 필드에서는 제대로 작동했습니다.

네, [] 안에 필드의 id를 넣으면 됩니다. 관리자 / 사용자 정의 / 사용자 필드 페이지(/admin/customize/user_fields.json)의 JSON 버전을 불러와서 필드의 id를 확인할 수 있습니다.

(JSON을 포맷팅하는 브라우저 확장 기능이 있으면 읽기 편합니다.)

드롭다운 필드는 문제없습니다. 문제가 생기는 것은 다중 선택(Multi-select) 필드입니다. 예를 들어, 위에 올린 스크린샷의 “hobbies” 필드 같은 경우요.

아, 멀티셀렉트였구나 - 그 부분은 놓치고 있었네. 지금은 단일 선택 드롭다운만 있어.

정말 대단해. 고마워!!!

다시 이 주제를 열어 그룹 생성에 대해 질문해도 되는지 궁금합니다.

  • Zapier를 통해 사용자를 생성하는 데는 문제가 없습니다(invite only가 켜져 있어도) :white_check_mark:

Zapier 인터페이스는 개별 API 헤더를 허용하지만, 객체(예: group 생성에 필요한 것)를 요구할 때 다음과 같은 오류가 발생합니다. API 문서에서 요구하는 형식으로 본문을 수동으로 수정해도 마찬가지입니다:

Discourse에서 커스텀 액션 생성 실패

원시 요청 실패. 요청 실행 중 문제 발생: 오류 코드 400: param is missing or the value is empty: group

Zapier를 사용하여 초기 객체 group {를 보내고 다시 닫을 수 있는 방법이 있을까요?

어떤 조언이나 통찰이든 정말 감사하겠습니다!

해결했습니다 - Zapier의 Webhooks를 완전히 사용자 정의된 모드로 사용해야 했어요. 그래야 헤더를 모두 수동으로 입력할 수 있었거든요.

그 다음 데이터/바디 영역에 내용을 붙여넣기만 하면 작동했어요 … 다른 모드에서는 어떤 경우에도 작동하지 않았죠.