qq群聊机器人接入ChatGPT


最近 ChatGPT 很火,也注册了账号玩了玩,确实灰常强大。但是也有的小伙伴可能没办法注册账号,我就想着把qq群机器人接入ChatGPT。 过程还是比较简单顺利的。下面简单介绍一下

直接跳过介绍,查项目代码

1. ChatGPT 网页的几个接口介绍。

1.1 第一个接口 https://chat.openai.com/backend-api/moderations

控制台上看到每次都有调用这个接口,但是阻塞这个接口,也可以正常运行。所有可以忽略这个接口。

1.2 第二个接口 https://chat.openai.com/backend-api/conversation

这个接口就是发送请求,获取响应的接口。控制台上看是fetch请求,但把请求直接copy出来,发现请求总是403。

1.3 第三个接口 https://chat.openai.com/api/auth/session

最后看到这个接口,大概就是刷新token的,第二个接口之前没有调用这个接口,所以请求可能鉴权失败。

1.4 总结: 经过我的捣鼓,再加上 github 看了下别人写的插件,可以像下面这样正确的发送请求已经接受响应。

2. ChatGPT 具体请求示例

1. 复制cookie

从浏览器控制台请求的请求头,或者 application -> cookie 复制出 __Secure-next-auth.session-token 的key和value。

示例:

"__Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..R3Kc7SzojKpBGjqD.A8_9DrrtRoHFzEiJXrfWzePQg后面省略..."

ps: (__Secure-next-auth.callback-url 和 __Host-next-auth.csrf-token 可要可不要)

2. 发起session请求,这里用java okhttp实现,没有多余封装,直接硬码

把结果 nextAuthSessionToken 和 authorization 保留下来。nextAuthSessionToken 作为下一次请求 sessionReq
方法的参数(就不用每次都复制了),nextAuthSessionToken 和 authorization 都传递到下一个接口作为参数

public static String[] sessionReq(String copyCookie) throws IOException {//copyCookie就是从浏览器请求的请求头,或者 application -> cookie 复制出 __Secure-next-auth.session-token 的key和value。   //ps: (__Secure-next-auth.callback-url 和 __Host-next-auth.csrf-token 可要可不要)//示例: "__Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0....后面省略"HashMap<String, String> headerMap = Maps.newHashMap();headerMap.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36");headerMap.put("cookie", copyCookie);headerMap.put("accept-encoding", "gzip, deflate, br");//session接口Request getRequest = new Request.Builder().url("https://chat.openai.com/api/auth/session").get().headers(Headers.of(headerMap)).build();Response responseSession = client.newCall(getRequest).execute();String result = CharStreams.toString(new InputStreamReader(responseSession.body().byteStream(), StandardCharsets.UTF_8));logger.info("session response: {}", result);Map map = objectMapper.readValue(result, Map.class);String setCookie = responseSession.headers().get("set-cookie");Map<String, String> collect = Splitter.on(";").splitToList(setCookie).stream().filter(it -> it.contains("=")).map(it -> it.split("=")).collect(Collectors.toMap(it -> it[0], it -> it[1]));String nextAuthSessionToken = collect.get("__Secure-next-auth.session-token");String authorization = (String) map.get("accessToken");logger.info("nextAuthSessionToken: {}", nextAuthSessionToken);ChatGPTHandle.sessionToken = nextAuthSessionToken;logger.info("authorization: {}", authorization);return new String[]{nextAuthSessionToken, authorization};}

3. 发起 conversation 请求,同样用java okhttp实现,没有多余封装,直接硬码

requestBody 只用替换 query就行,conCookieMap 就是之前复制的cookie里的内容,这里我把三组都写上了,
__Host-next-auth.csrf-token 和 __Secure-next-auth.callback-url 都是固定值

public static String conversation(String[] auths, String requestBody) throws IOException {//这个 requestBody 可以作为模板写死,不同的请求只需要修改里面的query
//        String requestBody = "{\"parent_message_id\":\"" + UUID.randomUUID()
//                + "\",\"action\":\"next\",\"messages\":[{\"role\":\"user\",\"id\":\""
//                + UUID.randomUUID() + "\",\"content\":{\"content_type\":\"text\",\"parts\":[\"" + "query" + "\"]}}]," +
//                "\"model\":\"text-davinci-002-render\"}";String nextAuthSessionToken = auths[0];String authorization = auths[1];//替换那个 cookieMap<String, String> conCookieMap = new HashMap<>(4, 1);//这个就是上面复制的cookie里的内容conCookieMap.put("__Secure-next-auth.session-token", nextAuthSessionToken);StringBuilder sb = new StringBuilder();conCookieMap.forEach((k, v) -> sb.append(k).append("=").append(v).append("; "));sb.deleteCharAt(sb.length() - 2);HashMap<String, String> hashMap = Maps.newHashMap();hashMap.put("accept-encoding", "gzip, deflate, br");hashMap.put("accept-language", "zh-CN,zh;q=0.9");hashMap.put("authorization", "Bearer " + authorization);hashMap.put("content-type", "application/json");hashMap.put("cookie", sb.toString().trim());hashMap.put("origin", "https: //chat.openai.com");hashMap.put("referer", "https: //chat.openai.com/chat");hashMap.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36");Request post = new Request.Builder().headers(Headers.of(hashMap)).url("https://chat.openai.com/backend-api/conversation").post(RequestBody.create(MediaType.parse("application/json"), requestBody)).build();Call call = client.newCall(post);Response response = call.execute();if (response.isSuccessful()) {//处理response的响应消息String res = CharStreams.toString(new InputStreamReader(response.body().byteStream(), StandardCharsets.UTF_8));//这里是连续多行//a//a b//a b c//这直接取倒数第二行String[] split = res.split("\n");List<String> collect1 = Arrays.stream(split).filter(Strings::isNotBlank).collect(Collectors.toList());String fullLine = collect1.get(collect1.size() - 2);Map map1 = objectMapper.readValue(fullLine.substring(5), Map.class);ArrayList list = (ArrayList) ((Map) ((Map) map1.get("message")).get("content")).get("parts");return (String) list.get(0);} else {logger.info(response.code() + "  " + response.toString());}return "服务出错了, g了";}

这样基本就能返回成功了,需要的依赖是 okhttp3 和 jackson 和 guava。普通java web项目里应该都有

3. 接入qq机器人,我用的是 github 开源 mirai

3.1 基于 mirai 开发一个简单的 qq机器人,支持艾特回复。

想了一下,还是直接上代码吧,介绍累死我了。(以后有空再加)

项目地址

这里跟一下趋势,用的springboot3.0 java17开发

mirai-qq-bot

最后效果演示

qq群聊机器人接入ChatGPT-简介和源码相关推荐

  1. 如何创建一个以chatgpt为基础的QQ群聊机器人的流程细节

    为了创建一个基于 ChatGPT 的 QQ 群聊机器人,您需要遵循以下步骤: 1.获取 ChatGPT 模型:您可以在 OpenAI 的 GPT-3 模型中获取 ChatGPT 模型. 2.训练模型: ...

  2. Baby Q PK小冰 谁才是QQ6.7新增的QQ群聊机器人之王 ...

    一提到QQ群聊机器人,小伙伴们一定不陌生.毕竟酷Q机器人和晨风机器人插件曾风靡一时,霸占过多少QQ群啊!但这些插件虽便利,却极不稳定,经常动不动就罢工了. 腾讯爸爸听到众小伙伴们的呼声,以及近年来AI ...

  3. QQ 群聊美少女语音AI(ChatGPT版)

    QQ 群聊美少女语音AI ✨ 基于 go-cqhttp 以及 VITS-fast-fine-tuning + revChatGPT 实现 ✨ Combination of ChatGPT and VI ...

  4. python写qq群机器人怎么弄_python打造自由DIY 群聊机器人

    本文首发于简书DIY 微信群聊机器人​www.jianshu.com 前言 这几天我的一个小伙伴问我能不能给 Ta 做一个配置灵活的微信群聊天机器人,之前了解过 itchat 库的使用,我就爽快的答应 ...

  5. 保姆级教程|昨晚撸了一个ChatGPT群聊机器人

    前言 近期ChatGPT可以说是太火了,问答.写论文.写诗.写代码,只要输入精确的prompt,他的表现总是让人惊喜.本着打不过就加入的原则.要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做 ...

  6. 给自己的QQ群开启腾讯官方的群聊机器人

    看到腾讯有个机器人还不错 能聊天 能唱歌 方法: 1.点击链接填写https://wj.qq.com/s/946969/64ac 群聊机器人内测邀请.按照提示填就行了 2.然后就是开启机器人了 htt ...

  7. QQ 群聊美少女语音AI(ChatGLM 本地化版本)

    QQ 群聊美少女语音AI(ChatGLM 本地化版本) ✨ 基于 go-cqhttp 以及 VITS-fast-fine-tuning + ChatGLM 实现 ✨ Combination of Ch ...

  8. Java网络编程,模拟QQ群聊功能

    Java网络编程,模拟QQ群聊功能 一.网络编程知识点简介: 1.C/S架构:Client客户端/Server服务器: 涉及到的应用:桌面的应用软件,QQ,王者荣耀 涉及到的技术:Socket网络编程 ...

  9. delphi 企业微信消息机器人_企业微信—群聊机器人

    在企业微信群聊机器人接口对接天气API使用过程中,遇到 过一个问题,就是对于嵌套json数据如何进行嵌套的| 一:"msgtype": "text", curl ...

最新文章

  1. c++调用python3
  2. [20190401]跟踪dbms_lock.sleep调用.txt
  3. java readtimeout_Java HttpURLConnection.getReadTimeout方法代码示例
  4. 全屏插件fullsizable.js失效???
  5. 请解释和、|和||的区别?
  6. NC33-合并两个有序的链表
  7. Centos 7 修改主机名
  8. WindowsPhone 7.8 Tiles 1 : WideTile
  9. OpenCv:椭圆上点的计算方程
  10. Android WebView:这是一份全面 详细的WebView学习指南
  11. 增加磁盘,无需reboot
  12. Oracle的执行计划详解
  13. 吸血鬼数字—THINKING IN JAVA中一道习题
  14. 基于Unity开发的井字棋游戏设计
  15. nginx 502错误原因及解决办法
  16. H3C网管型交换机、路由器 常用登录管理方式使用详解 及 默认端口号,默认用户名、密码
  17. VB.NET回车/换行组合符
  18. 基于DLNA的移动端网络视频投屏技术
  19. 你必须得知道的人工智能领域的大师与大事
  20. 其实,微信没有封哨权

热门文章

  1. 超级有用,函数图像大全
  2. 演讲之禅---- 一位技术演讲家的自白
  3. Jordan 块的几何
  4. 加快对接接口开发速度Json转化为实体类
  5. java 数字转换成汉字_Java-String-阿拉伯数字转换成中文汉字数字
  6. Audio Converter 音频转码
  7. 7成居民以为房价高难承受 出资志愿上升
  8. 腾讯云GPU游戏服务器/云主机租用配置价格表出炉!
  9. RS232接口标准、硬件电路
  10. Unity Shader-Matcap(材质捕获)