原文链接:https://forum.laf.run/d/556

FastGPT 是一个超级的 ChatGPT 平台项目,功能非常强大:

集成了 ChatGPT、GPT4 和 Claude

可以使用任意文本来训练自己的知识库、文档库,而且知识库专有模型可以限定为“只能回答知识库相关问题,其他问题一律不予回答”

开放模型市场,其中有一个非常暴躁的模型叫暴躁小哥

提供 API,你可以通过 API 的形式接入到自己的应用中,例如:飞书、企业微信、客服助手、公众号等

可自定义 OpenAI API Key

链接:https://fastgpt.run/?inviterId=64215e9914d068bf840141d0

而 Laf 是一款为所有开发者打造的集函数、数据库、存储为一体的云开发平台,助你像写博客一样写代码,随时随地发布上线应用!3 分钟上线 ChatGPT 应用!

官网(国内):https://laf.run

官网(海外):https://laf.dev

这篇文章教你用两分半的时间,利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信。

条件

  1. 你需要有企业微信管理权限
  2. 你需要一个 FastGPT账号
  3. 你需要一个Laf(国区)账号

企业微信需要使用已经备案的域名,所以这里需要用国区的域名。点击这里可以参考企业微信详细说明

FastGPT操作

  1. 前往“AI助手”页面,创建一个AI助手,并记录这里的modelId(用FASTGPT_MODEL_ID表示)

  1. 前往“开发”页面,创建一个API KEY,记录这里的API KEY 为 FASTGPT_APIKEY

企业微信操作

  1. 进入企业微信管理后台-我的企业,记录这里的企业ID为 WXWORK_CORPID

  1. 进入应用管理页面,点击【创建应用】进入创建页面,填写应用信息后点击【创建应用】。如果已经有现成的应用,可以跳过此步骤。

  1. 在应用管理页面点击刚刚创建好的应用,进入应用详情页面。记录这里的AgentId和Secret(需要点击获取按钮,在企业微信聊天窗口里面获取),分别为WXWORK_AGENTID和WXWORK_CORPSECRET。

  1. 在应用详情页面,接收消息处点击【设置API接收】。

在API接收消息页面,点一下两个【随机获取】按钮,它会自动生成一个Token和EncodingAESKey,我们分别记为WXWORK_TOKEN和WXWORK_AESKEY。注意,不要关掉这个页面,Laf侧配置完毕后我们再来填写URL。

Laf 操作

  1. 进入Laf控制台,新建一个应用。

  1. 进入开发页面,先安装两个npm依赖:
  • xml2js
  • @wecom/crypto

  1. 创建一个云函数 chatgpt(不可改名),取消所有请求方法,填写下面的代码并发布。
import cloud from '@lafjs/cloud'

export async function sendGptMessage(message) {
console.log('send gpt message', message)
const res = await cloud.fetch({
url: 'https://fastgpt.run/api/openapi/chat/chat',
method: 'POST',
headers: {
apikey: process.env.FASTGPT_APIKEY
},
data: {
"modelId": process.env.FASTGPT_MODEL_ID,
"isStream": false,
"prompts": [
{
"obj": "Human",
"value": message
},
]
}
})
console.log('send gpt message result', res?.data)
return res.data?.data
}
  1. 创建一个云函数 wxwork(不可改名),取消所有请求方法,填写下面的代码并发布。
import cloud from '@lafjs/cloud'

export async function getToken() {
const cache = cloud.shared.get('access-token')
console.log('checking cache', cache, cache.expires >= Date.now())
if (cache && cache.expires >= Date.now()) return cache.token;
console.log('start to get token of', process.env.WXWORK_CORPID) const res = await cloud.fetch({
url: 'https://qyapi.weixin.qq.com/cgi-bin/gettoken',
method: 'get',
params: {
corpid: process.env.WXWORK_CORPID,
corpsecret: process.env.WXWORK_CORPSECRET,
}
})
const token = res.data.access_token
cloud.shared.set('access-token', { token, expires: Date.now() + res.data.expires_in * 1000 })
return token
} export async function sendMessage(message, user) {
console.log('send messagge', user, message)
const res = await cloud.fetch({
url: 'https://qyapi.weixin.qq.com/cgi-bin/message/send',
method: 'POST',
params: {
access_token: await getToken()
},
data: {
"touser": user,
"msgtype": "text",
"agentid": process.env.WXWORK_AGENTID,
"text": {
"content": message
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
})
console.log('send message result', res.data)
}
  1. 创建一个云函数wxwork-gpt-api (随便改名),开放GET和POST请求,填写下面的代码并发布。
import cloud from '@lafjs/cloud'
import { decrypt, getSignature } from '@wecom/crypto';
import { sendMessage } from '@/wxwork'
import { sendGptMessage } from '@/chatgpt'
import xml2js from 'xml2js'; export default async function (ctx: FunctionContext) {
const { query } = ctx;
const { msg_signature, timestamp, nonce, echostr } = query;
const token = process.env.WXWORK_TOKEN;
const key = process.env.WXWORK_AESKEY;
console.log('start to invoke wxwork-gpt-api') // 签名验证专用
if (ctx.method === 'GET') {
const signature = getSignature(token, timestamp, nonce, echostr);
if (signature !== msg_signature) {
return { message: '签名验证失败', code: 401 }
}
const { message } = decrypt(key, echostr);
return message
} const payload = ctx.body.xml;
const encrypt = payload.encrypt[0];
const signature = getSignature(token, timestamp, nonce, encrypt);
if (signature !== msg_signature) {
return { message: '签名验证失败', code: 401 }
}
//ctx.response.sendStatus(200);
const { message } = decrypt(key, encrypt);
const {
xml
} = await xml2js.parseStringPromise(message)
// 由于GPT API耗时较久,这里提前返回,防止企业微信超时重试,后续再手动调用发消息接口
ctx.response.sendStatus(200);
await asyncSendMessage(xml)
return { message: true, code: 0 }
} async function asyncSendMessage(xml) {
if (xml.MsgType[0] !== 'text') return;
sendMessage('AI思考中, 请耐心等待~~', xml.FromUserName[0])
try {
const result = await sendGptMessage(xml.Content[0])
await sendMessage(result, xml.FromUserName[0])
}
catch (e){
console.log(e, e.config)
sendMessage('接口请求失败,请联系管理员查看错误信息', xml.FromUserName[0])
}
}
  1. 点击左下角设置,选择环境变量,将刚刚收集的WXWORK_TOKEN、WXWORK_AESKEY、WXWORK_CORPID、WXWORK_AGENTID、WXWORK_CORPSECRET、FASTGPT_APIKEY、FASTGPT_MODEL_ID 填入,并点击更新按钮。

  1. 复制 wxwork-gpt-api 这个云函数的调用地址,将它填写到企业微信管理后台【API接收消息】页面中的URL中,并保存上述信息。

  1. 在企业微信中,进入你刚刚创建的应用,就可以跟机器人愉快的聊天了~~

3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信的更多相关文章

  1. 把ChatGPT配置到微信群里,可以对AI提问了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:用的很爽! 自从小傅哥用上 ChatGPT 连搜索引擎用的都不多了,很多问题的检索我 ...

  2. 企业微信集成openai实现ChatGPT机器人

    背景: 现在网上查资料,痛点太多了,什么广告,什么重复的,对于程序员的我来说,简直是无语 最近接触到ChatGpt,问了些技术问题,答的比某度好,甚至可以写代码,真的太棒了 因此想写个专门的机器人,给 ...

  3. 将 ChatGPT 接入 Zabbix 为告警提供修复建议(对接钉钉)

    1.如果接企业微信请参考下面的文章 https://www.txisfine.cn/archives/9c078bb7.html 感谢上述文章的作者提供的思路 ChatGPT 是最近很火的 AI 智能 ...

  4. 3分钟利用TurnipBit制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 TurnipBit(www.turnipbit.com)是一个面向青少年的开发板 ...

  5. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  6. 又花了半个小时将 ChatGPT 接入了钉钉机器人

    前面的文章给大家介绍了如何在个人微信中使用 ChatGPT,但是大家都知道这种操作是有风险的,所以都让大家使用小号,今天再给大家介绍一下如何在钉钉中使用机器人来调戏 AI. 流程 注册钉钉开发者平台账 ...

  7. 利用:before和:after伪类制作类似微信对话框

    今天学到了怎么做一个小三角形,进而结合其他属性把类似微信对话框的图形做出来了. 先做出如下形状: .arrow { width: 30px; height:30px; border-width:20p ...

  8. 利用PBfunc在Powerbuilder中使用https获取微信的AccessToken

    在前篇中讲解了使用PBFunc在Powerbuilder自己进行http的GET和POST操作. 本篇简单用代码演示下https的微信AccessToken的获取: n_pbfunc_http lnv ...

  9. 利用LibreOffice与ImageMagick将网页分享至微信

    现在越来越多的内容分享都是在微信上进行了.然而,若想将电脑浏览器中看到的感兴趣的网页分享至微信,则只能以纯文本的方式粘贴超级链接,而不能直接拷贝图文混排的HTML.因此,我想到不妨借助LibreOff ...

  10. 短信利用weixin://connectToFreeWifi/?apKey=协议跳转到微信打开落地页h5

    微信门店wifi接口,任意站跳转,跳转二维码长按识别加粉,接口支持动态传参数,支持微信支付等特殊接口对接. 代码如下使用 <head> <meta charset="utf ...

随机推荐

  1. 解析极限编程-拥抱变化_V2

    作者:Kent Beck 第一章 极限编程定义 XP(极限编程):extreme programming,适用于中小型团队在需求不明确或迅速变化的情况下进行软件开发的轻量级方法学. 第二章 学习开车 ...

  2. Spring配置类为什么要分Full和Lite模式

    本文基于Spring 5.2.15-RELEASE 关于Spring配置类的Full模式和Lite模式,如果没有仔细阅读过源码或者官方文档的话,估计很多人都不知道这个概念.所以我们先来解释下这两个概念 ...

  3. 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计

    前言 设计模式是一种高级编程技巧,也是一种通用的解决方案.它能在不同的应用场景中使用,它可以提高代码的可读性.可复用性和可维护性.设计模式的学习能提高我们的编程能力以及代码质量,同时也能提高我们的开发 ...

  4. 简单入门echart方法

    图表用echart, 然后前端的 HTML 跟 nodejs  , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...

  5. Vue指令:内置指令和自定义指令

    Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...

  6. pandas之字符串操作

    Pandas 提供了一系列的字符串函数,因此能够很方便地对字符串进行处理.在本节,我们使用 Series 对象对常用的字符串函数进行讲解.常用的字符串处理函数如下表所示: 函数名称 函数功能和描述 l ...

  7. IIC总线协议—读写EEPROM

    IIC总线协议-读写EEPROM 1.I2C简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USA ...

  8. gs_probackup增量备份ptrack.cpp : 88

    问题描述:使用gs_probackup对opengauss进行增量备份失败[omm@testmysqldb04 ~]$ sh gs_probackup.sh incbackup pg_switch_x ...

  9. [Java EE]SpringBoot/Tomcat之启动时报"Error: Could not find or load main class CLASS xxxx"、"no main manifest attribute"异常

    环境信息如下: OS: CENTOS 7 Tomcat : 9.0.46 SpringBoot: 2.3.12.RELASE Build JDK: 1.8.0_261 Runetime JDK : o ...

  10. HTML、 input;、accept 属性-规定能够通过文件上传进行提交的文件类型

    定义和用法 文章地址: http://www.w3school.com.cn/tags/att_input_accept.asp accept 属性规定了可通过文件上传提交的服务器接受的文件类型. 注 ...