Criar um usuário do Discourse a partir de uma solicitação do Zapier

Estou tentando criar um usuário ativo com a API.

Isso funciona a partir do 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"

Quando faço a mesma chamada do Zapier (vejo que os Parameters em production.log parecem os mesmos), ele tem isso nos logs:

Filter chain halted as :respond_to_suspicious_request rendered or redirected

E nada acontece.

Existe alguma maneira de contornar isso?

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

Estou imaginando que está falhando em is_api?. Olhando o código, não fica óbvio para mim por que isso falharia com a requisição do Zapier, mas não consigo ver em nenhum outro lugar que falharia.

Estou interessado nisso porque alguém me perguntou sobre o mesmo problema ao criar usuários via Zapier algumas semanas atrás.

2 curtidas

Meu outro pensamento é que o Zapier não está passando a chave da API corretamente, mas acho que receberia um erro diferente.

Estou imaginando que é a mesma pessoa. :slight_smile:

2 curtidas

Sim. Surpreendo-me que isso não esteja funcionando, mas pelo menos agora sei que não sou só eu.

Estou considerando esta abordagem de usar um banco de dados externo e uma ferramenta de automação como Zapier ou Make (eu estava recebendo erros semelhantes no Make) como um POC (Proof of Concept) para um programa piloto.

Posso me virar sem usar uma dessas ferramentas na fase piloto de curto prazo, mas a longo prazo o Discourse será parte de uma plataforma maior e eu definitivamente preciso gerenciar membros em um banco de dados externo em um backend separado com gerenciamento de membros e outros serviços.

1 curtida

Suspeito que o problema esteja relacionado à forma como você está estruturando a solicitação no Zapier. Usando a ação Webhooks by Zapier, tente o seguinte:

Selecione “POST” como Evento. Em seguida:

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

Payload Type: “json”

Data:

  • name: <nome completo do usuário> (mostrado como obrigatório na documentação, mas deve ser ok omitir)
  • username: nome de usuário do usuário
  • email: e-mail do usuário
  • password: uma senha que atenda aos requisitos do seu site
  • active: "true" (entre aspas)
  • approved: "true" (entre aspas)

Preencha a seção Headers para adicionar sua Api-Key e Api-Username (eu só testei isso com system como Api-Username.

Use os valores padrão para todas as outras seções.

Aqui estão algumas capturas de tela com dados fictícios:

Isso está funcionando para mim. Se não estiver funcionando, a outra coisa a verificar é se a configuração invite only não está habilitada em seu site Discourse.

Para ver se funcionaria, também criei uma integração personalizada com o Zapier CLI que cria novos usuários. Se o Discourse quiser, essa ação pode ser adicionada ao Zap oficial do Discourse. Não tenho certeza se adicionar uma ação para criar usuários é uma prioridade, no entanto. Acho que não foi solicitado com tanta frequência quanto coisas como criar um convite ou suspender um usuário.

Notas de testes adicionais:

  • o Payload Type pode ser definido como “json” ou “form”. Para definir campos personalizados com a solicitação, o payload type precisa ser definido como “form”.

  • Campos personalizados de multiseleção são um pouco problemáticos. O Zapier não permite nomes de chave duplicados na seção Data. Deve ser possível definir campos personalizados de multiseleção com a ação “Custom Request” do Zapier.

  • os valores dos parâmetros active e approved não precisam estar entre aspas.

2 curtidas

@simon Obrigado! Consegui fazer funcionar! Sua captura de tela me ajudou a resolver os problemas com a forma como o Zapier está criando os campos de dados. Ele estava fazendo algumas coisas estranhas, mas eu basicamente não estava entendendo como formatar / mapear os dados para o Airtable. Preciso fazer a automação de ponta a ponta funcionar, mas a criação de usuário definitivamente funcionou.

Para sua informação @pfaffman

4 curtidas

Olá @simon - obrigado novamente pela ajuda com a formatação. Agora estou tentando adicionar alguns campos personalizados ao perfil do usuário e ver se consigo fazer o Zapier preenchê-los em um novo usuário do Discourse. Parece que isso está fazendo com que toda a solicitação falhe e estou recebendo a mensagem “você não completou todos os campos do usuário”.

Encontrei este post e tentei mudar de json para form, mas isso não funcionou.

Algum conselho sobre como formatar campos de perfil personalizados? Obrigado!

1 curtida

Alterar o tipo de payload para “form” funciona para mim:

Exceto que essa abordagem não funcionará com campos de dropdown multiselect. Para esse tipo de campo, acho que você terá que usar a ação “Custom Request”. Pode levar um pouco de tentativa e erro para fazê-lo funcionar.

1 curtida

Uau - você é verdadeiramente o grande mago do Zapier + Discourse. Mudar a seta vermelha e funcionou na primeira tentativa. Eu a tinha como o nome do campo, mas é claro que isso não faz sentido, dado que não saberia disso a montante. Então, para cada novo campo que eu criar, basta usar o [#] e ele os mapeará automaticamente em ordem? Estou planejando vários - talvez uns 10. Além disso, parece que funcionou bem, mesmo que meu campo de teste seja um menu suspenso - talvez porque ele está apenas puxando do Airtable?

1 curtida

Na verdade, eu não fiz um teste ponta a ponta completo. Eu apenas testei o zap, mas ele funcionou em um campo de menu suspenso.

Sim, basta colocar o id do campo nos []. Você pode obter o id do campo carregando a versão JSON da sua página Admin / Customize / User Fields (/admin/customize/user_fields.json)

(É mais fácil de ler se você tiver uma extensão de navegador que formate JSON.)

Campos de seleção suspensa devem funcionar bem. Apenas campos de seleção múltipla terão problemas. Por exemplo, o campo “hobbies” na captura de tela que postei acima.

1 curtida

Ah multiselect - sim, perdi essa parte. Só tenho um dropdown de seleção única por enquanto.

Isso é incrível. Valeu!!!

1 curtida

Gostaria de saber se posso reabrir este tópico e perguntar sobre a criação de grupos?

  • Consigo criar usuários pelo Zapier sem problemas (mesmo quando o invite only está ativado) :white_check_mark:

A interface do Zapier permite cabeçalhos de API individuais, mas quando solicita um objeto (o que a criação de um grupo parece exigir)… recebo isso, mesmo que edite o corpo manualmente para que seja formatado como a documentação da API pede:

Falha ao criar uma ação personalizada no Discourse

Falha na solicitação bruta. Problema ao executar sua solicitação: código de erro 400: parâmetro ausente ou o valor está vazio: group

Existe alguma maneira de enviar esse objeto inicial group { e fechá-lo novamente usando o Zapier?

Qualquer insight seria incrível e muito apreciado!

Eu resolvi - tive que usar os Webhooks do Zapier no modo totalmente personalizado para poder inserir todos os cabeçalhos manualmente também.

Em seguida, colei os dados na área de corpo e funcionou… simplesmente não funcionava em nenhum outro modo.

3 curtidas