国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)

这篇具有很好参考价值的文章主要介绍了国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

所以呢,最近我就在研究怎么才能方便快捷的体验到ChatGPT的强大功能,其中一个就是:把ChatGPT接入公众号。毕竟公众号是一种非常流行的社交媒体平台,可以用来提供服务、推广产品等。经过我的一番折腾,最后终于成功通过 Laf实现了这个需求。

chatgptunofficialproxyapi,docker;kubernetes;

本文将详细介绍如何使用 Laf 云平台将 ChatGPT 接入微信公众号,实现智能问答、聊天机器人等功能。

1. 准备工作

首先需要注册一个 Laf 平台账号:https://laf.run

注册登录之后,点击新建,建立一个应用:

chatgptunofficialproxyapi,docker;kubernetes;

点击开发,进入应用开发界面:

chatgptunofficialproxyapi,docker;kubernetes;

然后输入 chatgpt 并回车进行搜索,选择第一个搜索结果,保存并重启:

chatgptunofficialproxyapi,docker;kubernetes;

重启之后,自定义依赖项中便出现了 chatgpt。

chatgptunofficialproxyapi,docker;kubernetes;

新建云函数

然后我们点击函数,函数列表右侧的加号,新增一个可以接入微信公众号的 ChatGPT 云函数:

chatgptunofficialproxyapi,docker;kubernetes;

云函数完整代码如下:

// 引入crypto和cloud模块
import * as crypto from 'crypto';
import cloud from '@lafjs/cloud';

const WAIT_MESSAGE = `处理中 ... \n\n请稍等3秒后发送【1】查看回复`
const NO_MESSAGE = `暂无内容,请稍后回复【1】再试`
const CLEAR_MESSAGE = `✅ 记忆已清除`
const HELP_MESSAGE = `ChatGPT 指令使用指南
   |    关键字  |   功能         |
   |      1    | 上一次问题的回复 |
   |   /clear  |    清除上下文   |
   |   /help   |   获取更多帮助  |
  `

// 不支持的消息类型
const UNSUPPORTED_MESSAGE_TYPES = {
  image: '暂不支持图片消息',
  voice: '暂不支持语音消息',
  video: '暂不支持视频消息',
  music: '暂不支持音乐消息',
  news: '暂不支持图文消息',
}

// 定义休眠函数
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

// 创建数据库连接并获取Message集合
const db = cloud.database();
const Message = db.collection('messages')

// 处理接收到的微信公众号消息
export async function main(event) {
  const { signature, timestamp, nonce, echostr } = event.query;
  const token = '123456';

  // 验证消息是否合法,若不合法则返回错误信息
  if (!verifySignature(signature, timestamp, nonce, token)) {
    return 'Invalid signature';
  }

  // 如果是首次验证,则返回 echostr 给微信服务器
  if (echostr) {
    return echostr;
  }

  // 处理接收到的消息
  const payload = event.body.xml;
  // console.log("payload",payload)
  // 文本消息
  if (payload.msgtype[0] === 'text') {
    const newMessage = {
      msgid: payload.msgid[0],
      question: payload.content[0].trim(),
      username: payload.fromusername[0],
      sessionId: payload.fromusername[0],
      createdAt: Date.now()
    }

    // 修复请求响应超时问题:如果 5 秒内 AI 没有回复,则返回等待消息
    const responseText = await Promise.race([
      replyText(newMessage),
      sleep(4000.0).then(() => WAIT_MESSAGE),
    ]);
    return toXML(payload, responseText);
  }

  // 公众号事件
  if (payload.msgtype[0] === 'event') {
    // 公众号订阅
    if (payload.event[0] === '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'
}


// 处理文本回复消息
async function replyText(message) {
  const { question, sessionId } = message;
  console.log("replyText 执行了")
  // 检查是否是重试操作,如果是重试操作,返回上一次的回复
  if (question === '1') {
    const lastMessage = await Message.where({
      sessionId
    }).orderBy("createdAt", "desc").get();
    if (lastMessage.data[0]) {
      return `${lastMessage.data[0].question}\n------------\n${lastMessage.data[0].answer}`;
    }

    return NO_MESSAGE;
  }

  // 获取上下文 id
  const res = await Message.where({
    sessionId
  }).orderBy("createdAt", "desc").getOne();

  const parentId = res?.data?.parentMessageId
  const conId = res?.data?.conversationId


  // 发送指令
  if (question.startsWith('/')) {
    return await processCommandText(message);
  }

  // 获取 OpenAI 回复内容
  const { error, answer, parentMessageId, conversationId } = await getOpenAIReply(question, parentId, conId);
  if (error) {
    console.error(`sessionId: ${sessionId}; question: ${question}; error: ${error}`);
    return error;
  }

  // 将消息保存到数据库中
  const token = question.length + answer.length;
  const result = await Message.add({ token, answer, parentMessageId, conversationId, ...message });
  console.debug(`[save message] result: ${result}`);

  return answer;
}

// 获取 OpenAI API 的回复
async function getOpenAIReply(question, parentId, conId) {
  console.log("getOpenAIReply 执行了")
  // 引入 ChatGPTUnofficialProxyAPI 模块
  const { ChatGPTUnofficialProxyAPI } = await import('chatgpt')
  // 创建 ChatGPTUnofficialProxyAPI 实例
  const api = new ChatGPTUnofficialProxyAPI({
    accessToken: cloud.env.ACCESSTOKEN,
    apiReverseProxyUrl: "https://bypass.churchless.tech/api/conversation"
  })


  try {
    // 如果有上下文 id,就带上
    let res;

    if (parentId && conId) {
      res = await api.sendMessage(question, { conversationId: conId, parentMessageId: parentId })
    } else {
      res = await api.sendMessage(question)
    }
    // 返回 OpenAI 回复的内容及上下文 id
    return { answer: res.text.replace("\n\n", ""), parentMessageId: res.parentMessageId, conversationId: res.conversationId }

  } catch (e) {
    console.log(e)
    return {
      error: "问题太难了 出错了. (uДu〃).",
    }
  }

}

// 校验微信服务器发送的消息是否合法
function verifySignature(signature, timestamp, nonce, token) {
  const arr = [token, timestamp, nonce].sort();
  const str = arr.join('');
  const sha1 = crypto.createHash('sha1');
  sha1.update(str);
  return sha1.digest('hex') === signature;
}

// 返回组装 xml
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 res = await Message.where({ sessionId }).remove({ multi: true })
    return CLEAR_MESSAGE;
  } else {
    return HELP_MESSAGE;
  }
}

由于 OpenAI 的 API Key 需要充值才能用,所以我们选择剑走偏锋,直接使用 ChatGPT 网页版。但是国内环境无法访问 ChatGPT,所以我们需要一个 Proxy。不用担心,国外已经有热心小哥给我们提供了公共的 Proxy,我们只需要直接调用就好啦!

chatgptunofficialproxyapi,docker;kubernetes;

详情可参考 ChatGPTUnofficialProxyAPI 的使用文档。

只要你有 ChatGPT 账号,都可以使用这种方法,最🐮🍺的是,你可以直接在 Laf 的国内环境 https://laf.run 中使用!!!

核心函数:

  • getOpenAIReply函数通过引入ChatGPTUnofficialProxyAPI模块,创建实例并调用其方法,获取 ChatGPT 的回复内容。

  • verifySignature函数用于校验微信服务器发送的消息是否合法。

  • toXML函数将回复内容组装成XML格式。

  • processCommandText函数用于处理指令,目前支持清除历史会话和获取帮助信息两个指令

  • 注意:

    • token要与微信公众号中设置一致。
    • ACCESSTOKEN 的获取方式:你需要先在浏览器中登录 ChatGPT 网页版,然后在浏览器中访问这个 URL:https://chat.openai.com/api/auth/session,浏览器会返回一个 JSON,里面包含了 accessToken 字段,将这个字段的值复制即可。 云函数写完之后就点击发布,左侧的接口地址要保存一下,稍后将在微信公众号中使用此地址。

chatgptunofficialproxyapi,docker;kubernetes;

配置微信公众号

这一步我们需要在微信公众号平台上配置开发者信息,并将服务器地址设置为部署好的云函数服务地址。步骤如下:

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

chatgptunofficialproxyapi,docker;kubernetes;

将云函数服务地址复制到「服务器 URL」中,下边的 Token 与云函数代码中的 token 保持一致,下边的 EncodingAESKey 点击右侧随机生成就行,然后点击提交:

chatgptunofficialproxyapi,docker;kubernetes;

返回 token 校验成功后,点击「启用」即可。

chatgptunofficialproxyapi,docker;kubernetes;

现在你已经完成了所有必要的设置和配置,下面就可以直接进入微信公众号「Laf 开发者」后台与机器人进行交互啦!

chatgptunofficialproxyapi,docker;kubernetes;

ChatGPT 机器人可以回答用户提出的问题,并且可以根据用户提供的上下文进行回复。以下是一些指令和关键字,可以帮助您更好地使用 ChatGPT 机器人:

  • 【1】:获取上一次问题的回复。
  • /clear:清除上下文。
  • /help:获取更多帮助。除了以上指令和关键字外,你还可以根据自己的需求进行定制化开发,以满足用户的需求。

chatgptunofficialproxyapi,docker;kubernetes;

总结

通过以上步骤,您已经成功地将 ChatGPT 接入微信公众号,并使用 Laf 平台来部署 ChatGPT 云函数。这样,您就可以在公众号中为您的用户提供智能问答、聊天机器人等服务了,微信公众号自带的自动回复功能可以抛弃了。

当然,直接接入 ChatGPT 网页版肯定没有接入 API 稳定,如果你想通过 API 的方式接入,可以参考原作者的官方仓库:

https://github.com/husanr/wechat_gpt_laf sealos 以kubernetes为内核的云操作系统发行版,让云原生简单普及

laf 写代码像写博客一样简单,什么docker kubernetes统统不关心,我只关心写业务!文章来源地址https://www.toymoban.com/news/detail-833854.html

到了这里,关于国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 20 分钟搭建一个串流服务器

    步骤1:准备Nginx RTMP容器 首先,您可以使用官方的Nginx RTMP Docker镜像来创建Nginx RTMP容器。运行以下命令: 这将在后台运行Nginx RTMP容器,将本地1935端口映射到容器的1935端口。 步骤2:准备FFmpeg容器 接下来,您可以创建一个自定义的FFmpeg容器,用于将本地视频流传输到Nginx RT

    2024年02月06日
    浏览(44)
  • 探索KeyarchOS:国内服务器之光

    近年来,我国操作系统技术取得了长足的进步,越来越多的国内操作系统开始崭露头角。KeyarchOS作为浪潮信息自主研发的一款服务器操作系统 , 不仅兼容CentOS生态产品和创新技术产品,还具备性能和稳定性、安全性、可扩展性等特点 。在这里,我们通过案例、技术对比和实

    2024年01月23日
    浏览(43)
  • 国内服务器绕过备案详细教程

    国内服务器绕过备案详细教程 国内服务器绕备案其实都是通过反代的方法来实现 1.首先我们了解到服务器的80端口与443端口 web默认端口是:80 SSL证书默认端口是:443 国内服务器绑定域名后默认都是80 如果域名没有备案就会提示:未备案拦截! 既然80、443端口绑定未备案域名

    2024年02月05日
    浏览(46)
  • 15分钟搭建无门槛服务器性能监控系统,让你的服务器运行如飞!

    服务器监控是每个互联网厂商都重视并且想要尽可能做好的事情,从数据收集、数据处理、数据可视化最终再到实时监控告警,这一系列复杂的流程可能耗费企业大量的人力和时间,以至于某些时候因为其复杂性高无法达到预期的监控效果。而当事故发生时才发现,由于监控

    2024年01月22日
    浏览(55)
  • 国内外DNS服务器地址列表

    DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址。目前国内电信运营商通过使用DNS劫持的方法,干扰用户正常上网,使得用户无法访问Google、Gmail、Google AdSense、Google Maps等常用服务,昨天我介绍了使用OpenDNS的方法解决

    2024年02月06日
    浏览(40)
  • 最佳实践 · 塔石串口服务器接入 MODBUS 物联网平台

    串口服务器是为RS-232/RS-485/RS-422终端到TCP/IP之间完成数据转换的通讯接口协议转换器。提供RS-232终端与TCP/IP网络的数据双向透明传输,提供串口转TCP/IP功能,RS-232/RS-485/RS-422转TCP/IP的解决方案。可以让RS-232/RS-485/RS-422串口设备立即联接网络。 串口通讯服务器其实就是串口服务器

    2024年02月16日
    浏览(44)
  • 教你如何使用云服务器搭建我的世界Minecraft服务器(超级简单-10分钟完成)

    一个人玩游戏没啥意思,和朋友一块联机呢,距离太远,家庭局域网宽带又没有公网ip,你的朋友没办法与你联机,然而你只需要一台服务器即可搞定了;但是很多用户没没接触过相关的内容,具体的该怎么操作呢?下面我将吧详细的教程分享给大家,适合完全零基础,跟着

    2024年02月07日
    浏览(52)
  • 一分钟教你搭建《幻兽帕鲁》服务器

    幻兽帕鲁是一款由Pocketpair开发的开放世界生存游戏,融合了多种玩法的游戏,其独特的题材和画风吸引了很多玩家,越来越多的玩家开始尝试自己搭建服务器,享受更加自由的游戏体验。本文将为大家详细介绍如何从零开始搭建《幻兽帕鲁》服务器,让大家轻松成为游戏中的

    2024年02月21日
    浏览(40)
  • Unity接入IAP、服务器验单(Google Play)

    最近因为项目需要,被分配来做项目SDK接入以及上架相关事宜。搞了好几天关于Unity接入支付的SDK,接入很简单,卡的最久的就是服务器验单,google相关文档也不是很全,走通之后觉得可以发出来共享一下,第一次写文章,有什么不足多多见谅 Unity已经集成了Google Pay、Apple

    2023年04月11日
    浏览(43)
  • 幻兽帕鲁服务器价格贵吗?1分钟搞定幻兽帕鲁游戏联机服务器搭建

    幻兽帕鲁服务器价格多少?腾讯云幻兽帕鲁游戏服务器多少钱?腾讯云幻兽帕鲁游戏服务器的费用取决于多个因素,包括配置、带宽、地区等。一般来说,腾讯云的游戏服务器租用价格需要根据具体的配置和租用时间进行计算。 对于4核16G的配置,腾讯云提供不同时长的费用

    2024年02月21日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包