ChatGPT telah menjadi popular baru-baru ini, dan bos juga bersedia meminta kami menyambungkan ChatGPT ke Feishu Selepas penyelidikan pagi, akhirnya kami berjaya mendaftar dan menyambungkan robot Feishu ke ChatGPT .
Yang berikut akan berkongsi dengan anda langkah terperinci untuk mengakses Feishu.
Interaksi antara Feishu dan chatgpt adalah seperti berikut. Perkhidmatan tersuai kami bertindak sebagai orang tengah untuk memajukan mesej.
1 Masukkan platform terbuka Feishu dan pilih untuk mencipta aplikasi binaan sendiri untuk perusahaan.
2. Selepas mencipta aplikasi, klik untuk memasuki aplikasi dan menambah robot.
3 Konfigurasikan kebenaran berkaitan mesej untuk robot Jika anda tidak pasti kebenaran yang diperlukan, anda boleh mendayakannya terlebih dahulu.
4. Langganan acara memerlukan terlebih dahulu membangunkan antara muka untuk disahkan oleh Feishu. Antara muka perlu boleh diakses daripada rangkaian awam.
Kod antara muka ini boleh dirujuk seperti berikut:
@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; }
Satu perkara yang perlu diambil perhatian ialah antara muka pengesahan ini dan berikut terima fly Antara muka mesej buku adalah alamat yang sama, tetapi isi mesej berbeza.
Maksudnya, antara muka pengesahan adalah penggunaan sekali sahaja dan perlu diubah suai selepas pengesahan.
Kami mula-mula menerbitkan antara muka ini kepada projek yang boleh diakses daripada rangkaian awam Contohnya, alamat antara muka ialah
//m.sbmmt.com/link/. 4aee31b0ec9f7bb7885473d95961e9a6
OK, kini konfigurasi Feishu pada asasnya telah selesai.
Biar saya bercakap dahulu tentang logik umum dok syarikat kami untuk rujukan anda.
Selepas pengguna menghantar mesej kepada Feishu, Feishu akan memajukan mesej itu ke perkhidmatan kami sendiri.
Tetapi akan ada masalah di sini, iaitu, apabila berbilang pengguna memulakan perbualan secara serentak, atau apabila ramai orang dalam kumpulan besar adalah robot @kami, kami perlu mengingati balasan setiap orang dan menanyakannya dalam chatgpt Selepas mendapatkan keputusan, balas orang ini dengan tepat.
Memandangkan syarikat kami sedang menggunakannya untuk ujian dalaman dan tidak mahu pelaksanaannya terlalu rumit, idea yang kami pakai ialah: apabila setiap sesi pengguna dimajukan ke perkhidmatan kami, kandungan sesi disimpan dahulu ke baris gilir ConcurrentLinkedQueue global, dan kemudian mulakan urutan untuk terus menggunakan baris gilir ini.
Jenis baris gilir generik ialah objek yang dibina terlebih dahulu Objek ini menyimpan ID mesej mesej semasa, pengirim, kandungan soalan, dsb.
Setiap kali objek digunakan, kandungan soalan objek dihantar ke chatgpt Selepas mendapat keputusan respons, antara muka sesi balasan yang disediakan oleh Feishu dipanggil untuk membalas kepada pengguna. (Jika jumlah konkurensi agak besar, ia boleh dibuat tak segerak di sini).
Baiklah, itulah idea umum.
1. Buka projek kami dan perkenalkan balang yang disediakan oleh chatgpt.
<dependency> <groupId>com.theokanning.openai-gpt3-java</groupId> <artifactId>service</artifactId> <version>0.10.0</version> </dependency>
2. Tulis semula antara muka pengesahan di atas dan tukar untuk menerima mesej Feishu. (Jangan ubah laluan antara muka)
@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"; } }
Struktur FeishuResponse adalah seperti berikut.
@Data public class FeishuResponse { private String messageId; private String query; }
3. Tulis urutan tugasan.
@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; } }
Kelas alat untuk mendapatkan token Feishu adalah seperti berikut:
@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 sahaja.
Akhir sekali, atas sebab privasi, kesan perbualan kumpulan chatgpt tidak akan dipaparkan Mari tunjukkan kesan perbualan langsung dengan robot.
Memandangkan kami hanya memperkenalkan chatgpt dengan sikap cuba-cuba, kodnya agak kasar kalau ada apa-apa yang tak kena dengan penulisan, , saya harap semua orang akan faham.
Balang tambahan yang diperkenalkan dalam kod dalam artikel ini termasuk: jambu batu, hutool-all dan fastjson.
Atas ialah kandungan terperinci Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!