Giter VIP home page Giter VIP logo

chatgpt-java's Introduction

ChatGPT Java API

stable Maven Central

English Doc.

OpenAI ChatGPT 的SDK。觉得不错请右上角Star

中文语料库

中文语料库 67万+问题,欢迎拿去炼丹

点击👇🏻传送链接,购买云服务器炼丹:

功能特性

功能 特性
GPT 3.5 支持
GPT 4.0 支持
函数调用 支持
流式对话 支持
阻塞式对话 支持
前端
上下文 支持
计算Token 用jtokkit
多KEY轮询 支持
代理 支持
反向代理 支持

image

image

使用指南

你可能在找这个,参考Demo https://github.com/PlexPt/chatgpt-online-springboot

最新版本 Maven Central

maven

<dependency>
    <groupId>com.github.plexpt</groupId>
    <artifactId>chatgpt</artifactId>
    <version>4.4.0</version>
</dependency>

gradle

implementation group: 'com.github.plexpt', name: 'chatgpt', version: '4.4.0'

最简使用

      //国内需要代理
      Proxy proxy = Proxys.http("127.0.0.1", 1081);
     //socks5 代理
    // Proxy proxy = Proxys.socks5("127.0.0.1", 1080);

      ChatGPT chatGPT = ChatGPT.builder()
                .apiKey("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")
                .proxy(proxy)
                .apiHost("https://api.openai.com/") //反向代理地址
                .build()
                .init();
                
        String res = chatGPT.chat("写一段七言绝句诗,题目是:火锅!");
        System.out.println(res);

也可以使用这个类进行测试 ConsoleChatGPT

进阶使用

      //国内需要代理 国外不需要
      Proxy proxy = Proxys.http("127.0.0.1", 1080);

      ChatGPT chatGPT = ChatGPT.builder()
                .apiKey("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")
                .proxy(proxy)
                .timeout(900)
                .apiHost("https://api.openai.com/") //反向代理地址
                .build()
                .init();
     
        Message system = Message.ofSystem("你现在是一个诗人,专门写七言绝句");
        Message message = Message.of("写一段七言绝句诗,题目是:火锅!");

        ChatCompletion chatCompletion = ChatCompletion.builder()
                .model(ChatCompletion.Model.GPT_3_5_TURBO.getName())
                .messages(Arrays.asList(system, message))
                .maxTokens(3000)
                .temperature(0.9)
                .build();
        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
        Message res = response.getChoices().get(0).getMessage();
        System.out.println(res);

函数调用(Function Call)

      //国内需要代理 国外不需要
          Proxy proxy = Proxys.http("127.0.0.1", 1080);

                  chatGPT = ChatGPT.builder()
                  .apiKey("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")
                  .timeout(900)
                  .proxy(proxy)
                  .apiHost("https://api.openai.com/") //代理地址
                  .build()
                  .init();

        List<ChatFunction> functions = new ArrayList<>();
        ChatFunction function = new ChatFunction();
        function.setName("getCurrentWeather");
        function.setDescription("获取给定位置的当前天气");
        function.setParameters(ChatFunction.ChatParameter.builder()
        .type("object")
        .required(Arrays.asList("location"))
        .properties(JSON.parseObject("{\n" +
        "          \"location\": {\n" +
        "            \"type\": \"string\",\n" +
        "            \"description\": \"The city and state, e.g. San Francisco, " +
        "CA\"\n" +
        "          },\n" +
        "          \"unit\": {\n" +
        "            \"type\": \"string\",\n" +
        "            \"enum\": [\"celsius\", \"fahrenheit\"]\n" +
        "          }\n" +
        "        }"))
        .build());
        functions.add(function);

        Message message = Message.of("上海的天气怎么样?");
        ChatCompletion chatCompletion = ChatCompletion.builder()
        .model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName())
        .messages(Arrays.asList(message))
        .functions(functions)
        .maxTokens(8000)
        .temperature(0.9)
        .build();
        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
        ChatChoice choice = response.getChoices().get(0);
        Message res = choice.getMessage();
        System.out.println(res);
        if ("function_call".equals(choice.getFinishReason())) {

        FunctionCallResult functionCall = res.getFunctionCall();
        String functionCallName = functionCall.getName();

        if ("getCurrentWeather".equals(functionCallName)) {
        String arguments = functionCall.getArguments();
        JSONObject jsonObject = JSON.parseObject(arguments);
        String location = jsonObject.getString("location");
        String unit = jsonObject.getString("unit");
        String weather = getCurrentWeather(location, unit);

        callWithWeather(weather, res, functions);
        }
        }


    private void callWithWeather(String weather, Message res, List<ChatFunction> functions) {


        Message message = Message.of("上海的天气怎么样?");
        Message function1 = Message.ofFunction(weather);
        function1.setName("getCurrentWeather");
        ChatCompletion chatCompletion = ChatCompletion.builder()
        .model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName())
        .messages(Arrays.asList(message, res, function1))
        .functions(functions)
        .maxTokens(8000)
        .temperature(0.9)
        .build();
        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
        ChatChoice choice = response.getChoices().get(0);
        Message res2 = choice.getMessage();
        //上海目前天气晴朗,气温为 22 摄氏度。
        System.out.println(res2.getContent());
        }

    public String getCurrentWeather(String location, String unit) {
        return "{ \"temperature\": 22, \"unit\": \"celsius\", \"description\": \"晴朗\" }";
        }

流式使用

      //国内需要代理 国外不需要
      Proxy proxy = Proxys.http("127.0.0.1", 1080);

      ChatGPTStream chatGPTStream = ChatGPTStream.builder()
                .timeout(600)
                .apiKey("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")
                .proxy(proxy)
                .apiHost("https://api.openai.com/")
                .build()
                .init();

                
        ConsoleStreamListener listener = new ConsoleStreamListener();
        Message message = Message.of("写一段七言绝句诗,题目是:火锅!");
        ChatCompletion chatCompletion = ChatCompletion.builder()
                .messages(Arrays.asList(message))
                .build();
        chatGPTStream.streamChatCompletion(chatCompletion, listener);

流式配合Spring SseEmitter使用

参考 SseStreamListener

你可能在找这个,参考Demo https://github.com/PlexPt/chatgpt-online-springboot

  

    @GetMapping("/chat/sse")
    @CrossOrigin
    public SseEmitter sseEmitter(String prompt) {
       //国内需要代理 国外不需要
       Proxy proxy = Proxys.http("127.0.0.1", 1080);

       ChatGPTStream chatGPTStream = ChatGPTStream.builder()
                .timeout(600)
                .apiKey("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")
                .proxy(proxy)
                .apiHost("https://api.openai.com/")
                .build()
                .init();
        
        SseEmitter sseEmitter = new SseEmitter(-1L);

        SseStreamListener listener = new SseStreamListener(sseEmitter);
        Message message = Message.of(prompt);

        listener.setOnComplate(msg -> {
            //回答完成,可以做一些事情
        });
        chatGPTStream.streamChatCompletion(Arrays.asList(message), listener);


        return sseEmitter;
    }

多KEY自动轮询

只需替换chatGPT构造部分

chatGPT = ChatGPT.builder()
        .apiKeyList(
               // 从数据库或其他地方取出多个KEY
                Arrays.asList("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",
                        "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",
                        "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",
                        "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",
                        ))
        .timeout(900)
        .proxy(proxy)
        .apiHost("https://api.openai.com/") //代理地址
        .build()
        .init();

上下文

参考 ChatContextHolder.java

常见问题

KEY从哪来? 手动注册生成:openai.com(需要海外手机号)、或者成品独享帐号:购买
哪些地区不能用 以下国家IP不支持使用:**(包含港澳台) 俄罗斯 乌克兰 阿富汗 白俄罗斯 委内瑞拉 伊朗 埃及!!
有封号风险吗 使用代理有一定的风险。
我是尊贵的Plus会员,能用吗 PLUS是网页端,调用API没啥区别
GPT4.0 怎么用 目前需要充值
api.openai.com ping不通? 禁ping,用curl测试连通性
显示超时? IP不好,换个IP
显示Your access was terminated due to violation of our policies... 你号没了,下一个
显示That model is currently overloaded with other requests. You can retry your request 模型过载,官方炸了,重试
生成的图片不能用? 图片是它瞎编的,洗洗睡吧
如何充值? 用国外信用卡,国内的不行
没有国外信用卡怎么办? 暂时没有特别好的办法待定
返回http 401 API 密钥写错了/没写
返回http 429 请求超速了,或者官方超载了。充钱可解决
返回http 500 服务器炸了

注册教程

https://juejin.cn/post/7173447848292253704

https://mirror.xyz/boxchen.eth/9O9CSqyKDj4BKUIil7NC1Sa1LJM-3hsPqaeW_QjfFBc

另外请看看我的另一个项目 ChatGPT中文使用指南

公众号

云服务器

点击👇🏻传送链接,购买云服务器:

项目合作洽谈请点击 联系微信 https://work.weixin.qq.com/kfid/kfc6913bb4906e0e597

QQ群:645132635

Star History

Star History Chart

chatgpt-java's People

Contributors

coder-lowic avatar dependabot[bot] avatar hq-q avatar jiaw3i avatar plexpt avatar qq921124136 avatar xiexiaojing avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chatgpt-java's Issues

同样是 offset 1, char a 这个报错

下面是报错信息,使用的环境是线上
dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/chatGPT] threw exception [Request processing failed; nested exception is com.alibaba.fastjso
n2.JSONException: illegal input, offset 1, char a] with root cause
com.alibaba.fastjson2.JSONException: illegal input, offset 1, char a

一个成功的案例

首先我当前使用的版本是1.1.2
先使用代理登录上去,这个时候,去复制cookie中的值一定要断开vpn然后刷新一下页面(这个很重要,不然就会提示403),再去复制值

        private static final String sessionToken = "你复制出来的__Secure-next-auth.session-token";
        private static final String cf_clearance = "你复制出来的cf_clearance";
        private static final String user_agent = "客户端代理";
        Chatbot chatbot = new Chatbot(sessionToken,cf_clearance,user_agent);
        Map<String, Object> chatResponse = chatbot.getChatResponse("怎么把chatGPT接入到java程序呢");
        System.out.println(chatResponse.get("message"));

启动的时候会有点慢,耐心等待即可。

以上就是我成功的案例,希望能够帮到你。

Access Denied

I'm using the following code to access ChatGPT:

		String sessionToken = "xxxxxxx";
		String cfClearance = "xxxxxx";
		String userAgent = "xxxxxxxx";
		
		
		
		Config config = new Config();
		config.setSession_token(sessionToken);
		config.setCfClearance(cfClearance);
		config.setUserAgent(userAgent);
		

		Chatbot chatbot = new Chatbot(config);
		
		
		Map<String, Object> chatResponse = chatbot.getChatResponse("hello");
		
		System.out.println(chatResponse.get("message"));

Session Token and CF Clearance obtained from Chrome Dev Tools.
User Agent obtained from Google by typing in "what is my user agent".

Above code throws the following exception:

Please check whether the above parameters are correct or expired. And the browser that obtains the above parameters must be at the same IP address as this program


getChatStream Exception: TYPE html>
getChatStream Exception:  lang="en-US">
getChatStream Exception: ead>
getChatStream Exception:  <title>Access denied</title>
getChatStream Exception:  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
getChatStream Exception:  <meta name="robots" content="noindex, nofollow" />
getChatStream Exception:  <meta name="viewport" content="width=device-width,initial-scale=1" />
getChatStream Exception:  <link rel="stylesheet" href="/cdn-cgi/styles/errors.css" media="screen" />
getChatStream Exception:  <script>
getChatStream Exception: tion(){if(document.addEventListener&&window.XMLHttpRequest&&JSON&&JSON.stringify){var e=function(a){var c=document.getElementById("error-feedback-survey"),d=document.getElementById("error-feedback-success"),b=new XMLHttpRequest;a={event:"feedback clicked",properties:{errorCode:1020,helpful:a,version:5}};b.open("POST","https://sparrow.cloudflare.com/api/v1/event");b.setRequestHeader("Content-Type","application/json");b.setRequestHeader("Sparrow-Source-Key","c771f0e4b5494xxxxxxxxxd79a1e");
getChatStream Exception: d(JSON.stringify(a));c.classList.add("feedback-hidden");d.classList.remove("feedback-hidden")};document.addEventListener("DOMContentLoaded",function(){var a=document.getElementById("error-feedback"),c=document.getElementById("feedback-button-yes"),d=document.getElementById("feedback-button-no");"classList"in a&&(a.classList.remove("feedback-hidden"),c.addEventListener("click",function(){e(!0)}),d.addEventListener("click",function(){e(!1)}))})}})();
getChatStream Exception: ipt>
getChatStream Exception:  <script>
getChatStream Exception:  (function(){function d(c){var b=document.getElementById("copy-label"),a=document.getElementById("cf-details-wrapper-expandable");c.target.checked?a.classList.add("expanded"):(a.classList.remove("expanded"),b.innerText="Click to copy")}if(document.addEventListener){var e=function(){var c=document.getElementById("copy-label");var b=document.getElementById("error-details").textContent;if(navigator.clipboard)navigator.clipboard.writeText(b);else{var a=document.createElement("textarea");a.value=b;a.style.top="0";a.style.left="0";a.style.position="fixed";document.body.appendChild(a);a.focus();a.select();document.execCommand("copy");document.body.removeChild(a)}c.innerText="Copied text to clipboard"};document.addEventListener("DOMContentLoaded",function(){var c=document.getElementById("error-details-checkbox"),b=document.getElementById("click-to-copy-btn");document.getElementById("copy-label").classList.remove("hidden");c.addEventListener("change",d);b.addEventListen
er("click",e)})}})();
getChatStream Exception:  </script>
getChatStream Exception:  <script defer src="https://performance.radar.cloudflare.com/beacon.js"></script>
getChatStream Exception: head>
getChatStream Exception: ody>
getChatStream Exception: iv class="cf-main-wrapper" role="main">
getChatStream Exception:  <div class="cf-header cf-section">
getChatStream Exception:     <div class="cf-error-title">
getChatStream Exception:        <h1>Access denied</h1>
getChatStream Exception:        <span class="cf-code-label">Error code <span>1020</span></span>
getChatStream Exception:     </div>
getChatStream Exception:     <div class="cf-error-description">
getChatStream Exception:        <p>You do not have access to chat.openai.com.</p><p>The site owner may have set restrictions that prevent you from accessing the site.</p>
getChatStream Exception:     </div>
getChatStream Exception:  </div>
getChatStream Exception: div>
getChatStream Exception: iv class="cf-details-wrapper">
getChatStream Exception:  <div class="cf-section" role="region">
getChatStream Exception:     <div class="cf-expandable" id="cf-details-wrapper-expandable">
getChatStream Exception:        <label for="error-details-checkbox" title="Error details" class="cf-expandable-btn">
getChatStream Exception:           <p class="cf-dropdown-title">Error details</p>
getChatStream Exception:           <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgxxxxxxElBMVEUAAAAwMDAxMTEyMjIwMDAxMTF+89HTAAAABXRSTlMAf2CAMKS61bwAAxxxxxx06TNCViAS+6+CeFi6gglw4eLqaPVtaQpXnkApaQT/k0dw70EAUhCA1AnABGACMAGYAEwAkCOAydv+I5xaZhXWbQrD80xxxxxxJggg=="
getChatStream Exception:           class="cf-caret-icon" id="caret-icon" alt="Caret icon" />
getChatStream Exception:        </label>
getChatStream Exception:        <input id="error-details-checkbox" class="hidden" type="checkbox">
getChatStream Exception:        <div class="cf-expandable-error-info hidden">
getChatStream Exception:           <p class="cf-error-copy-description">Provide the site owner this information.</p>
getChatStream Exception:           <button class="cf-click-to-copy-btn" id="click-to-copy-btn" title="Click to copy" type="button">
getChatStream Exception: class="cf-error-wrapper" id="error-details"><p class="cf-error-details-endpoint">I got an error when visiting chat.openai.com/backend-api/conversation.</p>
getChatStream Exception: ror code: 1020</p>
getChatStream Exception: y ID: 79xxxxxxx8c29</p>
getChatStream Exception: untry: US</p>
getChatStream Exception: ta center: ewr08</p>
getChatStream Exception: : xx.1xx.xxx.1xx</p>
getChatStream Exception: mestamp: 2023-01-31 21:02:07 UTC</p>
getChatStream Exception: >
getChatStream Exception:              <p class="cf-copy-label hidden" id="copy-label">Click to copy</p>
getChatStream Exception:           </button>
getChatStream Exception:        </div>
getChatStream Exception:     </div>
getChatStream Exception:  </div>
getChatStream Exception:  <div class="clearfix cf-footer cf-section" role="contentinfo">
getChatStream Exception:  <div class="cf-column">
getChatStream Exception:       <div class="feedback-hidden py-8 text-center" id="error-feedback">
getChatStream Exception: div id="error-feedback-survey" class="footer-line-wrapper">
getChatStream Exception:    Was this page helpful?
getChatStream Exception:    <button class="border border-solid bg-white cf-button cursor-pointer ml-4 px-4 py-2 rounded" id="feedback-button-yes" type="button">Yes</button>
getChatStream Exception:    <button class="border border-solid bg-white cf-button cursor-pointer ml-4 px-4 py-2 rounded" id="feedback-button-no" type="button">No</button>
getChatStream Exception: /div>
getChatStream Exception: div class="feedback-success feedback-hidden" id="error-feedback-success">
getChatStream Exception:    Thank you for your feedback!
getChatStream Exception: /div>
getChatStream Exception: >
getChatStream Exception:  </div>
getChatStream Exception:     <div class="cf-column cf-footer-line-wrapper text-center">
getChatStream Exception:        <p>
getChatStream Exception:           Performance &amp; security by <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=1020_error" target="_blank">Cloudflare <img class="external-link" title="Opens in new tab" src="/cdn-cgi/images/external.png" alt="External link"></a>
getChatStream Exception:        </p>
getChatStream Exception:     </div>
getChatStream Exception:  </div>
getChatStream Exception: div>
getChatStream Exception: pt>(function(){var js = "window['__CF$cv$params']={r:'792562f1c91c8c29',m:'Wu0pcFcE680EaVcAnLmwERBxxxxxxxetRgZs0-1675198927-0-AcUaJLrL4SfwHKMNHYIT6xxxxxxoi17cizP/P7wNaRzQCTRIzDkPsDqhf5OpGbPttbn5zKjV9Vt0nNi6zaiVmNx3liqOfhRePu2ku3XFKbpsIzr1h9EZByLUhj4ABDQ=',s:[0x0a775e2f7a,0x80bb148f34],u:'/cdn-cgi/challenge-platform/h/g'};var now=Date.now()/1000,offset=14400,ts=''+(Math.floor(now)-Math.floor(now%offset)),_cpo=document.createElement('script');_cpo.nonce='',_cpo.src='/cdn-cgi/challenge-platform/h/g/scripts/alpha/invisible.js?ts='+ts,document.getElementsByTagName('head')[0].appendChild(_cpo);";var _0xh = document.createElement('iframe');_0xh.height = 1;_0xh.width = 1;_0xh.style.position = 'absolute';_0xh.style.top = 0;_0xh.style.left = 0;_0xh.style.border = 'none';_0xh.style.visibility = 'hidden';document.body.appendChild(_0xh);function handler() {var _0xi = _0xh.contentDocument || _0xh.contentWindow.document;if (_0xi) {var _0xj = _0xi
.createElement('script');_0xj.nonce = '';_0xj.innerHTML = js;_0xi.getElementsByTagName('head')[0].appendChild(_0xj);}}if (document.readyState !== 'loading') {handler();} else if (window.addEventListener) {document.addEventListener('DOMContentLoaded', handler);} else {var prev = document.onreadystatechange || function () {};document.onreadystatechange = function (e) {prev(e);if (document.readyState !== 'loading') {document.onreadystatechange = prev;handler();}};}})();</script></body>
getChatStream Exception: l>

I have no issue accessing ChatGPT manually via browser.

How to fix? @PlexPt Does the code still work?

Thanks

一个的报错 illegal input, offset 1, char a

Chatbot类的getChatText方法里,返回的response.body()是{"detail":"Too many requests, please slow down"}会出现报错com.alibaba.fastjson2.JSONException: illegal input, offset 1, char a

开启上下文后,就聊了几句他就说token太长了

请求异常:{
"error": {
"message": "This model's maximum context length is 4097 tokens. However, you requested 4103 tokens (103 in the messages, 4000 in the completion). Please reduce the length of the messages or completion.",
"type": "invalid_request_error",
"param": "messages",
"code": "context_length_exceeded"
}
主要是这里,(103 in the messages, 4000 in the completion),completion花了4000个token

不支持上下文

试过几个场景上下文,现在不支持上下文,后续会增加上下文功能吗?

StringIndexOutOfBoundsException

通过手动输入参数session_token、cf_clearance and user_agent. 昨天晚上可以使用,今天早上报错
[C] java.lang.StringIndexOutOfBoundsException: String index out of range: -1
[C] at java.lang.String.substring(String.java:1931)
[C] at com.github.plexpt.chatgpt.Chatbot.getChatText(Chatbot.java:177)
[C] at com.github.plexpt.chatgpt.Chatbot.getChatResponse(Chatbot.java:236)
[C] at com.github.plexpt.chatgpt.Chatbot.getChatResponse(Chatbot.java:245)

hh

之前看到你的代码,发现一个地方有点小问题,今早刚想给你提个pr来着,一拉代码发现你改过了,害,失去一次pr的机会。
private Map<String, String> config = new HashMap<>();

请求兼容model text-davinci-003

或想请您告知为何model text-davinci-003不可用,我更改参数后返回的数据显示

{"detail":"Engine text-davinci-003 not recognized"}

请教大佬,通过chatGPT生成的图片,一般怎么下载呀,我通过URL下载的时候会报错

chatGPT生成的url为:
https://oaidalleapiprodscus.blob.core.windows.net/private/org-x2tDof6L8GQcT9HVev8uEEvq/user-QKO2z3TMxUYqYwTpR55INmEC/img-qBCyuxcVP2RHrpvmUUU3AjkP.png?st=2023-03-10T14%3A45%3A30Z&se=2023-03-10T16%3A45%3A30Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-03-10T03%3A35%3A18Z&ske=2023-03-11T03%3A35%3A18Z&sks=b&skv=2021-08-06&sig=lCj9fQwr6USg1ryf4wNB3HSRiAdpDE1XEmV9y9eKluQ%3D

Linux上的代码为:
`public static void download(String urlString, String filename, String savePath) {

URL url = null;
HttpsURLConnection con = null;
try {
    url = new URL(urlString);
    try {
        // trust all hosts
        trustAllHosts();
        HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
        //如果请求是https,忽略证书校验
        if (url.getProtocol().toLowerCase().equals("https")) {
            https.setHostnameVerifier(DO_NOT_VERIFY);
            con = https;
        } else {
            con = (HttpsURLConnection) url.openConnection();
        }
        
        //设置请求超时为5s
        con.setConnectTimeout(50 * 1000);
        // 输入流
        InputStream is = con.getInputStream();
        
        // 1K的数据缓冲
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        int len;
        // 输出的文件流
        File sf = new File(savePath);
        if (!sf.exists()) {
            sf.mkdirs();
        }
    /* 获取图片的扩展名(我没用到,所以先注释了)
    String extensionName = urlString.substring(urlString.lastIndexOf(".") + 1);*/
        OutputStream os = new FileOutputStream(sf.getPath() + "/" + filename);
        // 开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        // 完毕,关闭所有链接
        os.close();
        is.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (MalformedURLException e) {
    e.printStackTrace();
}

}`
报错信息如下:超时时间设置很长也没有作用
java.net.ConnectException: Connection timed out (Connection timed out)

没有上下文功能

你好,我发现每次调用好像都没有上下文,都是独立的一次对话,请问能支持一下上下文吗,感谢

Cloudflare 保护错误,http status: 403

"Request Url:https://chat.openai.com/api/auth/session Error,http status: 403,response body: \n<html lang="en-US">\n\n <title>Just a moment...</title>\n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n <meta http-equiv="X-UA-Compatible" content="IE=Edge">\n <meta name="robots" content="noindex,nofollow">\n <meta name="viewport" content="width=device-width,initial-scale=1">\n <link href="/cdn-cgi/styles/challenges.css" rel="stylesheet">\n \n\n\n<body class="no-js">\n <div class="main-wrapper" role="main">\n <div class="main-content">\n <h1 class="zone-name-title h1">\n <img class="heading-favicon" src="/favicon.ico"\n onerror="this.onerror=null;this.parentNode.removeChild(this)">\n chat.openai.com\n \n <h2 class="h2" id="challenge-running">\n Checking if the site connection is secure\n \n \n <div id="challenge-error-title">\n <div class="h2">\n <span class="icon-wrapper">\n <div class="heading-icon warning-icon">\n \n <span id="challenge-error-text">\n Enable JavaScript and cookies to continue\n \n \n \n \n <div id="trk_jschal_js" style="display:none;background-image:url('/cdn-cgi/images/trace/managed/nojs/transparent.gif?ray=7782e459dc16f649')">\n <div id="challenge-body-text" class="core-msg spacer">\n chat.openai.com needs to review the security of your connection before proceeding.\n \n <form id="challenge-form" action="/api/auth/session?User-Agent=Mozilla/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_15_7)%20AppleWebKit/605.1.15%20(KHTML,%20like%20Gecko)%20Version/16.1%20Safari/605.1.15%20&__cf_chl_f_tk=ieW6U6XkjndVLMnzRveMFcdlwE7pZYQv6iDaFfTdXrc-1670810694-0-gaNycGzNEWU" method="POST" enctype="application/x-www-form-urlencoded">\n <input type="hidden" name="md" value="5z04WRIi4WygZXRhBP2za3NQtmZPN1vznsi25cJ4rLM-1670810694-0-AYtbyF4hKRaA9hwZhMgeWdDKJKP2K9fCSxGqeuOgt88NKgFepiMlgsvJlry8bGb660JdeYWB_77gwhGDkHHwhr_peedFNKz-6MzDjhYpeCDAxKp0mISnScQYeHuH24aR0g7ihocOswVtKniwzQbRjwKpeSpEDrJxyDMBUi_hVDgw1nTFHbAVdHzntfclqRW62lab-fsm2EQTKufMmaD_byQapzxW3edc4mbNHkjoq0sRiKBlIeOUiBceQp_1NqHr0F532kHQU1-Ce6CRInZ2DB17roWGEP3-b7dsEUoHB87AeGsq-roVnDWgwRQOu21NgGeICs0RaBLege22pURzzg9T_Ej1OZ99KvjpUtrxmmHS9Hl-pF4MwiTt5h6VAGV1a-pMWK-Lcm5zk7B9wrL9iKN-ZFwH4Aj0a8M4QLyRNlxhvTco4FBRbHKBwMDuuW5ijGYIxxAkXwZHz7mjSg6Mo4jQyYISv3FnKUF6IUYFT4s2B967Y1mVo4hDHyKkOVGxoJLWdXiX--KMm9Nw15sNRSOJClRxDuyvGU--CJZbFy-B3nXaoTVetWuQSkFT3YdBtueu_nbS6gGY1yTkH26_XCuMFzB0tiekqcUpP7SWbzRHJzUZUEXYanG732KKoC0XrzM47qvSnEyt-ObIwRYjRUnFa-t_dNaBwujsaKQPm-SJGwHtGH0OAyPa97PPuw_2XRUgMswG1B2tMm4YcTW91Bz9tI9kZfJzMPWycvXfnShJDTkbW2uqJR7v5Dqx1yCeFH9jOE2m9L_6fn0gs9FR0s2qK63EQER2_yUYbpFMtUd-A_Q5NTqbB4-3yHUTJaQbFlY6H71thHbUy5cOr9g6Ic8kdIpNxLzdRHAJ4usrEVueX-gwfjHcKkXJuDdsRuRPzX_ix4tp56Iaz9s6yDeIqZ2s22zw4opL0UMl3kJwkFR7dOK0FYao-pWrjrZfaLHo__wdtSYAanbTpf9movWRg7zNOK5gz4lS8oJpxMlQWOb5qR53RFouksngJriJ1ybSP_6s3YpTRvovJxZROjnFGDoK3VkRspkNa8s8WkVKD4uH8Gu_A0i-UbxuqPG6UMB2hqiP2dX6XwL9nDnLuGRQB2A">\n <input type="hidden" name="r" value="o5r_H9Ri0w1EvVsfNdOUf37xKsr8.p22pCrbWji6GEM-1670810694-0-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">\n \n \n\n<script>\n (function(){\n window._cf_chl_opt={\n cvId: '2',\n cType: 'managed',\n cNounce: '69904',\n cRay: '7782e459dc16f649',\n cHash: '93c415a1ab5b12b',\n cUPMDTk: "\/api\/auth\/session?User-Agent=Mozilla\/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_15_7)%20AppleWebKit\/605.1.15%20(KHTML,%20like%20Gecko)%20Version\/16.1%20Safari\/605.1.15%20&__cf_chl_tk=ieW6U6XkjndVLMnzRveMFcdlwE7pZYQv6iDaFfTdXrc-1670810694-0-gaNycGzNEWU",\n cFPWv: 'b',\n cTTimeMs: '1000',\n cTplV: 4,\n cTplB: 'cf',\n cRq: {\n ru: 'aHR0cHM6Ly9jaGF0Lm9wZW5haS5jb20vY2hhdC9mcm9udGVuZC8vYXBpL2F1dGgvc2Vzc2lvbj9Vc2VyLUFnZW50PU1vemlsbGEvNS4wJTIwKE1hY2ludG9zaDslMjBJbnRlbCUyME1hYyUyME9TJTIwWCUyMDEwXzE1XzcpJTIwQXBwbGVXZWJLaXQvNjA1LjEuMTUlMjAoS0hUTUwsJTIwbGlrZSUyMEdlY2tvKSUyMFZlcnNpb24vMTYuMSUyMFNhZmFyaS82MDUuMS4xNSUyMA==',\n ra: 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc3MC4xNDIgU2FmYXJpLzUzNy4zNiBIdXRvb2w=',\n rm: 'R0VU',\n d: 'TmRGnyPlw4RMf1piCTbE97xcA8Tj98PZeoSASyYrwBc86gmkojwDkVEE7Ac1oJLwJj83ZLP1sQPuhRoobALJAyzBKFobzMq1lVs9fL5gn/d+fyyPiCJxxSwv+J08f8GAMILK6dWCeE8zEvXBPtSiZcI8iDLCBJvms9hSXyTYNiy+Ha10/EPkq3zR+6SJtOW3LTI4RD2vz/FS4ahoBIb6OX81YpsU7pDeflXplQkFZ6X1Dp/ZOSq8Zwnmn5vuzz5nNoObTGmJizWA9iGCgjVY9quJnD2Q9FLoMgPhH1FjvRyMdTwGbasY+T7W751wXQoBEycA2v4x1Wc1fjm9ybVrah6buw+RvQPNLU6PRyZRGM8MYyTAvLKjaR545N/VNe74VGOvZ21Qjhm91J5b4DJvlFuWsi3z2E3qLYvsUelJ+Qz+LvcczpBhlpesJzYyQS3MptvOBNDQHGvULxwSCF2kfBPt9LdMEzDV814LDnKF2FqYnC7+IPnYpobv0SmzKy6llEKlresrjyiWrRzpLnRP4dh2xKY7pldXWfnLioxc3MHJqxm/MjWm8roU2cF0edq4xQRz+7nV0o+3ii0sfegrbmq261F/hKoMzF1ngWo7m/kICOq9sw1Uj03sVevgD++Maboi8Diq/O0lH5RD1D5xKA==',\n t: 'MTY3MDgxMDY5NC42OTcwMDA=',\n m: 'OSkgGI4O+fvUj5NuuWoQXmMP3NQVCt674FCwpVQU13k=',\n i1: 'SFCNKzBY5dQ0nf1TZ9eu8A==',\n i2: 'uPNGaTu9qc3uYxUX0JMBYQ==',\n zh: 'iuyN59AGNgeBFFEOPj72EN+xtBfXXvoCyd1dJnIVFAc=',\n uh: 'py8TuFwMuZahQkeF3ttRvXcms553YCnt/83EpkJExhU=',\n hh: 'foaWmAUHGGlVCZaNUJIHhxzxFNzSPNnVe6rJjiQw728=',\n }\n };\n var trkjs = document.createElement('img');\n trkjs.setAttribute('src', '/cdn-cgi/images/trace/managed/js/transparent.gif?ray=7782e459dc16f649');\n trkjs.setAttribute('style', 'display: none');\n document.body.appendChild(trkjs);\n var cpo = document.createElement('script');\n cpo.src = '/cdn-cgi/challenge-platform/h/b/orchestrate/managed/v1?ray=7782e459dc16f649';\n window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;\n window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, -window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;\n if (window.history && window.history.replaceState) {\n var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;\n history.replaceState(null, null, "\/api\/auth\/session?User-Agent=Mozilla\/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_15_7)%20AppleWebKit\/605.1.15%20(KHTML,%20like%20Gecko)%20Version\/16.1%20Safari\/605.1.15%20&__cf_chl_rt_tk=ieW6U6XkjndVLMnzRveMFcdlwE7pZYQv6iDaFfTdXrc-1670810694-0-gaNycGzNEWU" + window._cf_chl_opt.cOgUHash);\n cpo.onload = function() {\n history.replaceState(null, null, ogU);\n };\n }\n document.getElementsByTagName('head')[0].appendChild(cpo);\n }());\n</script>\n\n\n <div class="footer" role="contentinfo">\n <div class="footer-inner">\n <div class="clearfix diagnostic-wrapper">\n <div class="ray-id">Ray ID: 7782e459dc16f649\n \n <div class="text-center">Performance & security by <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=challenge&utm_campaign=m\" target="_blank">Cloudflare\n \n \n\n\n"

Access denied

本来是403的,我按#26的方法多试了几次。不报403了。但是没有访问权限
getChatStream Exception: TYPE html> getChatStream Exception: lang="en-US"> getChatStream Exception: ead> getChatStream Exception: <title>Access denied</title> getChatStream Exception: <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> getChatStream Exception: <meta name="robots" content="noindex, nofollow" /> getChatStream Exception: <meta name="viewport" content="width=device-width,initial-scale=1" /> getChatStream Exception: <link rel="stylesheet" href="/cdn-cgi/styles/errors.css" media="screen" /> getChatStream Exception: <script> getChatStream Exception: tion(){if(document.addEventListener&&window.XMLHttpRequest&&JSON&&JSON.stringify){var e=function(a){var c=document.getElementById("error-feedback-survey"),d=document.getElementById("error-feedback-success"),b=new XMLHttpRequest;a={event:"feedback clicked",properties:{errorCode:1020,helpful:a,version:5}};b.open("POST","https://sparrow.cloudflare.com/api/v1/event");b.setRequestHeader("Content-Type","application/json");b.setRequestHeader("Sparrow-Source-Key","c771f0e4b54944bebf4261d44bd79a1e"); getChatStream Exception: d(JSON.stringify(a));c.classList.add("feedback-hidden");d.classList.remove("feedback-hidden")};document.addEventListener("DOMContentLoaded",function(){var a=document.getElementById("error-feedback"),c=document.getElementById("feedback-button-yes"),d=document.getElementById("feedback-button-no");"classList"in a&&(a.classList.remove("feedback-hidden"),c.addEventListener("click",function(){e(!0)}),d.addEventListener("click",function(){e(!1)}))})}})(); getChatStream Exception: ipt> getChatStream Exception: <script> getChatStream Exception: (function(){function d(c){var b=document.getElementById("copy-label"),a=document.getElementById("cf-details-wrapper-expandable");c.target.checked?a.classList.add("expanded"):(a.classList.remove("expanded"),b.innerText="Click to copy")}if(document.addEventListener){var e=function(){var c=document.getElementById("copy-label");var b=document.getElementById("error-details").textContent;if(navigator.clipboard)navigator.clipboard.writeText(b);else{var a=document.createElement("textarea");a.value=b;a.style.top="0";a.style.left="0";a.style.position="fixed";document.body.appendChild(a);a.focus();a.select();document.execCommand("copy");document.body.removeChild(a)}c.innerText="Copied text to clipboard"};document.addEventListener("DOMContentLoaded",function(){var c=document.getElementById("error-details-checkbox"),b=document.getElementById("click-to-copy-btn");document.getElementById("copy-label").classList.remove("hidden");c.addEventListener("change",d);b.addEventListener("click",e)})}})(); getChatStream Exception: </script> getChatStream Exception: <script defer src="https://performance.radar.cloudflare.com/beacon.js"></script> getChatStream Exception: head> getChatStream Exception: ody> getChatStream Exception: iv class="cf-main-wrapper" role="main"> getChatStream Exception: <div class="cf-header cf-section"> getChatStream Exception: <div class="cf-error-title"> getChatStream Exception: <h1>Access denied</h1> getChatStream Exception: <span class="cf-code-label">Error code <span>1020</span></span> getChatStream Exception: </div> getChatStream Exception: <div class="cf-error-description"> getChatStream Exception: <p>You do not have access to chat.openai.com.</p><p>The site owner may have set restrictions that prevent you from accessing the site.</p> getChatStream Exception: </div> getChatStream Exception: </div> getChatStream Exception: div> getChatStream Exception: iv class="cf-details-wrapper"> getChatStream Exception: <div class="cf-section" role="region"> getChatStream Exception: <div class="cf-expandable" id="cf-details-wrapper-expandable"> getChatStream Exception: <label for="error-details-checkbox" title="Error details" class="cf-expandable-btn"> getChatStream Exception: <p class="cf-dropdown-title">Error details</p> getChatStream Exception: <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAElBMVEUAAAAwMDAxMTEyMjIwMDAxMTF+89HTAAAABXRSTlMAf2CAMKS61bwAAABTSURBVCjPzcq7DcAgFENR5zMATfo06TNCViAS+6+CeFi6gglw4eLqaPVtaQpXnkApaQT/k0dw70EAUhCA1AnABGACMAGYAEwAkCOAydv+I5xaZhXWbQrD80TkkQAAAABJRU5ErkJggg==" getChatStream Exception: class="cf-caret-icon" id="caret-icon" alt="Caret icon" /> getChatStream Exception: </label> getChatStream Exception: <input id="error-details-checkbox" class="hidden" type="checkbox"> getChatStream Exception: <div class="cf-expandable-error-info hidden"> getChatStream Exception: <p class="cf-error-copy-description">Provide the site owner this information.</p> getChatStream Exception: <button class="cf-click-to-copy-btn" id="click-to-copy-btn" title="Click to copy" type="button"> getChatStream Exception: class="cf-error-wrapper" id="error-details"><p class="cf-error-details-endpoint">I got an error when visiting chat.openai.com/backend-api/conversation.</p> getChatStream Exception: ror code: 1020</p> getChatStream Exception: y ID: 79209be028d497e7</p> getChatStream Exception: untry: CN</p> getChatStream Exception: ta center: sjc05</p> getChatStream Exception: : 220.250.40.152</p> getChatStream Exception: mestamp: 2023-01-31 07:07:10 UTC</p> getChatStream Exception: > getChatStream Exception: <p class="cf-copy-label hidden" id="copy-label">Click to copy</p> getChatStream Exception: </button> getChatStream Exception: </div> getChatStream Exception: </div> getChatStream Exception: </div> getChatStream Exception: <div class="clearfix cf-footer cf-section" role="contentinfo"> getChatStream Exception: <div class="cf-column"> getChatStream Exception: <div class="feedback-hidden py-8 text-center" id="error-feedback"> getChatStream Exception: div id="error-feedback-survey" class="footer-line-wrapper"> getChatStream Exception: Was this page helpful? getChatStream Exception: <button class="border border-solid bg-white cf-button cursor-pointer ml-4 px-4 py-2 rounded" id="feedback-button-yes" type="button">Yes</button> getChatStream Exception: <button class="border border-solid bg-white cf-button cursor-pointer ml-4 px-4 py-2 rounded" id="feedback-button-no" type="button">No</button> getChatStream Exception: /div> getChatStream Exception: div class="feedback-success feedback-hidden" id="error-feedback-success"> getChatStream Exception: Thank you for your feedback! getChatStream Exception: /div> getChatStream Exception: > getChatStream Exception: </div> getChatStream Exception: <div class="cf-column cf-footer-line-wrapper text-center"> getChatStream Exception: <p> getChatStream Exception: Performance &amp; security by <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=1020_error" target="_blank">Cloudflare <img class="external-link" title="Opens in new tab" src="/cdn-cgi/images/external.png" alt="External link"></a> getChatStream Exception: </p> getChatStream Exception: </div> getChatStream Exception: </div> getChatStream Exception: div> getChatStream Exception: pt>(function(){var js = "window['__CF$cv$params']={r:'79209be028d497e7',m:'jgaXBBMueoOydisEO.qS9XaykXP0Ib9PS7yn65yfVyA-1675148830-0-AZmzeISkITeguwqKgEYC4Gn8MGAJfLm3VoiE9NxgqNSeKyaFK3EIYyRVIlv8orKDzZh+NiJfDSuJzGhCsQrtTmmeG7y1yY0Qt2dwKZmC1ItIi3m4QXibYgmQyUkTeDf2uzqoliay5dAH0n6qIInoes0=',s:[0x87d10c320e,0xe7e38ed135],u:'/cdn-cgi/challenge-platform/h/g'};var now=Date.now()/1000,offset=14400,ts=''+(Math.floor(now)-Math.floor(now%offset)),_cpo=document.createElement('script');_cpo.nonce='',_cpo.src='/cdn-cgi/challenge-platform/h/g/scripts/alpha/invisible.js?ts='+ts,document.getElementsByTagName('head')[0].appendChild(_cpo);";var _0xh = document.createElement('iframe');_0xh.height = 1;_0xh.width = 1;_0xh.style.position = 'absolute';_0xh.style.top = 0;_0xh.style.left = 0;_0xh.style.border = 'none';_0xh.style.visibility = 'hidden';document.body.appendChild(_0xh);function handler() {var _0xi = _0xh.contentDocument || _0xh.contentWindow.document;if (_0xi) {var _0xj = _0xi.createElement('script');_0xj.nonce = '';_0xj.innerHTML = js;_0xi.getElementsByTagName('head')[0].appendChild(_0xj);}}if (document.readyState !== 'loading') {handler();} else if (window.addEventListener) {document.addEventListener('DOMContentLoaded', handler);} else {var prev = document.onreadystatechange || function () {};document.onreadystatechange = function (e) {prev(e);if (document.readyState !== 'loading') {document.onreadystatechange = prev;handler();}};}})();</script></body> getChatStream Exception: l> null

ChatGPT.builder().apiKeyList函数存在空指针的问题

代码详情

ChatGPT chatGPT = ChatGPT.builder()
 .apiKeyList(Arrays.asList("key1","ke2","key3"))
 .proxy(proxy)

报错详情

Exception in thread "main" java.lang.NullPointerException: apiKey is marked non-null but is null
	at com.plexpt.chatgpt.ChatGPT.<init>(ChatGPT.java:49)
	at com.plexpt.chatgpt.ChatGPT$ChatGPTBuilder.build(ChatGPT.java:48)

启动需要特殊的网络环境吗

启动需要特殊的网络环境吗,一直是连接超时
Exception in thread "main" cn.hutool.core.io.IORuntimeException: ConnectException: Connection timed out: connect at cn.hutool.http.HttpRequest.send(HttpRequest.java:1304) at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1156) at cn.hutool.http.HttpRequest.execute(HttpRequest.java:1030) at cn.hutool.http.HttpRequest.execute(HttpRequest.java:1006) at com.github.plexpt.chatgpt.Session.get2(Session.java:77) at com.github.plexpt.chatgpt.Chatbot.refreshSession(Chatbot.java:270) at com.github.plexpt.chatgpt.Chatbot.<init>(Chatbot.java:46) at com.github.plexpt.chatgpt.ChatGTP.main(ChatGTP.java:55) Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666) at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:162) at cn.hutool.http.HttpConnection.connect(HttpConnection.java:379) at cn.hutool.http.HttpRequest.send(HttpRequest.java:1299) ... 7 more n 进程已结束,退出代码1

一些有趣的玩法

可以写代码,写小说,写作文、演讲稿、工作报告、读书笔记、合同等

更多的可以在这展示

新的报错

Cannot invoke "java.util.Map.containsKey(Object)" because "this.config" is null
resources里面已经配置号config。引入maven后测试代码没改。包如上错误

设置代理

有没有办法设置一个代理呢,因为国内并不能登录openai,但是使用代理获得的token加上国内的cf_clearance和user-agent并不能成功访问。所以希望能添加个代理设置。

接入qq群 正常运行了一段时间 突然再也无法成功响应了 堆栈信息如下

2022-12-09 12:17:48.300 ERROR 7095 --- [nio-5800-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.fastjson2.JSONException: illegal input, offset 1, char a] with root cause

com.alibaba.fastjson2.JSONException: illegal input, offset 1, char a
at com.alibaba.fastjson2.JSONReader.read(JSONReader.java:1432) ~[fastjson2-2.0.20.jar!/:na]
at com.alibaba.fastjson2.JSON.parseObject(JSON.java:193) ~[fastjson2-2.0.20.jar!/:na]
at com.github.plexpt.chatgpt.Chatbot.getChatText(Chatbot.java:169) ~[chatgpt-1.0.1.jar!/:na]
at com.github.plexpt.chatgpt.Chatbot.getChatResponse(Chatbot.java:293) ~[chatgpt-1.0.1.jar!/:na]
at com.github.plexpt.chatgpt.Chatbot.getChatResponse(Chatbot.java:302) ~[chatgpt-1.0.1.jar!/:na]
at com.techtree.robot.controller.RobotController.getAppList4Crx(RobotController.java:41) ~[classes!/:1.0-SNAPSHOT]
at jdk.internal.reflect.GeneratedMethodAccessor28.invoke(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar!/:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar!/:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar!/:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]

image

错误:: SSLHandshakeException: Received fatal alert: handshake_failure

Exception in thread "main" cn.hutool.core.io.IORuntimeException: SSLHandshakeException: Received fatal alert: handshake_failure
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1304)
at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1156)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:1030)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:1006)
at com.github.plexpt.chatgpt.Session.get2(Session.java:77)
at com.github.plexpt.chatgpt.Chatbot.refreshSession(Chatbot.java:270)
at com.github.plexpt.chatgpt.Chatbot.(Chatbot.java:62)
at TestApi.main(TestApi.java:115)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at cn.hutool.http.HttpConnection.connect(HttpConnection.java:379)
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1299)
... 7 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.