使用AirCode云平台,两步将ChatGPT接入微信公众号

最近很火ChatGPT可以说已经满大街可见了,到处都有各种各样的体验地址,有收费的也有免费的,总之是五花八门、花里胡哨。

所以呢,最近我就在研究怎么才能方便快捷的体验到ChatGPT的强大功能,其中一个就是:把ChatGPT接入公众号。如下图(成果图):

下面我来介绍一下具体怎么实现:

1. 首先注册一个AirCode平台账号

进入aircode官网:https://aircode.io

点击右上角Login, 可以选择github登录

注册登录之后,点击New Node.js App,建立一个应用,并起一个名字

创建之后,进入控制台界面,默认有一个云函数hello.js

把下边云函数代码复制过去

云函数代码如下:

const { db } = require('aircode');
const axios = require('axios');
const sha1 = require('sha1');
const xml2js = require('xml2js');const TOKEN = process.env.TOKEN || 'YOUR TOKEN' // 微信服务器配置 Token 注意这个token可以随便设置但是必须要与微信公众号后台配置一致
const OPENAI_KEY = process.env.OPENAI_KEY || 'YOUR API-KEY'; // OpenAI 的 Keyconst OPENAI_MODEL = process.env.MODEL || "gpt-3.5-turbo"; // 使用的 AI 模型
const OPENAI_MAX_TOKEN = process.env.MAX_TOKEN || 1024; // 最大 token 的值const LIMIT_HISTORY_MESSAGES = 50 // 限制历史会话最大条数
const CONVERSATION_MAX_AGE = 60 * 60 * 1000 // 同一会话允许最大周期,默认:1 小时
const ADJACENT_MESSAGE_MAX_INTERVAL = 10 * 60 * 1000 //同一会话相邻两条消息的最大允许间隔时间,默认:10 分钟const UNSUPPORTED_MESSAGE_TYPES = {image: '暂不支持图片消息',voice: '暂不支持语音消息',video: '暂不支持视频消息',music: '暂不支持音乐消息',news: '暂不支持图文消息',
}const WAIT_MESSAGE = `处理中 ... \n\n请稍等几秒后发送【1】查看回复`
const NO_MESSAGE = `暂无内容,请稍后回复【1】再试`
const CLEAR_MESSAGE = `✅ 记忆已清除`
const HELP_MESSAGE =  `ChatGPT 指令使用指南|    关键字  |   功能         ||      1    | 上一次问题的回复 ||   /clear  |    清除上下文   ||   /help   |   获取更多帮助  |
`const Message = db.table('messages')
const Event = db.table('events')const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));function toXML(payload, content) {const timestamp = Date.now();const { ToUserName: fromUserName, FromUserName: toUserName } = payload;return `<xml><ToUserName><![CDATA[${toUserName}]]></ToUserName><FromUserName><![CDATA[${fromUserName}]]></FromUserName><CreateTime>${timestamp}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${content}]]></Content></xml>`
}async function processCommandText({ sessionId, question }) {// 清理历史会话if (question === '/clear') {const now = new Date();await Message.where({ sessionId }).set({ deletedAt: now }).save()return CLEAR_MESSAGE;}else {return HELP_MESSAGE;}
}// 构建 prompt
async function buildOpenAIPrompt(sessionId, question) {let prompt = [];// 获取最近的历史会话const now = new Date();// const earliestAt = new Date(now.getTime() - CONVERSATION_MAX_AGE)const historyMessages = await Message.where({sessionId,deletedAt: db.exists(false),//  createdAt: db.gt(earliestAt),}).sort({ createdAt: -1 }).limit(LIMIT_HISTORY_MESSAGES).find();let lastMessageTime = now;let tokenSize = 0;for (const message of historyMessages) {// 如果历史会话记录大于 OPENAI_MAX_TOKEN 或 两次会话间隔超过 10 分钟,则停止添加历史会话const timeSinceLastMessage = lastMessageTime ? lastMessageTime - message.createdAt : 0;if (tokenSize > OPENAI_MAX_TOKEN || timeSinceLastMessage > ADJACENT_MESSAGE_MAX_INTERVAL) {break}prompt.unshift({ role: 'assistant', content: message.answer, });prompt.unshift({ role: 'user', content: message.question, });tokenSize += message.token;lastMessageTime = message.createdAt;}prompt.push({ role: 'user', content: question });return prompt;
}// 获取 OpenAI API 的回复
async function getOpenAIReply(prompt) {const data = JSON.stringify({model: OPENAI_MODEL,messages: prompt});const config = {method: 'post',maxBodyLength: Infinity,url: 'https://api.openai.com/v1/chat/completions',headers: {Authorization: `Bearer ${OPENAI_KEY}`,"Content-Type": "application/json",},data: data,timeout: 50000};try {const response = await axios(config);console.debug(`[OpenAI response] ${response.data}`);if (response.status === 429) {return {error: '问题太多了,我有点眩晕,请稍后再试'}}// 去除多余的换行return {answer: response.data.choices[0].message.content.replace("\n\n", ""),}} catch(e){console.error(e.response.data);return {error: "问题太难了 出错了. (uДu〃).",}}}// 处理文本回复消息
async function replyText(message) {const { question, sessionId, msgid } = message;// 检查是否是重试操作if (question === '1') {const now = new Date();// const earliestAt = new Date(now.getTime() - CONVERSATION_MAX_AGE)const lastMessage = await Message.where({sessionId,deletedAt: db.exists(false),//  createdAt: db.gt(earliestAt),}).sort({ createdAt: -1 }).findOne();if (lastMessage) {return `${lastMessage.question}\n------------\n${lastMessage.answer}`;}return NO_MESSAGE;}// 发送指令if (question.startsWith('/')) {return await processCommandText(message);}// OpenAI 回复内容const prompt = await buildOpenAIPrompt(sessionId, question);const { error, answer } = await getOpenAIReply(prompt);console.debug(`[OpenAI reply] sessionId: ${sessionId}; prompt: ${prompt}; question: ${question}; answer: ${answer}`);if (error) {console.error(`sessionId: ${sessionId}; question: ${question}; error: ${error}`);return error;}// 保存消息const token = question.length + answer.length;const result = await Message.save({ token, answer, ...message });console.debug(`[save message] result: ${result}`);return answer;
}// 处理微信事件消息
module.exports = async function(params, context) {const requestId = context.headers['x-aircode-request-id'];// 签名验证if (context.method === 'GET') {const _sign = sha1(new Array(TOKEN, params.timestamp, params.nonce).sort().join(''))if (_sign !== params.signature) {context.status(403)return 'Forbidden'}return params.echostr}// 解析 XML 数据let payload;xml2js.parseString(params, { explicitArray: false }, function(err, result) {if (err) {console.error(`[${requestId}] parse xml error: `, err);return}payload = result.xml;})console.debug(`[${requestId}] payload: `, payload);// 文本if (payload.MsgType === 'text') {const newMessage = {msgid: payload.MsgId,question: payload.Content.trim(),username: payload.FromUserName,sessionId: payload.FromUserName,}// 修复请求响应超时问题:如果 5 秒内 AI 没有回复,则返回等待消息const responseText = await Promise.race([replyText(newMessage),sleep(4000.0).then(() => WAIT_MESSAGE),]);return toXML(payload, responseText);}// 事件if (payload.MsgType === 'event') {// 公众号订阅if (payload.Event === 'subscribe') {return toXML(payload, HELP_MESSAGE);}}// 暂不支持的消息类型if (payload.MsgType in UNSUPPORTED_MESSAGE_TYPES) {const responseText = UNSUPPORTED_MESSAGE_TYPES[payload.MsgType];return toXML(payload, responseText);}return 'success'
}

然后我们要把引入的几个依赖安装一下

在左下角搜索并点击加号安装依赖

点击Deploy按钮发布一下云函数

等待发布完成,复制云函数链接,下边在微信公众号平台会用到

注意:

  1. token要与微信公众号中设置一致
  2. chatGPTapiKey要从openai官网获取,地址如下:https://platform.openai.com/account/api-keys

2. 第二步在微信公众平台操作

首先默认你有一个公众号,然后登录微信公众平台,点开左侧的设置与开发,点击基本设置,服务器配置那里点击修改配置

把刚才复制的云函数地址粘贴到服务器URL这里,下边的token与云函数代码中的token保持一致,下边的EncodingAESKey点击右侧随机生成就行,然后点击提交

返回token校验成功的话,我们就点击启用

启用成功之后就可以在公众号对话框与ChatGPT对话啦,快去试试吧!

有问题可加入群聊,共同讨论

最新代码地址(或见评论区): https://husanr.github.io/views/ChatGPT/aircode_wechat

使用AirCode云平台,两步将ChatGPT接入微信公众号相关推荐

  1. ChatGPT接入微信公众号(手把手教学)

    前言 本篇文章参考国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)配置,纠正了一些过时的信息. 准备 一个微信公众号 一个能访问外网的梯子 一个ChatGPT账号 有了这些就可以配置了 ...

  2. chatgpt接入微信公众号

    您好,要想将 chatgpt 接入微信公众号,您需要按照如下步骤进行操作: 在微信公众平台上注册一个订阅号或服务号. 创建一个 chatgpt 的机器人,并获取它的 API 密钥. 在微信公众平台上设 ...

  3. chatgpt接入微信公众号的详细教程

    好的,我会尽力帮你. ChatGPT 是一个使用 GPT-3 模型的聊天机器人框架,可以帮助你在微信公众号上快速构建聊天机器人. 要将 ChatGPT 接入微信公众号,你需要按照以下步骤操作: 准备工 ...

  4. 手把手教你如何将chatgpt接入微信公众号

    **众所周知,今年以来话题度最高的莫过于chatgpt,ChatGPT是一种基于GPT-3.5架构的大型语言模型,由OpenAI开发.它可以处理多种语言,包括英语.中文等等.ChatGPT通过在大量的 ...

  5. 两步完成自定义菜单——微信公众号测试号

    1. 获取access_token: 进入测试号,并在微信公众平台接口调试工具上获取access_token. 测试号入口 微信接口调试工具入口 2. 自定义菜单: 将第一步获取的access_tok ...

  6. 简述ChatGPT和微信公众号结合的前景和应用

    引言 随着人工智能的迅速发展和应用,ChatGPT已经成为人们在智能交互领域的新宠.微信公众号作为一个开放.高效.广泛使用的社交平台,与ChatGPT的结合必将创造更多的机会和应用前景.本文将介绍Ch ...

  7. (只需五步)ChatGPT接入微信的攻略

    先来看下用弱智问题对战ChatGPT的效果: 再看看程序代码能力: 你也可以用它来写作业学习: 接下来,就是把ChatGPT接入微信的教程: 一共五步,很简单的: 1.进入openAI api 官网登 ...

  8. 腾讯云+CentOS 7.2+python:搭建微信公众号后台入门教程

    因为想自己编写微信公众号后台的程序,实现一些小功能,为以后的开发做准备,所以就从零开始,摸索着注册微信公众号,租用服务器,搭建环境进行开发. 简单的搭建过程中也经历了一些波折,踩了不少坑,仅留此文给跟 ...

  9. java微信开发平台_Java微信公众平台开发(1) 接入微信公众平台

    前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 通 ...

最新文章

  1. 美团在Redis上踩过的一些坑-4.redis内存使用优化
  2. python正则匹配_Python正则表达式只匹配一次
  3. 计算机网络之数据链路层:6、后退N帧协议(GBN)
  4. 【今日CV 计算机视觉论文速览】 6 Mar 2019
  5. 要不要引入新技术?先思考这几个问题
  6. 学JS必读,《JavaScript高级程序设计(第3版)》
  7. java 后端处理PDF图册
  8. java tm插件下载_Java(TM) Platform SE binary
  9. 微信小程序php签到功能,微信小程序签到功能
  10. 使用阿里云安装基础软件
  11. python输入1234输出4321_求一个C语言程序:输入正整数,要求以相反数顺序输出该数。如输入1234,输出4321....
  12. PLC无线通讯方案详解GRM110
  13. java通过poi操作ppt
  14. 用浏览器收藏夹的书签保存javascript的简单脚本
  15. 虚拟地址和物理地址及其映射
  16. js相关面试题20道
  17. python用input输入字典_输入字典python_python输入字典_python用input输入字典 - 云+社区 - 腾讯云...
  18. Unifier培训: 系列讲解13:公司级的BP--供应商评估
  19. Retrofit2 工作原理解析(一)
  20. python画六角图_采用计量六角图判断高压计量接线速学版-资源下载人人文库网...

热门文章

  1. 阿里云云服务器安装Tomcat的坑(tomcat已启动+防火墙已关闭but浏览器就是打不开首页)
  2. 多租户与多用户的区别
  3. HTC手机解锁 root 刷机的各种问题
  4. Java利用键盘接收来做简单的题目
  5. 腾讯QQ疑泄露用户身份证姓名!!(QQ推荐备注)
  6. SAP中定义留存收益科目
  7. Joomla!模板如何工作
  8. 权利的角斗场中 Web3 终将得胜
  9. 文本预处理的一些知识
  10. javancss中的NCSS和CCN