给微信公众号加一个智能聊天机器人!

1,036 阅读2分钟

本次采用的是uniapp的云开发,使用这个的原因有:
1.免费,不需要服务器(香)
2.开发相对来说比较简单

怎么搭建环境就不多说了
这里使用的是云函数和云对象相结合进行开发,
因为这样比较简单方便切逻辑清晰

正式开始: 创建一个mess云函数内容如下

'use strict';
exports.main = async (event, context) => {
const config = {
		
		token: 'nanmu'
	}
        // 定义云对象
	const  yun= uniCloud.importObject('wx_fun')
	// 判断是否微信用户
	let iswx= await yun.verify(config.token,event.queryStringParameters)

	if(iswx){
		// 验证是绑定还是回消息
		if(event.body){
			// 获取并且回复用户消息
			let replyMessage= yun.message(event.body)
			console.log(replyMessage);
			return replyMessage	
		}else{
		// 是微信用户返回echostr
		return event.queryStringParameters.echostr	
		}
	}
        };

接下来是云对象wx_fun

//安装xml2js,用来把用户发过来的消息转成xml 安装命令:npm i xml2js
//提示用腾讯云的服务空间是不需要安装,直接使用,上传后,腾讯云会自动安装相关依赖,阿里云需要安装
    const {parseString} = require("xml2js");

//微信官方文档要求,判断是否微信用户需要对响应字段进行sha1加密
//把sha1文件里面的代码粘贴进来,或者自己想其他办法加密,只要是sha1加密就行
//文件地址:https://vkceyugu.cdn.bspapp.com/VKCEYUGU-917b34d1-30f8-42a8-95e6-7b299abf7731/82989cc2-3641-4c85-af6e-d46e7a8dfdc8.js

// 用户信息转成xml
 function parseXMLAsync(xmlData) {
		return new Promise((resolve, reject) => {
			parseString(xmlData, {
				trim: true
			}, (err, data) => {
				if (!err) {
					resolve(data);
				} else {
					reject("parseXMLAsync执行失败:" + err);
				}
			});
		});
	}
// 用户消息转成json,方便调用
      function formatMessage(jsData) {
		let message = {};
		let xml = jsData.xml;
		if (typeof xml === "object") {
                    for (let key in xml) {
			let value = xml[key];
			if (Array.isArray(value) && value.length > 0) {
				message[key] = value[0];
				}
			}
		}
		return message;
	}
        
        //云对象主体部分
   module.exports = {
	// 验证是否微信用户
	verify(token,par){
		// 将token、timestamp、nonce三个参数进行字典序排序,
		let arr = [par.timestamp, par.nonce, token]
		let arrsort = arr.sort()
		// 将三个参数字符串拼接成一个字符串进行sha1加密比较
		if (par.signature == hex_sha1(arrsort.join(''))){
			return true
		}
	},
	async message(body){
		// base64转字符串,获取用户消息,腾讯云需要转,阿里云不需要
		let	deCodeString = Buffer.from(body, 'base64').toString('utf-8');
		let jsdata = await parseXMLAsync(deCodeString)
		let userMessage = formatMessage(jsdata)
		// 如果是文本消息就回复,这里用的是青客云的api(免费)
                //青客云官网https://api.qingyunke.com/
		if(userMessage.MsgType=="text"){
let jqr=await  uniCloud.httpclient.request('http://api.qingyunke.com/api.php',{
				method:'GET',
				data:{
					key:"free",
					appid:0,
					msg:userMessage.Content
				},
			dataType:'json'
			})
	return `<xml>
                <ToUserName><![CDATA[${userMessage.FromUserName}]]></ToUserName>
		<FromUserName><![CDATA[${userMessage.ToUserName}]]></FromUserName>
		<CreateTime>${Date.now()}</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
		<Content><![CDATA[${jqr.data.content.replace(/{br}/g,'\n')}!]]></Content>
		</xml>`
					
		}
	}
}

接着是把云函数url化,具体看uniapp文档:uniapp.dcloud.io/uniCloud/ht…

最后在公众后台配置这些就大功告成 image.png

效果图,支持查天气、歌词、成语,更多功能可以查看青客云官网介绍

image.png