邀请成员加入你的 Slack 团队需要几步?

通过这篇文章你能了解到的内容:

  1. 付费社群不一定要自己开发一个客户端(误)
  2. 使用 Workflow 发送一封模板邮件
  3. 使用 Workflow 调用现成 API 完成特定需求

起因

年初的时候,纯银老师向我提起他经营付费社群的想法。在现有的付费社群产品不能满足我们需求的情况下,我提出了使用 Slack 来搭建这个社区。春节后我们开启了内测招募,有近三百人报名。我作为打下手的,其中有一个职责就是给通过申请的人发送邮件让他们付款,在其付款后向其提供的邮箱发送 Slack 的邀请邮件。

「黄埔犬校」的新人注册流程

从上图可以看到我涉及的两个环节:

  1. 需要我给特定的收件人发送一封确认邮件(这封邮件的内容对于所有人来说都是一样的)
  2. 需要我给特定的收件人发送一个 Slack 邀请。

这两个事情都没什么难度,无非是复制邮件里包含的邮件地址,然后完成相应的后续动作;但这两个都是不折不扣的脏活。如果只是邀请几个人的话也没必要大动干戈,不过每次邀请开放的窗口期,每天要处理数十个人的申请。很自然的就想到要用一些工具来缩短中间的流程和时间,下面就说说实现的过程。

给特定的收件人发送一封邮件

发送模板邮件并不是一个罕见的需求,甚至可以说是随处可见。例如一般的邮件客户端都会提供的「自动回复」功能就是典型的格式邮件,只不过这个功能已经由提供方给你完成了,你只要打开开关输入想要的内容就行。

在维护 Slack 团队这个实例中,如果有人想要加入「黄埔犬校」,会先给纯银老师发邮件。当他审核通过以后,就会把这封申请邮件转发给我,由我来完成后续的「脏活」。可以看到以下截图就是我收到的申请邮件:

从收到的转发邮件获得原始发件人地址

我要做的是给这人发送一封邮件,标题是:

「黄埔犬校」报名确认

正文是:

你已经通过了「黄埔犬校」的报名,请往支付宝账户:xxx@163.com 转入人民币 XX 元整;并在「备注」一栏注明接受内测邀请的邮箱用户名(请避免使用 QQ、163、126邮箱)。

完成转账后答复此邮件,附上支付宝转账截图及接受 Slack 注册邀请的邮箱地址,我会给你发送 Slack 的邀请邮件。

最开始我的做法是把这两块文本分别置顶在 PIN 的列表里,收到邮件的时候,就直接点击原始发件人的邮件地址给他新建邮件,然后分别粘贴两行文字后发送。我用的是 Newton,在任何网络环境都能顺利的通过 Gmail 发出邮件,发送成功或者失败也会有个提示。

这个方法的缺点很快就暴露出来了,倒不是因为操作繁琐,而是易出错。由于操作过程中需要不断的和 PIN 有交互,也就是剪贴板的顺序一直在变;所以即便你把内容置顶在 PIN 当中,其位置也是不固定的。如果无法形成有效的肌肉记忆,在动作重复的过程中就很容易出错,把标题填在邮件正文区域还好,但是把内容粘贴到标题位置就很尴尬了。作为一个 Workflow 的巨大受益者,这时候很自然就想到要用它来解决问题了。

在 Workflow 中搜索「email」,得到了以下结果:

email 相关的 Workflow 的动作

我们需要的就是「Send Email」这个动作,它可以把你传入的内容作为邮件正文。动作本身则是可以设置「收件人」「抄送」「密送」以及「标题」等信息。

填写邮件的相关信息

添加一个 Text 模块把前面提到的邮件正文填上,邮件标题则写在「Send mail」模块里。接下来要解决就是获得收件人的问题了,你当然可以复制邮件地址到剪贴板,然后配合上述的动作来完成发送。但是用 Workflow 的人一定连「长按然后复制」这个动作都不想做,那么最快的方式是通过 Share Sheet 调用 Workflow。

所以我把动作设置为仅从 Action Extension 触发,并把接收传入的类型(Accepts)设置成了「Email addresses」

Workflow 的动作设置

在这个实例里,最终用到的地址总是原始邮件的发件人,所以用「Get Item from List」这个动作并且 Get 「First Item」对应的就是我们要的地址。尽管你可以通过复制,然后在通知中心运行这个动作。但我不想这么做,因为这个动作的使用场景只限定在我收到特定邮件的时候,在其他情况我不应该看到这个动作。

最后,当收到邮件的时候,通过 Action Extension 就可以运行这个 Workflow 。自动调起原生的邮件客户端,替你填写好「收件人」「标题」「正文」内容,你唯一要做的就是按下「发送」按钮。

使用 Workflow 发送模板邮件

目前这个 Workflow 还是要调用 iOS 原生邮件客户端,虽然我运行起来没什么毛病,但是可能的问题还是有的:

  1. iOS 邮件客户端本身的 BUG,无法发件;
  2. 没有办法及时了解邮件的发送状态;
  3. 发送失败不会主动提示。

这个动作并不是我理想的状态,因为运行 Workflow 以后界面还要跳转,我还得自己点击「发送」按钮,完了以后还有一定几率发送失败。最近在自学 Python ,已经写好了一个脚本在 VPS 上可以发送邮件,不过我还没有封装接口的能力,所以之后才能分享更快更稳的办法,「把发送邮件的事情交给服务器去做」。

邀请特定的收件人加入 Slack 团队

Slack 新增成员是通过发送邀请邮件的方式。你在 Slack 里邀请了以后,对方就会收到一封邮件,按照说明注册以后就算是加入了。官方公开的邀请方式有以下几种:

  1. Slack 网页端的管理页面,点击「Invite New Members」以后,填写邮箱地址,发送邀请;
  2. macOS 客户端/Windows 客户端/网页端,在对话框输入 /invite\_people 邮箱地址 以后点击确认也是相同效果;(这条命令在手机客户端没法用)
  3. iPhone/Android 客户端,打开 Slack 以后,划出右侧边栏,有一个「Invite People」动作,填入邮箱地址以后确认。

可以看到,几种方式都需要你先打开特定的页面,填写邮箱地址,最后确定。步骤繁琐不说,每次打开 Slack 网页或者客户端都需要加载相当的时间,非常痛苦。前段时间学会调用 Slack 的接口来批量发送消息的时候,我就在想能不能用接口请求的方式来邀请新成员加入团队,然而翻遍了官方文档也没有看到相关的描述。

后来在 GitHub 翻阅 Slack 相关的开源项目时,看到了slack 私有文档的页面,里面就有我梦寐以求的接口。立刻在浏览器里试了一下,得到了符合预期的返回。

这个动作相对发送模板邮件难了不少,需要用到以下几个知识点:

  1. 了解「变量」的概念,能定义以及调用变量;
  2. 能够使用 Workflow 的条件模块来做判断
  3. 知道什么是 API(接口),以及如何用 Workflow 与一个 API 通讯;

我们来看一下文档给了哪些内容,先来整理一下思路:

Slack 私有接口的说明文档

可以看到,邀请新成员是一个给定的 API(其地址是https://slack.com/api/users.admin.invite)。其中红色圈出的两个字段是必须填写的,分别是标识你身份的 Token 以及被邀请人的邮件地址。其他字段在这个实例中用不到,我们暂且不理会。所以接下来的问题是如何获得两个必须的字段:

获得新成员的邮件地址

理论上前一个动作我们已经获得了通过申请可以加入 Slack 团队的成员的邮箱。不过实际操作的时候,由于国内的一些邮箱服务收不到 Slack 的邀请邮件,所以我不得不要求对方提供一个国外的邮件地址。如此,在收到对方的回信的时候正文里一般就包含了我们要用到的地址。

如前文所述,这个动作应该通过 Action Extensions 来运行。但这里获取的不再是固定位置的邮件地址(原始发件人),所以不能再用「Get Item from List」这个动作来获取。我们要的是邮件正文当中对方输入的邮件地址,虽然有很大概率这个地址处在一封邮件能获取到的邮件地址的第三位,但也会有很多意外情况。例如对方说「xxx@hotmail.com 是我的支付宝用户名,xxx@gmail.com 是我用来接受 Slack 邀请的邮件地址」,这时候你拿第三个地址就瞎了。

所以我们要用一个能在运行时选择地址的动作,也就是「Choose from List」。当我们在一封邮件里运行 Workflow 来获得邮件地址时,其标题、正文、收发件人信息里包含的邮件地址会以列表的形式传入,这个动作则是让你可以在运行时选择列表里的内容并传给下一步。我们来看看效果:

从邮件信息中获得邮件地址

我们需要的地址包含在图中了(xavieris@gmail.com),但是你发现有两个重复的结果。这是因为 Workflow 是从邮件的 HTML 代码里获取的地址,所以你看到的一个地址还包含了一个mailto://xavieris@gmai.com的超链接,其中包含的邮件文本也会被 Workflow 拿到。为了展示美观,我引入一个给列表去重的 Workflow 嵌套运行。

从邮件信息中获得邮件地址并去重

P.S. 列表去重不是本文的重点,可以先点击这里下载使用,我之后另起一篇文章说明。

获得 Slack 账户的 Token

因为我们运营的是一个付费社群,用户加入只能通过管理员的邀请。所以在 Slack 的权限设置里,要把「允许所有人发送邀请」的开关关闭。随之而来的问题是,Workflow 需要发送一个邀请请求,怎么让 Slack 知道我们是谁呢?这里就需要用到 Token 了,使用拥有管理员权限的账户登录 Slack 网页端,打开以下地址:

https://api.slack.com/custom-integrations/legacy-tokens

在这个页面,点击「Create token」,就会生成一串代码,用来向 Slack 的服务器标识你的身份。我们把这串代码填入 Workflow 的 Text 模块,并为其设置一个变量。

填写你的 Slack Token

组装 URL 用于发送请求

前两个步骤我们已经获得了必要的信息,接下就是把他们组装起来发出去了。使用一个「URL」模块,在里边填入 API 地址,并在后面加上以下片段:

?token=「Token」&email=「Email Addresses」

其中「Token」和「Email Addresses」分别是我们前面填写的 Token 设置的变量,以及用魔术变量表示的邮件地址。此时用「Get Contents of URL」发起请求,就能拿到 Slack 对我们这次请求的相应了。

结合文档和我们的尝试,可以得知,如果页面中的ok字段返回了true说明邀请成功了。我们添加一个条件判断,在邀请成功时给出一个提示:

邀请成功的提示

另外,由于各种原因,邀请也有可能会失败,例如:

  1. 用户已经被邀请过了;
  2. 用户已经加入了你的团队;
  3. 输入的 Token 不正确或者过期
  4. 邮件地址错误

我们需要在请求失败的时候知道具体的原因,这样才能根据提示修正动作。再看看提供 API 的说明文档,可以看到其中「Errors & Warnings」部分把我提到的错误都覆盖了,我们只要在 Workflow 里添加解析错误信息的动作即可:

邀请失败的提示

至此,这个在邮件客户端运行即可邀请成员加入 Slack 的动作就完成了。

总结

这两个动作在实现的过程中我变换过多种思路,才得到了目前的这两个解法。最大的收获当然不是这两个动作本身,而是通过不停的思考一点点的改进方法。过程中,总会觉得一定可以更简单,但是你不能因为觉得有更高级的方法就不去用「笨办法」。例如第二例中通过列表选择邮件地址以及为列表去重,是我在这篇文章行文的过程中才想出来的。虽然想出来以后你就会觉得「这么简单,怎么早想不到」。在你还不能用更高级办法的时候,先用简单的方法「凑活」着,把正事给做了,才是最重要的。

参考阅读:

  1. Documentation of "undocumented" Slack API methods
  2. Workflow 教程(八):利用新的请求方法打造 Web 小程序

发表评论

电子邮件地址不会被公开。 必填项已用*标注