基于 Serverless 框架的微信智能聊天机器人

简介

随着人工智能的发展和智能技术的普及,智能聊天机器人已经成为了大家日常生活中经常接触到的一种形式,微信智能聊天机器人也是其中的一种。本文将介绍一种基于 Serverless 框架的微信智能聊天机器人的实现,具有简单易懂,便于上手,快速迭代的特点。

技术实现

1. Serverless Framework

Serverless Framework 是一个以 AWS Lambda 为代表的技术方案,它是目前最流行的、使用最广泛的 Serverless 框架,可以解决自动化部署、监控、配置等 DevOps 问题,能够方便快捷地实现 Serverless 应用的开发和部署。

2. 微信公众平台

微信公众平台是个人和企业与微信用户之间的桥梁,可以提供多种服务和功能,如消息推送、自定义菜单、微信支付等,可以通过微信公众平台提供的开放接口来实现与微信用户的交互。

3. 聊天机器人接口

聊天机器人接口是实现聊天机器人的关键之一,可以通过第三方聊天机器人平台所提供的接口来实现聊天机器人的核心功能,如语意识别、文本分析、机器人回复等。

4. Node.js

Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,实现跨平台的高性能 JavaScript 代码执行,具有快速、轻量和易于扩展等特点。

技术详解

1. Serverless 部署方案

Serverless Framework 提供了丰富的部署方案和插件,可以让开发者更快速地开始 Serverless 应用的开发和部署。这里使用 Serverless Framework 的微信公众号事件应用模板,快速开始了微信公众号聊天机器人应用的开发。

# 安装 Serverless Framework
$ npm install -g serverless

# 创建微信公众号事件应用模板
$ serverless create --template wechat-public-events -p your-service-name
cd your-service-name
npm install

# 配置公众号相关信息
$ cp .env.example.yml .env.yml
$ vim .env.yml

2. 微信公众号事件部署

在 Serverless Framework 提供的 wechat-public-events 模板当中,提供了完整的公众号事件处理和回复的示例代码。例如:

'use strict';

exports.main_handler = async (event, context, callback) => {
  if (event.httpMethod === 'GET') {
    // 响应 GET 请求
    return {
      isBase64Encoded: false,
      statusCode: 200,
      headers: {
        'Content-Type': 'text/plain;charset=utf-8'
      },
      body: event.queryStringParameters.echostr
    };
  } else if (event.httpMethod === 'POST') {
    const { xml: { ToUserName, FromUserName, CreateTime, MsgType, Content, MsgId } } = event.body;
    console.log(`Receive a message: ${JSON.stringify(event.body)}`);
    // 用户发送文本消息事件
    if (MsgType === 'text') {
      const responseText = '你好';
      const response = {
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'text',
        Content: responseText
      };
      console.log(`Response message: ${JSON.stringify(response)}`);
      return {
        isBase64Encoded: false,
        statusCode: 200,
        headers: {
          'Content-Type': 'application/xml'
        },
        body: JSON.stringify({
          xml: response
        }),
      };
    }
  }
};

在公众号事件处理完成之后,需要将处理后的消息进行回复。例如:

const responseText = '你好';
const response = {
  ToUserName: FromUserName,
  FromUserName: ToUserName,
  CreateTime: new Date().getTime(),
  MsgType: 'text',
  Content: responseText
};
console.log(`Response message: ${JSON.stringify(response)}`);
return {
  isBase64Encoded: false,
  statusCode: 200,
  headers: {
    'Content-Type': 'application/xml'
  },
  body: JSON.stringify({
    xml: response
  }),
};

3. 聊天机器人接口开发

聊天机器人接口是实现聊天机器人核心功能的关键之一,可以通过第三方聊天机器人平台所提供的 API 来实现聊天机器人的核心功能。

例如,可以选择图灵机器人接口作为聊天机器人接口,代码如下:

const axios = require('axios');

async function turingRobot(text) {
  try {
    const response = await axios.post('https://api.turingapi.com/v1/', {
      "text": text,
      "userid": "serverless_wechat_robot"
    }, {
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.status === 200) {
      if (response.data && response.data.code === 100000) {
        return response.data.text;
      } else {
        return '我还不知道怎么回答你呢';
      }
    } else {
      console.log('API Error');
      return '不好意思,我现在不在线';
    }
  } catch (e) {
    console.log(e);
    return '出错了';
  }
}

4. 完整示例代码

'use strict';
const axios = require('axios');
const { decrypt } = require('./utils');

exports.main_handler = async (event, context, callback) => {
  if (event.httpMethod === 'GET') {
    // 响应 GET 请求
    return {
      isBase64Encoded: false,
      statusCode: 200,
      headers: {
        'Content-Type': 'text/plain;charset=utf-8'
      },
      body: event.queryStringParameters.echostr
    };
  } else if (event.httpMethod === 'POST') {
    const { xml: { ToUserName, FromUserName, CreateTime, MsgType, Content, MsgId, Encrypt } } = event.body;
    console.log(`Receive a message: ${JSON.stringify(event.body)}`);
    const content = decrypt(Encrypt);
    // 用户发送文本消息事件
    if (MsgType === 'text') {
      const responseText = await turingRobot(content);
      const response = {
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'text',
        Content: responseText
      };
      console.log(`Response message: ${JSON.stringify(response)}`);
      return {
        isBase64Encoded: false,
        statusCode: 200,
        headers: {
          'Content-Type': 'application/xml'
        },
        body: JSON.stringify({
          xml: {
            Encrypt: encrypt(JSON.stringify(response)),
            MsgSignature: '',
            TimeStamp: Date.now(),
            Nonce: ''
          }
        }),
      };
    }
  }
};

async function turingRobot(text) {
  try {
    const response = await axios.post('https://api.turingapi.com/v1/', {
      "text": text,
      "userid": "serverless_wechat_robot"
    }, {
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.status === 200) {
      if (response.data && response.data.code === 100000) {
        return response.data.text;
      } else {
        return '我还不知道怎么回答你呢';
      }
    } else {
      console.log('API Error');
      return '不好意思,我现在不在线';
    }
  } catch (e) {
    console.log(e);
    return '出错了';
  }
}

总结

Serverless 框架在微信公众号应用开发中的应用,简化了开发者的工作流程,提高了应用的部署效率,为开发一个高质量的微信公众号应用提供了便捷和高效的方案。未来,Serverless 框架在微信公众号开发领域的应用将会越来越广泛。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a8e076add4f0e0ff21efdc


纠错反馈