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

news2025/4/6 22:30:53

前言

本篇文章参考国内服务器 3 分钟将 ChatGPT 接入微信公众号(超详细)配置,纠正了一些过时的信息。

准备

一个微信公众号
一个能访问外网的梯子
一个ChatGPT账号

有了这些就可以配置了

注册免费服务器,并部署代码

前往Laf https://laf.run/ 注册一个账号,手机号注册即可。注意,别进到国外的了
file
点击新建项目
file
名称随便什么都可以,根据自己的喜好
file
创建好过后是这个样子,我们点击开发进入编程页面
file
进入后添加npm依赖
file
搜索chatgpt,添加第一个,保存并重启
file
然后新建一个函数
file
函数名字也随便取一个
file
然后将下列代码粘进去

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

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

// 不支持的消息类型
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;
  }
	
// 处理文本回复消息
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('11')) {
    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: OPENAI_ACCESS_TOKEN,
    apiReverseProxyUrl: "https://ai.fakeopen.com/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 === '11') {
    const res = await Message.where({ sessionId }).remove({ multi: true })
    return CLEAR_MESSAGE;
  } else {
    return HELP_MESSAGE;
  }
}

代码中有四个需要讲的点

  • file
  • const token 123456 随意配置,一会要用
  • OPENAI_ACCESS_TOKEN, 这个就是聊天的token

怎么获取呢你
,需要先在浏览器中登录 ChatGPT 网页版,然后在浏览器中新建标签页访问这个 URL:https://chat.openai.com/api/auth/session 它会返回一个 JSON,里面包含了 accessToken 字段,将这个字段的值复制到代码中的OPENAI_ACCESS_TOKEN中即可。

  • apiReverseProxyUrl
    这个URL可能变化,原文就变了 现在用的是"https://ai.fakeopen.com/api/conversation" 还能用,如果以后用不了了请参考ChatGPTUnofficialProxyAPI 的使用文档

最后点击发布即可一键部署

公众号配置

登录微信公众平台,点击设置与开发
file
点击「基本设置」,然后点击「服务器配置」,服务器配置那里点击修改配置:
file
这里的URL就是之前上文在laf发布旁边的网址
这里的Token就是之前上文在代码中的const token = ‘123456’;
EncodingAESKey随机生成,提交后启用即可
file

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

参考文档
https://juejin.cn/post/7221716906334994489
ChatGPTUnofficialProxyAPI 的使用文档
https://github.com/husanr/wechat_gpt_laf

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CloudCompare二次开发之如何通过PCL进行点云配准?

文章目录 0.引言1.CloudCompare界面设计配准(registrate)按钮2.ICP配准&#xff08;ICP_Reg&#xff09;3.多幅点云逐步配准&#xff08;Many_Reg&#xff09; 0.引言 因笔者课题涉及点云处理&#xff0c;需要通过PCL进行点云数据一系列处理分析&#xff0c;查阅现有网络资料&a…

ChatgGPT生成Excel统计公式

需求背景 编写excel公式&#xff0c;提取下图中符号之前的内容并填充到“修改后的内容”这一列 流程思路 借助ChatGPT完成Excel公式的大致流程如下&#xff1a; 确定要解决的问题&#xff1a;明确你需要在Excel中实现的具体任务或计算需求。例如&#xff0c;求和、平均值、…

优思学院|用ChatGPT人工智能制作FMEA可以吗?

问题和缺陷是昂贵的&#xff0c;它们是质量成本的主要构成部分。同时&#xff0c;顾客可以对制造商和服务提供商抱有很高的期望&#xff0c;希望他们提供高质量和高可靠性。 通常&#xff0c;很多企业只会在产品和服务的开发后期&#xff0c;通过广泛的测试和檢查来发现问题。…

提高 Maya 渲染质量和速度的4个小技巧

Autodesk Maya&#xff0c;通常简称为Maya&#xff0c;是一种3D计算机图形应用程序&#xff0c;可在Windows、macOS和Linux上运行&#xff0c;最初由Alias开发&#xff0c;目前由Autodesk拥有和开发。它用于为交互式3D应用程序、动画电影、电视剧和视觉效果创建资产。 您可以通…

以 29K 成功入职字节跳动,这份《 软件测试面试笔记》让我受益匪浅

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给小伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了简历&#xff0c;4月的时候经过了3轮面试收…

【C++】4. 类和对象终章

专栏导读 &#x1f341;作者简介&#xff1a;余悸&#xff0c;在读本科生一枚&#xff0c;致力于 C方向学习。 &#x1f341;收录于 C专栏&#xff0c;本专栏主要内容为 C初阶、 C 进阶、STL 详解等&#xff0c;持续更新中&#xff01; &#x1f341;相关专栏推荐&#xff1a; …

做F牌独立站要做好功课,拒绝被割韭菜!

做过爆品独立站的朋友们都知道&#xff0c;遇到爆品不容易&#xff0c;很多都具有滞后性&#xff0c;都是当你发现了之后&#xff0c;这个帖子/视频/产品已经被人跑烂了&#xff0c;你再去跑&#xff0c;这样只会浪费大量的广告费。既然爆品独立站的广告费烧不过大卖&#xff0…

知识图谱学习笔记——(五)知识图谱推理

一、知识学习 声明&#xff1a;知识学习中本文主体按照浙江大学陈华钧教授的《知识图谱》公开课讲义进行介绍&#xff0c;并个别地方加入了自己的注释和思考&#xff0c;希望大家尊重陈华钧教授的知识产权&#xff0c;在使用时加上出处。感谢陈华钧教授。 &#xff08;一&…

Java配置方式使用Spring MVC:实战练习

文章目录 续写任务1、创建登录页面、登录成功与登录失败页面1、创建登录页面2、创建登录成功页面3、创建登录失败页面 任务2、首页添加登录链接&#xff0c;单击可跳转到登录页面1、 修改首页&#xff0c;添加超链接2、修改Spring MVC配置类&#xff0c;定义视图控制器3、创建登…

Spark - 创建 _SUCCESS 文件与获取最新可用文件

目录 一.引言 二.增加 _SUCCESS 标识 1.SparkContext 生成 2.FileSystem 生成 3.Hadoop 生成 三.获取最新文件 1.获取 SparkContext 2.按照时间排序 3.遍历生成 Input 四.总结 一.引言 有任务需要每小时生成多个 split 文件分片&#xff0c;为了保证线上任务读取最新…

Linux实操篇---常用的基本命令5(进程管理类和crontab系统定时任务)

一、进程管理类 进程是正在执行的一个程序或命令&#xff0c;每一个进程都是一个运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占用一定的系统资源。 守护进程和系统服务就是一一对应的关系。 有系统级别的进程和用户级别的进程。 进程管理&#xff1a;所有的进…

如何使用自定义知识库构建自定义ChatGPT机器人

目录 隐藏 使用自定义数据源为您的 ChatGPT 机器人提供数据 1. 通过Prompt提示工程提供数据 2. 使用 LlamaIndex&#xff08;GPT 索引&#xff09;扩展 ChatGPT 如何添加自定义数据源 先决条件 怎么运行的 最后的总结 使用自定义数据源为您的 ChatGPT 机器人提供数据…

rt-thread启动流程

资料下载 RT-Thread Simulator 例程 操作流程 将上面的仿真例程下载并解压&#xff0c;通过MDK打开&#xff0c;编译&#xff0c;调试&#xff0c;并打开串口点击运行&#xff0c;就可以看到如下输出了&#xff1a; 添加自己的 thread&#xff1a;在main()函数中添加即可&am…

[Java基础]基本概念(上)(标识符,关键字,基本数据类型)

hello 大家好&#xff0c;计算机语言各有不同&#xff0c;但本质上都是操作内存和计算。这章的内容是介绍Java中的基本概念展开&#xff0c;包括&#xff1a;标识符&#xff0c;关键字&#xff0c;Java基本数据类型&#xff0c;运算符&#xff0c;表达式和语句&#xff0c;分支…

前端架构师-week6-require源码解析

require 源码解析——彻底搞懂 npm 模块加载原理 require 的使用场景 加载模块类型 加载内置模块&#xff1a;require(fs)加载 node_modules 模块&#xff1a;require(ejs)加载本地模块&#xff1a;require(./utils)支持文件类型 加载 .js 文件加载 .mjs 文件加载 .json 文件…

AI女友同时和1000人谈恋爱,狂赚500万

AI女友&#xff0c;预计暴赚4亿 要说当下什么最火&#xff0c;AI首当其冲无可置疑。00后网络红人红卡琳玛乔丽&#xff08;Caryn Marjorie&#xff09;最近与Forever Voices公司合作&#xff0c;通过视频训练等方式打造出个人形象、声音和性格的AI虚拟女友&#xff0c;就像在和…

Redis高可用--持久化

在Web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准实在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提提供正常服务&a…

大疆无人机 MobileSDK(遥控器/手机端)开发 v4版<3>

导读 第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。 航线规划 1)航线打点 点击 按钮进行打点,在地图中手动选择点位选择完成后点击**[完成]**按钮,即可完成航线打点…

新展预告 | YT U LOVE——许峰个展即将亮相!

深圳东方美术馆荣幸地宣布&#xff0c;将于5月20日呈现艺术家许峰在鹏城的首次个展“YT U LOVE”&#xff0c;展出艺术家从2020年至2023年创作的油画、纸本及雕塑40余件作品。此次展览以“YT U LOVE”为题&#xff0c;恰逢兔年&#xff0c;yutu在中国意指玉兔&#xff0c;前后两…

美创科技首家互联网医院数据安全建设案例实践

互联网医院作为医疗服务模式创新发展的新产物&#xff0c;在各项配套政策支持下快速发展。然而&#xff0c;蓬勃之势下&#xff0c;无数双“暗夜之手”也在蠢蠢欲动&#xff0c;试图从中渔利&#xff0c;关乎患者隐私、种类繁多的医疗数据迎来愈加严峻的安全挑战。 某市中心医院…