三分钟你可以快速实现在飞书中接入chatgpt机器人,可以直接私聊他问它问题,也可以在群里@它。
第一步:创建飞书机器人应用
添加我那机器人之后,点击左侧凭证与基础信息,复制好APP ID 和APP Secret备用。
第二步:前往laf创建云函数
第三步:将刚才复制的飞书appid和secret保存到laf的环境变量
环境变量: (添加完成后点击弹窗右下角【更新】按钮重启应用)
LARK_APPID:你刚才复制的飞书机器人的appid
LARK_SECRET:你刚才复制的飞书机器人的app secret
第四步:添加项目依赖包
搜索:openai 这个包,勾选后点击 保存并重启
第五步:将云函数代码复制到云函数内并发布
import cloud from '@lafjs/cloud'
import axios from 'axios'
import * as openai from "openai";
const db = cloud.database()
const OpenAIKey = cloud.env.CHAT_GPT_API_KEY;
const FeishuAppId = cloud.env.LARK_APPID;
const FeishuAppSecret = cloud.env.LARK_SECRET;
let chatGPT = null;
if (OpenAIKey) {
const configuration = new openai.Configuration({ apiKey: OpenAIKey });
const client = new openai.OpenAIApi(configuration);
chatGPT = async (content) => {
return await client.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [{ role: 'assistant', content }],
});
};
}
const getTenantToken = async () => {
const url = 'https://open.feishu.cn/open-apis/v3/auth/tenant_access_token/internal/';
const res = await axios.post(url, {
'app_id': FeishuAppId,
'app_secret': FeishuAppSecret,
});
return res.data.tenant_access_token;
};
const feishuReply = async (objs) => {
const tenantToken = await getTenantToken();
const url = `https://open.feishu.cn/open-apis/im/v1/messages/${objs.msgId}/reply`;
let content = objs.content;
if (objs.openId) content = `<at user_id="${objs.openId}"></at> ${content}`;
const res = await axios({
url, method: 'post',
headers: { 'Authorization': `Bearer ${tenantToken}` },
data: { msg_type: 'text', content: JSON.stringify({ text: content }) },
});
return res.data.data;
};
export async function main(ctx: FunctionContext) {
const { body } = ctx
if (body.challenge) return { challenge: body.challenge };
const eventId = body.header.event_id;
const contentsTable = db.collection('contents')
const contentObj = await contentsTable.where({ eventId }).getOne();
if (contentObj.data) return;
const message = body.event.message;
const messageContent = JSON.parse(message.content)
let content = messageContent?.text?.replace('@_user_1 ', '') || '';
if (!content) return
const sender = body.event.sender;
await contentsTable.add({
eventId: body.header.event_id,
msgId: message.message_id,
openId: sender.sender_id.open_id,
content,
date: Date.now()
});
let replyContent = content;
if (OpenAIKey) {
const result = await chatGPT(content);
replyContent = `${result.data.choices[0].message.content.trim()}`;
}
await feishuReply({
msgId: message.message_id,
openId: sender.sender_id.open_id,
content: replyContent,
});
}
第六步: 将云函数链接添加到飞书机器人
如果有报错提示(Challenge code没有返回),请检查云函数是否发布或环境变量是否添加并重启应用
第七步:为机器人添加事件订阅
第八步:发布机器人
保存即可提交审核,联系对应审核人员审核通过即可使用
审核通过后可以在任意一个你有管理权限的群里添加机器人,然后搜索你创建的机器人的名字,即可添加。
第九步:添加ChatGPT回复功能
上面我们已经把机器人弄好了,但机器人还没有能力回复你的问题。现在我们来为他接入chatgpt。
到 OpenAI 的控制台中,点「Create new secret key」生成并且复制这个新生成的 Key,如本文第三步一样操作将key添加到环境变量中。
CHAT_GPT_API_KEY:你刚才新建的key
如果没有 OpenAI 账号,可以到网络中搜索一下获取方式,提前准备好。
第十步:愉快玩耍
写文章比写代码难多了。。。
有描述不清楚或不懂的地方,欢迎评论区留言,看见了我会一一解决。
Q&A
Q: 报错请求Axios 400 Error
A: 如图所示查看报错原因
如果你也是这种报错 Access denied One of the following scopes is required: [im:message:send,im:messageim:message:send as bot]
请按图操作开通指定权限