开发机器人 action流程详情
官方已经支持了 3 个 action:
- WebHook 发送网络请求
- 钉钉消息通知
- 企业微信消息通知 不管是后续开发新的 action,还是用户自定义自己的 aciton,整个流程是通用的。本文介绍如何上架一个自定义的 Action(service)
基础流程

基础概念

- action 是机器人执行过程中的节点,最简单的理解就是他是一个函数。最简单的实现也是云函数。
- 一个函数只专注于干一件事情。
- action 可以组合起来,编排流程,完成一系列的工作。
- service 服务,action 是归属于一个服务的。想要提供 action 必须先注册一个服务。
- 例如:服务「 维格表」提供了「创建记录」、「查询记录」的 action 实现一个 action 的过程实际上就是在实现一个函数,和 ts 定义函数一样。需要定义函数的传入参数和函数的返回类型。
- 入参类型告诉用户你这个 action 怎么使用,需要传入哪些信息才能正常工作。
- 返回类型可以告诉下一个 action,当前 action 能提供什么,next action 可以用 current action 的 output 作为 input
实现
需求场景
这里有一个完整的场景流程。
我有张书单的表,我需要通过条形码录入其书籍信息。包涵其标题、作者、封面。
你可能想到了之前的图书扫码录入,它需要用户获取捷径、使用指定模版、提供 API Token、提供表格地址。 当我们将这个功能做成 aciton 时,用户可以自助地建立一条 robot 来完成这项工作。用户路径变短、这个服务也更加通用。
我们把他概括为一条 automation 的需求,当表格内的某个字段(条形码)更新时,自动获取图书信息,填充到指定字段。
- 用户在任意表格新建一个 robot
- trigger 选取「当记录更新时」
- 仅监听「条形码」字段的变化
- 用户新建「获取图书信息」的 action
- 选取「条形码」字段作为输入。
- 用户新建「更新维格表记录」的 action
- 选取书单表
- 将「获取图书信息」action 返回的 标题、封面、作者绑定「书单」表中的字段。
- trigger 选取「当记录更新时」
获取图书信息,涉及到 API 调用。云平台有很多付费的 API 接口提供 isbn 查询的服务,你可以把API 封装成一个 action 上架到 automation 中,这样同空间的用户可以直接使用这项服务,当你把服务公开,全部空间站的人都可以使用,造福整个维格星球。
你可以为有类似需求的用户提供服务,设置有偿使用,让您的服务更健康的运行下去。
接口设计
通过上面的需求,我们已经知道 「获取图书信息」这个 action 的 input 就是条形码,输出值就是标题、封面、作者。
选取任意云函数平台,新建云函数,实现此功能。
interface IBookInfo {
title: string;
author: string;
cover: string;
}
function getBookInfo(barCode: string): IBookInfo {
//
return
}云函数实现
下面是 cloudflare worker 实现 「webhook 发送请求」 这个 action 的代码,我们可以继续扩展这个云函数,丰富我们的service 的能力。接下来在这个代码上继续添加 pathname 为 getBookInfo 时的处理逻辑。
addEventListener("fetch", (event) => {
event.respondWith(
handleRequest(event.request).catch(
(err) => new Response(err.stack, { status: 500 })
)
);
});
async function handleRequest(request) {
const { pathname } = new URL(request.url);
if (pathname.startsWith("/sendRequest")) {
return sendReq(request)
}
if (pathname.startsWith("/getBookInfo")) {
// 获取图书信息
}
// 其他 pathname 的处理逻辑
}
async function sendReq(request){
const {method, headers,url,body} = await request.json();
return fetch(url,{
body,
method,
headers: {
'content-type': 'application/json'
},
})
}云函数会有一个唯一访问的地址,上面这个 worker 分配的地址是 https://actions.gine.workers.dev
记下这个 URL。
对于开发者来说,云函数是最简单的做法。私有化部署,或者我们自己控制,可以直接在 room 里面实现 action 。
上架
我们的 action 是依附于 service 的。云函数也可以根据传入的 pathname 做不同的处理逻辑。这就相当于一个云函数有一个唯一 URL,即 service 的 baseURL 以在 test 环境注册 service 为例,访问。
-
先调用接口登录 https://test.vika.ltd/api/v1/doc.html#/default/授权相关接口/signInUsingPOST
-
再调用接口注册 automation service https://test.vika.ltd/api/v1/doc.html#/%20/Automation%20API/edit_4

创建服务需要提供
-
name
-
logo
-
baseUrl
这个 service 的调用基础地址,就是上面那个 worker 的地址。
注册完之后会返回新建服务的 serviceId。记下这个 id。下面新建 action 会用到
-
-
调用接口注册 automation actionType https://test.vika.ltd/api/v1/doc.html#/%20/Automation%20Action%20Type%20API/create_10

注册 action 原型需要提供:
-
name
-
inputJSONSchema
- action 的输入类型,也就上面我们定义函数的 input interface,但是要以 JSONSchema 的形式提供。
-
outputJSONSchema
- action 的输出类型,也就上面我们定义函数的 output interface,但是要以 JSONSchema 的形式提供。
-
serviceId
- 上面注册的服务 id,我们的 acitonType 要归属与某个 service 下
-
endpoint
- 以 https://actions.gine.workers.dev/webhook 为例其中 webhook 就是 action 的 endpoint。
- baseUrl 是 service 定义的,endpoint 是 action 定义的。二者结合可以得到 action 的唯一调用地址。当 action 被触发时,就会调用这个云函数执行并且返回结果。
-
如何做到
https://www.figma.com/file/4YrYKFdMdggFYK8Cdd7NpO?embed_host=share&kind=&node-id=0%3A1&viewer=1
扩展思路
基于上面的思路,可以提供很多 API 的查询服务,其中一条思路就是花钱买 API,然后用云函数封装成 aciton 上架。实际上有很多数据集都是公开的,你可以免费下载他们,然后存储在可以与云函数互通的服务中,通过函数调用获取。
网上也有很多公开的 API,你可以利用他们。比如随机返回猫咪图片的 API。可以做这样一条 workflow,当用户新建记录时候,往附件列写入随机的猫咪图片。听起来有点意思但是没啥用,这不重要,继续扩展。
比如用户用表格管理自己的文章,新建记录,输入标题。当标题/标签/其他要素改变后,用这些关键词去 「unsplash」 获取一张免费的封面图上传到附件中(这个更适合用小组件实现)