当前位置:首页>AI工具>2023 ChatGPT 带API接口PHP源码yimizu

2023 ChatGPT 带API接口PHP源码yimizu

分享一个chatGPT中文站附PHP接口源码,让AI回答你的任何问题!ChatGPT 是 OpenAI 开发的一款专门从事对话的人工智能聊天机器人原型。区块链系统开发yimizu
聊天机器人是一种大型语言模型,采用监督学习和强化学习技术。ChatGPT 于 2022 年 11 月推出,尽管其回答事实的准确性受到批评,但因其详细和清晰的回复而受到关注。
ChatGPT 使用监督学习和强化学习在 GPT-3.5 之上进行了微调和升级。ChatGPT的相关模型是OpenAI与微软合作在其 Azure 超级计算基础设施上进行训练的。ChatGPT 的训练数据包括手册页、互联网现象和编程语言的知识。

修改为使用官方提供的api接口。首先需要自己去 https://platform.openai.com/account/api-keys 创建一个 SECRET KEY。然后将key复制到 com.rxf113.miraiqqbot.chat.MiraiConfig类的getAnswerByChatGPT()方法中
SECRET KEY 是有免费使用限制的,具体详情官方网站都有介绍。

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

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

2022-12-23 更新,因为最近Chatgpt升级了安全策略,此方法已经不能使用。建议直接查看项目代码,采用官方api接口的对接方式。

  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 看了下别人写的插件,可以像下面这样正确的发送请求已经接受响应。

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

示例:

“__Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..R3Kc7SzojKpBGjqD.A8_9DrrtRoHFzEiJXrfWzePQg后面省略…”
1
ps: (__Secure-next-auth.callback-url 和 __Host-next-auth.csrf-token 可要可不要)

  1. 发起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};
}
  1. 发起 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];
    //替换那个 cookie
    Map<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项目里应该都有

  1. 接入qq机器人,我用的是 github 开源 mirai
    3.1 基于 mirai 开发一个简单的 qq机器人,支持艾特回复。
    想了一下,还是直接上代码吧,介绍累死我了。(以后有空再加)
    项目地址
    这里跟一下趋势,用的springboot3.0 java17开发

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
AI工具

ChatGPT出圈背后,生成式AI的春天到了?

2023-2-13 16:20:14

区块链推广

ChatGPT网页版入口 ChatGPT使用教程

2023-2-13 16:38:29

重要说明

本站资源大多来自网络,如有侵犯你的权益请联系管理员 区块链Bi站  或给邮箱发送邮件834379394@qq.com 我们会第一时间进行审核删除。 站内资源为网友个人学习或测试研究使用,未经原版权作者许可,禁止用于任何商业途径!请在下载24小时内删除!


如果你遇到支付完成,找不到下载链接,或者不能下载,或者解压失败,先不要忙,加客服主的QQ:834379394 (客服有可能有事情或者在睡觉不能及时的回复您,QQ留言后,请耐心等待即可!)

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索