当前位置:

首页 > 业界资讯 > 附代码,ChatGPT接入飞书详细步骤

附代码,ChatGPT接入飞书详细步骤

最近ChatGPT大火,boss也蠢蠢欲动要求我们把ChatGPT接入飞书,经过一上午的研究,终于注册成功并且实现了飞书机器人对接到ChatGPT。下面给大家分享一下接入飞书的详细步骤。如何接入飞书飞书与chatgpt的交互如下,我们的自定义服务就是充当一个中间人的角色,进行消息的转发。创建飞书机器人1,进入飞书开放平台,选择创建企业自建应用。2,创建完应用以后,点击进入应用,添加机器人。3,给机器人配置消息相关的权限,如果不确定需要什么权限,可以先全部开通。4,配置事件订阅。事件订阅需要先开发一个接口供

附代码,ChatGPT接入飞书详细步骤

最近ChatGPT大火,boss也蠢蠢欲动要求我们把ChatGPT接入飞书,经过一上午的研究,终于注册成功并且实现了飞书机器人对接到ChatGPT。

下面给大家分享一下接入飞书的详细步骤。

如何接入飞书

飞书与chatgpt的交互如下,我们的自定义服务就是充当一个中间人的角色,进行消息的转发。

附代码,ChatGPT接入飞书详细步骤

创建飞书机器人

1,进入飞书开放平台,选择创建企业自建应用。

附代码,ChatGPT接入飞书详细步骤

2,创建完应用以后,点击进入应用,添加机器人。

附代码,ChatGPT接入飞书详细步骤

3,给机器人配置消息相关的权限,如果不确定需要什么权限,可以先全部开通。

附代码,ChatGPT接入飞书详细步骤

4,配置事件订阅。事件订阅需要先开发一个接口供飞书验证。接口需要可以公网访问。

附代码,ChatGPT接入飞书详细步骤

这个接口的代码可以参考如下:

@PostMapping(value = "/message")
public FeishuEventDTO message(@RequestBody String body) {
log.info("收到消息:{}", body);
FeishuEventParams feishuEventParams = JSON.parseObject(body, FeishuEventParams.class);
FeishuEventDTO eventDTO = new FeishuEventDTO();
eventDTO.setChallenge(feishuEventParams.getChallenge());
return eventDTO;
}

@Data
public class FeishuEventParams {

private String challenge;
private String token;
private String type;
}

@Data
public class FeishuEventDTO {
private String challenge;
}

有一点需要注意的是,这个校验接口和下面接收飞书消息的接口是同一个地址,但是消息体不一样。

也就是说校验接口是一次性的,校验完之后需要对这个接口进行改造。

我们先将这个接口发布到一个可以公网访问的项目中,比如接口地址是
​http://xx.xx.xx.xx/xx/xx/message,将其填写到飞书中保存,飞书如果可以成功保存就没问题了。​

附代码,ChatGPT接入飞书详细步骤

OK,到这里飞书的配置基本搞定了,下面就是我们需要进行处理的逻辑了。

对接逻辑及实现

先说一下我司对接的大致逻辑,供大家参考。

用户发送消息到飞书之后,飞书会将消息转发到我们自己的服务上。

但是这里会存在一个问题,就是当多个用户并发发起会话时,或者一个大群里很多人都在@我们的机器人时,我们需要记住每一个人的回话,在chatgpt查询到结果后,准确的回复这个人。

由于我司目前也是用于内部测试不想实现太复杂,所以我们采用的思路是:每一个用户的会话转发到我们的服务上时,先将会话内容保存到一个全局的ConcurrentLinkedQueue队列中,然后启动一个线程,不停的消费这个队列。

队列的泛型是一个提前构造好的对象,这个对象保存着当前消息的消息id,发送人,提问内容等。

每消费一个对象,就将对象的提问内容发送到chatgpt,获取响应结果以后,调用飞书提供的会话回复接口去回复用户。(如果并发量比较大,这里可以搞成异步的)。

好了,大致思路就说到这,我们看一下具体的代码。

1,打开我们的项目,引入chatgpt提供的jar。


com.theokanning.openai-gpt3-java
service
0.10.0

2,重写上面的校验接口,改造成接收飞书消息。(接口路径不要变)

@Slf4j
@RestController
@RequestMapping(value = "/query")
public class QureyController {

public static ConcurrentLinkedQueue consumer 
= new ConcurrentLinkedQueue<>();

@PostMapping(value = "/message")
public String message(@RequestBody String body) {
log.info("收到飞书消息:{}", body);
JSONObject jsonObject = JSONObject.parseObject(body);
JSONObject header = jsonObject.getJSONObject("header");
String eventType = header.getString("event_type");
if ("im.message.receive_v1".equals(eventType)) {
JSONObject event = jsonObject.getJSONObject("event");
JSONObject message = event.getJSONObject("message");
String messageType = message.getString("message_type");
if ("text".equals(messageType)) {
String messageId = message.getString("message_id");
String content = message.getString("content");
JSONObject contentJson = JSON.parseObject(content);
String text = contentJson.getString("text");

FeishuResponse feishuResponse = new FeishuResponse();
feishuResponse.setMessageId(messageId);
feishuResponse.setQuery(text);
log.info("投递用户消息,{}", JSON.toJSON(feishuResponse));
consumer.add(feishuResponse);
} else {
log.info("非文本消息");
}
}

return "suc";
}
}

FeishuResponse的结构如下。

@Data
public class FeishuResponse {

private String messageId;

private String query;

}

3,写一个任务线程。

@Slf4j
public class AutoSendTask implements Runnable {
//你的chatgpt的key
public static final String token = "";
public static OpenAiService openAiService = null;

static {
openAiService = new OpenAiService(token, Duration.ofSeconds(60));
}

@Override
public void run() {
while (true) {
try {
FeishuResponse poll = consumer.poll();
if (poll == null) {
log.info("no query,sleep 2s");
TimeUnit.SECONDS.sleep(2);
} else {
String query = this.query(poll.getQuery());
this.reply(poll, query);
}
} catch (InterruptedException e) {
log.error("Thread exception...", e);
}
}
}

private String query(String q) {
log.info("开始提问:{}", q);
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt(q)
.model("text-davinci-003")
.maxTokens(2048)
.echo(false)
.build();
StringBuilder sb = new StringBuilder();
CompletionResult completion = openAiService.createCompletion(completionRequest);
log.info("q:{},获取响应:{}", q, JSON.toJSONString(completion));
completion.getChoices().forEach(v -> {
sb.append(v.getText());
});
String rs = sb.toString();
if (rs.startsWith("?")) {
rs = rs.replaceFirst("?", "");
}
if (rs.startsWith("nn")) {
rs = rs.replaceFirst("nn", "");
}
log.info("格式化后的rs:{}", rs);
return rs;
}

private String reply(FeishuResponse poll, String rs) {
JSONObject params = new JSONObject();
params.put("uuid", RandomUtil.randomNumbers(10));
params.put("msg_type", "text");

JSONObject content = new JSONObject();
content.put("text", rs);
params.put("content", content.toJSONString());

String url = String.format("https://open.feishu.cn/open-apis/im/v1/messages/%s/reply",
 poll.getMessageId());
String tenantAccessToken = FeishuUtils.getTenantAccessToken();
String body = null;
try (HttpResponse authorization = HttpUtil.createPost(url)
.header("Authorization", "Bearer " + tenantAccessToken)
.body(params.toJSONString())
.execute()) {
body = authorization.body();
}

return body;
}

}

获取飞书token的工具类如下:

@Slf4j
public class FeishuUtils {

public static final String tokenUrl
= "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/";
//构建一个cache 缓存飞书的token
static Cache tokenCache =
CacheBuilder.newBuilder().expireAfterWrite(Duration.ofSeconds(3500)).build();
//这个是飞书应用的appid和key,可以在创建的飞书应用中找到
public static final String appId = "";
public static final String appKey = "";

public static String getTenantAccessToken() {
String token = null;
try {
token = tokenCache.get("token", () -> {
JSONObject params = new JSONObject();
params.put("app_id", appId);
params.put("app_secret", appKey);
String body;
try (HttpResponse execute = HttpUtil.createPost(tokenUrl)
.body(params.toJSONString()).execute()) {
body = execute.body();
}
log.info("获取飞书token:{}", body);
if (StrUtil.isNotBlank(body)) {
String tenantAccessToken = JSON.parseObject(body).getString("tenant_access_token");
tokenCache.put("token", tenantAccessToken);
return tenantAccessToken;
}
return null;
});
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
return token;
}
}

4,启动线程类即可。

附代码,ChatGPT接入飞书详细步骤

最后,出于隐私,chatgpt群会话的效果就不展示了,展示一下直接对话机器人的效果吧。

附代码,ChatGPT接入飞书详细步骤

最后

由于我们引入chatgpt也只是抱着尝试的态度,所以代码相对也比较粗糙,如果有哪里写的不好的地方,还望大家海涵。

文中代码还额外引入的jar有:guava、hutool-all、fastjson。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
业界资讯
相关文章 更多
独家丨从飞书火山整合,看阿里「云钉一体」踩过的坑
独家丨从飞书火山整合,看阿里「云钉一体」踩过的坑

阿里云与钉钉的一体化战略因高层战略分歧明显、营收压力巨大及产品与市场错配而遇阻,最终拆分。字节跳动旗下飞书与火山引擎融合面临类似挑战,亟需解决战略统一与营销与服务体系融合问题。

上汽与飞书达成集团层面合作
上汽与飞书达成集团层面合作

上汽集团与飞书达成集团层面合作,AI是促成合作的关键变量。飞书作为工作平台,能够连接人员、知识、业务数据与流程,使AI进入研发、生产等真实业务场景。飞书在汽车行业已有积累,北汽福田、东风奕派等企业通过AI应用提升了效率。上汽正筛选AI应用场景,推动规模化落地。

飞书如何设置定时发送消息
飞书如何设置定时发送消息

飞书定时发送消息功能:打开聊天窗口输入内容,点击发送按钮旁箭头选择“定时发送”,设置具体时间并确认,消息进入待发送状态,到达设定时间自动发出,支持修改或取消。

飞书多维表格怎么使用
飞书多维表格怎么使用

飞书多维表格的核心功能包括创建表格、设置清晰列名、数据录入、排序筛选、关联其他表格实现数据联动,以及共享协作实时编辑。掌握这些操作,可有效提升数字化办公效率,通过灵活运用实现数据高效管理与团队协作。

飞书聊天窗口打不开如何解决
飞书聊天窗口打不开如何解决

飞书聊天窗口打不开,确实挺让人抓狂的——正等着回复消息呢,突然就卡住不动了。别急,这个问题多半不是什么大毛病,咱们按步骤来排查,基本都能搞定。下面这份清单,照着做就行。 飞书聊天窗口无法打开怎么办 先检查网络连接 这是最基础的一步。网络不稳或者根本没连上,聊天窗口自然加载不出来。你可以试试切换网络—

飞书开放平台是什么
飞书开放平台是什么

飞书开放平台,简单来说,就是字节跳动给开发者们准备的一个官方能力入口。它把飞书内部已经打磨好的组织协同、消息通知、文档操作、身份认证这些核心能力,打包成标准化的API、Bot机器人、小程序、自定义应用等形式开放出来。你不需要从零开始造轮子,就能快速接入飞书账号体系、读取群成员列表、在飞书文档里插入表

飞书开放平台登录入口 飞书开放平台网页版登录入口
飞书开放平台登录入口 飞书开放平台网页版登录入口

飞书开放平台的登录入口,其实就是 https://open.feishu.cn。这个地址承载的能力可不简单——多语言SDK集成、OAuth 2.0授权、组织架构自动同步、响应式控制台,全都打包在里面。更不用说背后还有200多个API接口、Webhook订阅、可视化限流,以及从应用到安全的一整套生命周

飞书开放平台网页版 飞书开放平台网页版入口
飞书开放平台网页版 飞书开放平台网页版入口

飞书开放平台的网页版入口其实很简单:直接访问 https://open.feishu.cn 就能进入。这个地址对开发者来说,可以说是整个生态的起点——它集成了多语言SDK、可视化应用创建、内置调试环境以及实时监控能力,覆盖消息、认证、日历、文档等日常办公场景的API。更贴心的是,官方提供了中文文档、

飞书的开放平台怎么用
飞书的开放平台怎么用

在飞书aPaaS里,你想快速生成一套标准Open API,让外部系统安全地调取数据或触发流程,其实根本不需要从零开始手写接口代码。只要配置一下,系统就能自动输出规范的Open API文档。 而要做这件事,你需要具备的是「应用管理员」或「开发者」角色权限,同时区分好开发环境和线上环境。配置时支持直接勾

飞书如何设置工作状态
飞书如何设置工作状态

在飞书里,工作状态这个功能其实挺实用的——别人一眼就能知道你在忙啥,沟通效率自然就上去了。下面就把手机、电脑、网页三个端的设置和修改方法一次性讲清楚,顺便聊聊它能带来的好处。 手机端设置与修改 打开飞书手机应用,点一下左上角自己的头像,进入个人信息页。这里能看到一个“工作状态”选项。系统已经准备了“

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。