开发机器人 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 返回的 标题、封面、作者绑定「书单」表中的字段。
获取图书信息,涉及到 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 的做法,详情咨询冯鹏龙
上架
我们的 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」 获取一张免费的封面图上传到附件中(这个更适合用小组件实现)