目錄
如何連接飛書
建立飛書機器人
最後
首頁 科技週邊 人工智慧 附代碼,ChatGPT接入飛書詳細步驟

附代碼,ChatGPT接入飛書詳細步驟

Apr 14, 2023 pm 12:28 PM
chatgpt 飛書

附代碼,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;
}
登入後複製

有一點要注意的是,這個校驗介面和下面接收飛書訊息的介面是同一個位址,但是訊息體不一樣。

也就是說校驗介面是一次性的,校驗完之後就需要對這個介面進行改造。

我們先將這個介面發佈到一個可以公網存取的專案中,例如介面位址是
#https://www.php.cn/link/4aee31b0ec9f7bb7885473d95961e9a6

附代碼,ChatGPT接入飛書詳細步驟

OK,到這裡飛書的配置基本上搞定了,以下就是我們需要進行處理的邏輯了。

對接邏輯及實現

先說一下我司對接的大致邏輯,供大家參考。

用戶傳送訊息到飛書之後,飛書會將訊息轉送到我們自己的服務上。

但是這裡會存在一個問題,就是當多個用戶並發發起會話時,或者一個大群裡很多人都在@我們的機器人時,我們需要記住每一個人的回話,在chatgpt查詢到結果後,準確的回覆這個人。

由於我司目前也是用於內部測試不想實現太複雜,所以我們採用的思路是:每一個用戶的會話轉發到我們的服務上時,先將會話內容保存到一個全局的ConcurrentLinkedQueue隊列中,然後啟動一個線程,不停的消費這個隊列。

佇列的泛型是一個事先建構好的對象,這個物件保存著目前訊息的訊息id,發送人,提問內容等。

每消費一個對象,就將對象的提問內容傳送到chatgpt,取得回應結果以後,呼叫飛書提供的會話回覆介面去回覆使用者。 (如果並發量比較大,這裡可以搞成異步的)。

好了,大致思路就說到這,我們看一下具體的程式碼。

1,打開我們的項目,引入chatgpt提供的jar。

<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>0.10.0</version>
</dependency>
登入後複製

2,重寫上面的校驗接口,改造成接收飛書訊息。 (介面路徑不要變)

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

public static ConcurrentLinkedQueue<FeishuResponse> 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<String, String> 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。

以上是附代碼,ChatGPT接入飛書詳細步驟的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

ChatGPT 現在允許免費用戶使用 DALL-E 3 產生每日限制的圖像 ChatGPT 現在允許免費用戶使用 DALL-E 3 產生每日限制的圖像 Aug 09, 2024 pm 09:37 PM

DALL-E 3 於 2023 年 9 月正式推出,是比其前身大幅改進的車型。它被認為是迄今為止最好的人工智慧圖像生成器之一,能夠創建具有複雜細節的圖像。然而,在推出時,它不包括

ChatGPT與Python的完美結合:打造智慧客服聊天機器人 ChatGPT與Python的完美結合:打造智慧客服聊天機器人 Oct 27, 2023 pm 06:00 PM

ChatGPT與Python的完美結合:打造智慧客服聊天機器人引言:在當今資訊時代,智慧客服系統已成為企業與客戶之間重要的溝通工具。而為了提供更好的客戶服務體驗,許多企業開始轉向採用聊天機器人的方式來完成客戶諮詢、問題解答等任務。在這篇文章中,我們將介紹如何使用OpenAI的強大模型ChatGPT和Python語言結合,來打造一個智慧客服聊天機器人,以提高

手機怎麼安裝chatgpt 手機怎麼安裝chatgpt Mar 05, 2024 pm 02:31 PM

安裝步驟:1、在ChatGTP官網或手機商店下載ChatGTP軟體;2、開啟後在設定介面中,選擇語言為中文;3、在對局介面中,選擇人機對局並設定中文相譜;4 、開始後在聊天視窗中輸入指令,即可與軟體互動。

如何使用ChatGPT和Java開發智慧聊天機器人 如何使用ChatGPT和Java開發智慧聊天機器人 Oct 28, 2023 am 08:54 AM

在這篇文章中,我們將介紹如何使用ChatGPT和Java開發智慧聊天機器人,並提供一些具體的程式碼範例。 ChatGPT是由OpenAI開發的困境預測轉換(GenerativePre-trainingTransformer)的最新版本,它是一種基於神經網路的人工智慧技術,可以理解自然語言並產生人類類似的文本。使用ChatGPT,我們可以輕鬆地創建自適應的聊天

chatgpt國內可以使用嗎 chatgpt國內可以使用嗎 Mar 05, 2024 pm 03:05 PM

chatgpt在國內可以使用,但不能註冊,港澳也不行,用戶想要註冊的話,可以使用國外的手機號碼進行註冊,注意註冊過程中要將網路環境切換成國外ip。

如何利用ChatGPT和Python實現使用者意圖辨識功能 如何利用ChatGPT和Python實現使用者意圖辨識功能 Oct 27, 2023 am 09:04 AM

如何利用ChatGPT和Python實現使用者意圖辨識功能引言:在當今的數位時代,人工智慧技術逐漸成為各個領域中不可或缺的一部分。其中,自然語言處理(NaturalLanguageProcessing,NLP)技術的發展使得機器能夠理解和處理人類語言。 ChatGPT(Chat-GeneratingPretrainedTransformer)是一種基於

如何使用ChatGPT PHP建構智慧客服機器人 如何使用ChatGPT PHP建構智慧客服機器人 Oct 28, 2023 am 09:34 AM

如何使用ChatGPTPHP建構智慧客服機器人引言:隨著人工智慧技術的發展,機器人在客服領域的應用越來越廣泛。使用ChatGPTPHP建構智慧客服機器人,可以幫助企業提供更有效率、更個人化的客戶服務。本文將介紹如何使用ChatGPTPHP建構智慧客服機器人,並提供具體的程式碼範例。一、安裝ChatGPTPHP要使用ChatGPTPHP建構智慧客服機器人

ChatGPT和Python的完美結合:打造即時聊天機器人 ChatGPT和Python的完美結合:打造即時聊天機器人 Oct 28, 2023 am 08:37 AM

ChatGPT與Python的完美結合:打造即時聊天機器人導言:隨著人工智慧技術的快速發展,聊天機器人在各個領域中扮演著越來越重要的角色。聊天機器人可以幫助用戶提供即時且個人化的協助,同時也為企業提供高效率的客戶服務。本文將介紹如何使用OpenAI的ChatGPT模型和Python語言結合,打造一個即時聊天機器人,並提供具體的程式碼範例。一、ChatGPT

See all articles