通过 Discourse Webhooks 触发 Zapier 任务

想使用 Discourse Webhooks 通过 Zapier 触发任务吗?让我们开始吧!

:bulb: 提示: Zapier 现已推出 官方 Discourse 集成,内置触发器和操作(例如“新帖子”、“创建帖子”)。对于常见用例,这比手动配置通用 Webhook 更简单。下面的指南介绍的是手动 Webhook 方法,它能为您提供更多灵活性并访问所有 Discourse 事件类型。

Zapier 需要一个触发器和一个操作。在本教程中,触发器将是 Discourse Webhook,操作将是发送电子邮件。

在任何用户事件上发送电子邮件

我们现在将设置一个 Zap,以便在任何用户事件发生时发送电子邮件(例如,当用户被创建、批准、更新、登录、登出、暂停等时)。若要针对 特定 用户事件进行触发,请参阅下方的 针对 特定 用户事件进行触发

创建 Discourse Webhook

创建新的 Zap

在 Zapier 仪表板上寻找此按钮:

设置触发器

在 Zapier 上设置操作

启用 Zap

就是这样,现在您将为每个用户事件收到一封电子邮件。可以触发 Webhook 的用户事件完整列表如下:

事件名称 描述
user_created 创建了新用户账户
user_approved 用户被批准
user_updated 用户资料已更新
user_logged_in 用户已登录
user_logged_out 用户已登出
user_confirmed_email 用户确认了其电子邮件
user_destroyed 用户账户已删除
user_suspended 用户被暂停
user_unsuspended 用户已解除暂停
user_anonymized 用户账户已匿名化

:tada:


针对 特定 用户事件进行触发

只想在特定用户事件(例如仅在账户创建时,而不是在更新时)发送电子邮件吗?请使用“捕获原始钩子”(Catch Raw Hook)触发器。

  1. 点击“显示较少见的选项”
  2. 点击“捕获原始钩子”
  3. 按照其余步骤正常配置触发器。

配置好触发器后,添加一个过滤器。

  1. 点击“添加步骤”
  2. 点击“过滤器”
  3. 点击“保存并继续”
  4. 从第一个下拉菜单中选择"Headers Http X Discourse Event"。
  5. 从第二个下拉菜单中选择"(文本) 完全匹配”。
  6. 输入您要过滤的完整标头(例如,user_logged_out)。
  7. 如果您希望 Zapier 在多个标头上运行,请点击"+OR"并像第一个一样添加它们。
  8. 点击“测试并继续”
  9. 查看过滤器测试,然后点击“继续”

配置好过滤器后,配置您首选的操作。

使用完整的 Webhook 标头

要访问标头,请遵循之前的步骤 - 选择“捕获原始钩子”,然后添加一个过滤器。配置过滤器,使其仅在 Headers Http X Discourse Event 与您要查找的事件匹配时才继续。

这里的难点在于“捕获原始钩子”传递的是 Webhook 的原始主体。我最终使用的操作需要从主体中解析数据。对我有效的方法是在过滤器之后添加一个代码操作。在代码操作模态框中,选择“运行 JavaScript":

Zapier 将创建一个 inputData 对象,您可以向其添加命名属性。在左列为您的属性添加名称。在右列中,从下拉菜单中选择“捕获原始钩子”,然后选择“原始主体”(Raw Body):

向下滚动页面以查看代码输入框:

然后,您需要用一些解析原始主体并返回包含最终操作所需值的对象的代码来替换示例代码。这是我使用的代码。它返回的对象正被 Salesforce 集成使用。Salesforce 需要姓氏,因此如果不存在姓氏,将返回错误:

const parsed = JSON.parse(inputData.raw);
if (parsed.user) {
  const user = parsed.user,
        name = user.name,
        userFields = user.user_fields;
  let firstName,
      lastName,
      company;
  
  if (name) {
    const splitName = name.split(' ');
    firstName = splitName[0];
    lastName = splitName[1]
    }
  if (userFields) {
    company = userFields['10'];
  }
  if (lastName) {
    return {id: user.id,
            username: user.username,
            lastName: lastName,
            firstName: firstName,
            email: user.email,
            company: company
           };
  } else {
    return {error: "Missing last name"}
  }
} else {
  return {error: "A user object was not returned"};
}

为了避免在最终操作中发出失败的请求,可以添加另一个 Zapier 过滤器。将该过滤器设置为仅在 JavaScript 返回的错误字段不存在时才继续:

然后您可以添加最终操作。对于选择要在最终操作中使用的字段,请使用“运行 JavaScript"操作返回的属性。

32 个赞