在阿里云的函数计算上部署kintone程序

cybozu发表于:2019年07月26日 18:32:00更新于:2019年09月06日 13:52:11

Index

最近Serverless的火热,大家也很想知道我们的kintone如何利用这种无服务器的红利,来进行更加简单高效的开发。

这次我们利用手边现有的资源,运用阿里云做了一个逸创云客服和kintone的数据同步。

下面就来分享下心得。希望能给大家在无服务器部署方面带来一点启发。

课题

当用户在逸创云客服上添加一条工单申请后,他会自动同步到kintone。

技术分析

因为逸创云客服支持webhook协议,我们可以利用webhook来调用阿里云上的API网关,然后通过API网关调用阿里云函数计算的实例,

函数计算实例的方法里,我们调用了逸创的工单API,获取到我们想要的数据后,再同步到kintone。

流程就是

用户的工单申请 → webhooks → 阿里云API网关 → 阿里云函数计算实例 → 获取逸创工单并同步kintone


0015d3ab741cb7daeebb97361eaa2c7

下面我们就来详细看下每个服务怎么部署吧。

逸创云客服的部署

创建逸创云客服工单

通过逸创云客服的后台,我们创建好了一个“联系我们“的工单。

0015d3fe72829af392a9d375712c9a3

触发器任务/提醒任务

在逸创云客服的后台添加触发器,可以根据自己的需求选择触发的条件。这里设置为当工单被创建时为触发。

消息内容选择{{ticket.id}} ,就是工单的id。具体的标签的替换说明,可以点击 “查看所有替换标签” 查看。

0015d3fb6b647c4abfdb6de652e3df3

提醒目标 Webhook

配置webhook,URL地址填写阿里云的API网关地址。(我们可以先空着,等后面了解了API网关之后再来填写。)

0015d3fba8b4e5e73b71bc29ba586a1

kintone的部署

kintone上创建好应用,并且添加逸创云客服上的字段。具体字段名可以在逸创的设置里查询到。并且设置好API令牌。

查看工单的字段信息

0015d3fef1441e420d8fbc9db1a76df

kintone字段设置举例

0015d3fefbb92eebeaaf860edf3fbc6

阿里云的部署

阿里云的部署,我们分为函数计算实例的部署和API网关的部署。

函数计算

新建服务

在函数计算后台新建一个服务。

0015d3fd7c4009306989f1c63b7894c

新建函数

在服务下面新建函数。函数语言选择nodejs8。(当然你也可以根据自己的需求用它支持的其他语言进行开发。)

触发器类型:不创建触发器。模板权限管理的权限配置可以选择 AliyunFCFullAccess

0015d3fdb1f2b2a1efb5e9c81c8fffa

代码执行管理

创建一个npm项目,并且导入相关的库。

npm init
npm install --save @kintone/kintone-js-sdk  request request-promise

其中kintone/kintone-js-sdk是kintone的js sdk。

具体的用法可以参见文档:https://kintone.github.io/kintone-js-sdk/latest/

逸创云客服的API文档请参见他们的官网:https://developer.kf5.com/doc/core/core/

以下是放到阿里云的函数计算上的代码 index.js

'use strict';
const request = require('request-promise');
const kintone = require('@kintone/kintone-js-sdk');
const Url = 'https://xxxx.kf5.com';
const Email = 'xxxx';
const Token = 'xxxxxxxxxxxx';
const KINTONE_DOMAIN = "xxxx.cybozu.com";
const MY_TOKEN = "xxxxxxxxxxxx";
const appID = xxx;
const baseresponse = {
    isBase64Encoded: false,
    statusCode: 200
};

async function handler(event, context, callback) {
    const eventObj = JSON.parse(event.toString());
    const ticketId = eventObj.queryParameters.message;
    const url = Url + '/apiv2/tickets/' + ticketId + '.json';
    const params = {
        url: url,
        method: 'GET',
        json: true,
        headers: {
            'content-type': 'application/json',
        },
        auth: {
            user: Email + '/token',
            pass: Token,
            sendImmediately: false,
        },
        body: '',
    };
    let kintoneAuthWithAPIToken = (new kintone.Auth()).setApiToken(MY_TOKEN);
    let kintoneConnection = new kintone.Connection(KINTONE_DOMAIN, kintoneAuthWithAPIToken);
    let kintoneRecord = new kintone.Record(kintoneConnection);
    try {
        const getdata = await request(params);
        let record = getdata.ticket.custom_fields;
        var kdata = {};
        for (var index in record) {
            var fieldName = record[index].name;
            kdata[fieldName] = { value: record[index].value };
        }
        await kintoneRecord.addRecord(appID, kdata);
        const response = Object.assign(baseresponse, {
            body: {
                status: "ok"
            }
        });
        callback(null, response);
    } catch (e) {
        callback(e);
    }
};
module.exports.handler = handler;

请按照实际情况,设置以下内容:

  • 逸创云客服的相关变量:Url,Email,Token

  • kintone的变量:KINTONE_DOMAIN,MY_TOKEN,appID 

然后将项目打包并上传。

0015d3fdbedeb5d65e611edc0e0e304

代码解析

通过webhook传入的工单id,去调用逸创云客服的API获取它的工单数据,然后再同步到kintone。

API网关设置

我们通过配置API网关来作为webhook触发的地址。来调用函数计算上的函数来同步工单数据。

我这里只是做个简单的演示,所以都是使用的最简单的配置。具体可以根据自己的需求,设置好安全认证。

基本信息

0015d3ad3cbbc3ed69137e123b95b2e

设置入参定义: 参数名“message”、参数位置为Query、类型为string

0015d3fd629500992020d4b779ec50a

填写函数计算实例的服务名称和函数名称

0015d3ad3cc30b69688fdbce7c31e3b

返回类型

0015d3ad3cb56e1bb3341a7079bfd25

最后将这个API网关保存上线。

测试

好了,我们现在可以测试一下,在逸创云客服的前台添加一个工单,看看我们的kintone是否会及时的把这个工单同步过来呢。

当然,我们的这篇文章只是抛砖引玉。

关于利用无服务器来进行开发,还可以充分结合很多阿里云原生的服务如大数据、IoT、AI等等,然后同步到我们的kintone进行数据展示。让我们的办公变得更加高效和有趣吧!

注意事项

  • 本示例代码不保证其运行。

  • 我们不为本示例代码提供技术支持。

相关链接

    注意:贴代码时请注意格式并使用"代码语言",与本文无关的问题请至“讨论社区”提问。
    您需要登录后才可以回复