通过 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
2 个赞

我猜它会在 is_api? 上失败。查看代码,我不清楚为什么它会因 Zapier 的请求而失败,但我看不到其他可能失败的地方。

我对此感兴趣是因为几周前有人问我关于通过 Zapier 创建用户的相同问题。

2 个赞

我的另一个想法是 Zapier 没有正确传递 API 密钥,但我认为我会收到不同的错误。

我猜是同一个人。 :slight_smile:

2 个赞

是的。我很惊讶这不起作用,但至少现在我知道不是我一个人遇到这个问题了。

我正在考虑使用外部数据库和 Zapier 或 Make(我在 Make 上也遇到了类似的错误)之类的自动化工具作为试点项目的概念验证。

在短期的试点阶段,我可以不用这些工具,但从长远来看,Discourse 将是一个更大平台的一部分,我肯定需要在一个拥有会员管理和其他服务的独立后端中管理会员。

1 个赞

我怀疑问题出在您在 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-KeyApi-Username(我只尝试过将 Api-Username 设置为 system)。

使用所有其他部分的默认值。

这里有几张带有虚假数据的截图:

这对我来说是有效的。如果无效,另一个要检查的事情是确保您的 Discourse 网站上未启用“仅限邀请”设置。

为了查看它是否有效,我还使用 Zapier CLI 创建了一个自定义集成来创建新用户。如果 Discourse 需要,该操作可以添加到官方 Discourse Zap 中。我不确定添加创建用户的操作是否是优先事项。我认为它不像创建邀请或暂停用户那样经常被请求。

进一步测试的注意事项:

  • Payload Type 可以设置为“json”或“form”。要使用请求设置自定义字段,需要将 Payload Type 设置为“form”。

  • 多选自定义字段有点问题。Zapier 不允许在 Data 部分中有重复的键名。应该可以使用 Zapier 的“Custom Request”操作来设置多选自定义字段。

  • activeapproved 参数的值不需要用引号括起来。

2 个赞

@simon 谢谢!我成功了!您的截图帮助我解决了 Zapier 创建数据字段时出现的问题。它在做一些奇怪的事情,但我基本上不明白如何格式化/映射数据到 Airtable。我需要让端到端的自动化工作,但创建用户肯定成功了。
另外, FYI @pfaffman

4 个赞

你好 @simon - 再次感谢你对格式的帮助。现在我正尝试向用户配置文件添加一些自定义字段,看看是否能让 Zapier 在新的 Discourse 用户中填充它们。这似乎导致整个请求失败,并且我收到一条消息“您尚未完成所有用户字段”。

我找到了这篇帖子,所以我尝试将其从 json 切换到 form,但这不起作用。

关于如何格式化自定义配置文件字段,有什么建议吗?谢谢!

1 个赞

将有效负载类型更改为“form”对我来说有效:

除了那种方法不适用于多选下拉字段。对于那种类型的字段,我认为您必须使用“自定义请求”操作。可能需要一些调整才能使其正常工作。

1 个赞

哇——你真是 Zapier + Discourse 的大巫师。更改红色箭头,第一次就成功了。我把它作为字段的名称,但当然,考虑到上游不知道这一点,这毫无意义。所以,我创建的每一个新字段都只使用 [#],它会自动按顺序映射它们吗?我计划创建大约 10 个。另外,即使我的测试字段是下拉列表,它似乎也能正常工作——也许是因为它只是从 Airtable 中提取的?

1 个赞

实际上,我并没有进行真正的端到端测试。我只是测试了 Zap,但它在下拉字段上确实有效。

是的,只需将字段的 id 放在 [] 中。您可以通过加载 Admin / Customize / User Fields 页面的 JSON 版本(/admin/customize/user_fields.json)来获取字段的 id。

(如果您有格式化 JSON 的浏览器扩展,阅读起来会更容易。)

下拉列表字段应该没问题。只有多选字段才会有问题。例如,我上面截图中的“hobbies”字段。

1 个赞

啊,多选——是的,我错过了那部分。我现在只有单选下拉菜单。

太棒了。谢谢!!!

1 个赞

想知道是否可以再次打开这个问题并询问有关创建群组的事宜?

  • 我可以毫无问题地从 Zapier 创建用户(即使启用了“仅限邀请”):white_check_mark:

Zapier 界面允许单独的 API 标头,但当它需要一个对象(创建 group 似乎需要)时……即使我手动编辑正文以使其格式符合 API 文档的要求,我也会得到这个:

创建 Discourse 自定义操作失败

原始请求失败。执行请求时出错:错误代码 400:参数缺失或值为空:group

我能否使用 Zapier 发送初始对象 group { 并将其关闭?

任何见解都将是惊人的,非常感谢!

我解决了——我必须使用 Zapier 的 Webhooks 完全自定义模式,这样我才能手动输入所有标头。

然后我只是粘贴到数据/正文区域,它就起作用了……在任何其他模式下它都无法正常工作。

3 个赞