前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Java在国内不访问国外网站调用Chatgpt API实现问答对话

使用Java在国内不访问国外网站调用Chatgpt API实现问答对话

作者头像
I Teach You 我教你
发布于 2023-07-18 10:14:40
发布于 2023-07-18 10:14:40
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

OpenAI开放的api接口调用很简单,只要用post请求就可以了。但是因为地区限制,国内无法直接使用这个方法。但我们可以通过Cloudflare来进行套壳转发请求来完成国内对openai的访问。

Open AI提供的API
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1curl https://api.openai.com/v1/chat/completions \
2  -H "Content-Type: application/json" \
3  -H "Authorization: Bearer **" \
4  -d '{
5     "model": "gpt-3.5-turbo",
6     "messages": [{"role": "user", "content": "Say this is a test!"}],
7     "temperature": 0.7
8   }'
域名申请

在使用Cloudflare进行转发请求时,我们首选需要一个域名,可以从下面两个网站中进行申请,首年免费。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1Freenom:https://www.freenom.com
2硅云:https://www.vpsor.cn/

这两个网站都可以获得免费域名,我使用的是硅云,注册信息要用身份证实名认证,大概信息填写后等2-4个小时就有结果了。

Cloudflare托管
  1. 注册账号并登录
  2. 网站->添加站点,如下图
  1. 添加站点时,选择Free免费版本,如下图
  1. 继续,如图
  1. 添加DNS服务器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1anderson.ns.cloudflare.com
2carol.ns.cloudflare.com

我的域名是在国内西部数码中注册的,在域名管理界面中,删除原有DNS服务,使用自定义配置即可,如图

配置Worker路由
  1. 点击站点->Worker路由,如图
  1. 添加路由chat.wjn.info/* 我的站点已经添加好一条,如果你是首次,则直接添加即可
  2. 管理Worker
  1. 快速编辑 将默认代码,换成如下代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1const TELEGRAPH_URL = 'https://api.openai.com';
 2
 3addEventListener('fetch', event => {
 4  event.respondWith(handleRequest(event.request))
 5})
 6
 7async function handleRequest(request) {
 8  console.log('hello');
 9  const url = new URL(request.url);
10  url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');
11console.log(request.headers);
12  const modifiedRequest = new Request(url.toString(), {
13    headers: request.headers,
14    method: request.method,
15    body: request.body,
16    redirect: 'follow'
17  });
18
19  const response = await fetch(modifiedRequest);
20  const modifiedResponse = new Response(response.body, response);
21
22  // 添加允许跨域访问的响应头
23  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
24
25  return modifiedResponse;
26}
Java中调用

pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1<dependency>
 2    <groupId>org.projectlombok</groupId>
 3    <artifactId>lombok</artifactId>
 4    <optional>true</optional>
 5</dependency>
 6
 7<dependency>
 8    <groupId>cn.hutool</groupId>
 9    <artifactId>hutool-all</artifactId>
10    <version>5.8.16</version>
11</dependency>
12
13<dependency>
14    <groupId>com.alibaba</groupId>
15    <artifactId>fastjson</artifactId>
16    <version>2.0.10</version>
17</dependency>

Main.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.controller;
 2
 3import java.io.IOException;
 4import java.util.Scanner;
 5
 6import cc.iteachyou.chatgpt.ChatGPTUtil;
 7
 8public class Main{
 9    public static void main(String[] args) throws IOException {
10        while (true) {
11            System.out.print("\n请输入问题(q退出):");
12            String question = new Scanner(System.in).nextLine();
13            if ("q".equals(question)) break;
14            long start = System.currentTimeMillis();
15            String answer = ChatGPTUtil.getAnswer(question);
16            long end = System.currentTimeMillis();
17            System.out.println("该回答花费时间为:" + (end - start) / 1000.0 + "秒");
18            System.out.println(answer);
19        }
20    }
21}

ChatGPTUtil.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt;
 2import java.io.IOException;
 3
 4import com.alibaba.fastjson.JSON;
 5import com.fasterxml.jackson.databind.ObjectMapper;
 6
 7import cc.iteachyou.chatgpt.entity.ChatGPTMessage;
 8import cc.iteachyou.chatgpt.entity.ChatGPTRequestParameter;
 9import cc.iteachyou.chatgpt.entity.ChatGPTResponseParameter;
10import cc.iteachyou.chatgpt.entity.Choices;
11import cn.hutool.http.Header;
12import cn.hutool.http.HttpRequest;
13import cn.hutool.http.HttpResponse;
14
15/**
16 * @author ttpfx
17 * @date 2023/3/23
18 */
19public class ChatGPTUtil {
20    /**
21     * 自己chatGpt的ApiKey
22     */
23    private static String API_KEY = "";
24    /**
25     * 对应的请求接口
26     */
27    private static String URL = "https://chat.t-nn.com/v1/chat/completions";
28
29    /**
30     * 创建一个ChatGptRequestParameter,用于携带请求参数
31     */
32    private static ChatGPTRequestParameter chatGptRequestParameter = new ChatGPTRequestParameter();
33
34    /**
35     * 相应超时时间,毫秒
36     */
37    private int responseTimeout = 60000;
38
39    public static String getAnswer(String question) {
40        // 创建一个HttpPost
41        chatGptRequestParameter.addMessages(new ChatGPTMessage("user", question));
42
43        String raw = JSON.toJSONString(chatGptRequestParameter);
44
45        HttpRequest request = HttpRequest.post(URL)
46            .body(raw)
47            .header(Header.CONTENT_TYPE.getValue(), "application/json")
48            .header(Header.AUTHORIZATION.getValue(), "Bearer " + API_KEY);
49
50        HttpResponse response = request.execute();
51        try {
52            String body = response.body();
53
54            ObjectMapper objectMapper = new ObjectMapper();
55            // 转换为对象
56            ChatGPTResponseParameter responseParameter = objectMapper.readValue(body, ChatGPTResponseParameter.class);
57            String ans = "";
58            // 遍历所有的Choices(一般都只有一个)
59            for (Choices choice : responseParameter.getChoices()) {
60                ChatGPTMessage message = choice.getMessage();
61                chatGptRequestParameter.addMessages(new ChatGPTMessage(message.getRole(), message.getContent()));
62                String s = message.getContent().replaceAll("\n+", "\n");
63                ans += s;
64            }
65            // 返回信息
66            return ans;
67        } catch (IOException e) {
68            e.printStackTrace();
69        }
70        // 发生异常,移除刚刚添加的ChatGptMessage
71        chatGptRequestParameter.getMessages().remove(chatGptRequestParameter.getMessages().size()-1);
72        return "您当前的网络无法访问";
73    }
74}

ChatGPTMessage.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.entity;
 2
 3import lombok.AllArgsConstructor;
 4import lombok.Data;
 5import lombok.NoArgsConstructor;
 6
 7@Data
 8@NoArgsConstructor
 9@AllArgsConstructor
10public class ChatGPTMessage {
11    private String role;
12    private String content;
13}

ChatGPTRequestParameter.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.entity;
 2
 3import java.util.ArrayList;
 4import java.util.List;
 5
 6import lombok.Data;
 7
 8@Data
 9public class ChatGPTRequestParameter {
10    private String model = "gpt-3.5-turbo-0301";
11    private List<ChatGPTMessage> messages = new ArrayList<>();
12
13    public void addMessages(ChatGPTMessage message) {
14        this.messages.add(message);
15    }
16}

ChatGPTResponseParameter.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.entity;
 2
 3import java.util.List;
 4
 5import lombok.Data;
 6
 7@Data
 8public class ChatGPTResponseParameter {
 9    private String id;
10    private String object;
11    private String created;
12    private String model;
13    private Usage usage;
14    private List<Choices> choices;
15}

Choices.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.entity;
 2
 3import lombok.Data;
 4
 5@Data
 6public class Choices {
 7    ChatGPTMessage message;
 8    String finish_reason;
 9    Integer index;
10}

Usage.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package cc.iteachyou.chatgpt.entity;
 2
 3import lombok.Data;
 4
 5@Data
 6public class Usage {
 7    String prompt_tokens;
 8    String completion_tokens;
 9    String total_tokens;
10}
测试
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/05/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RibbitMQ学习笔记之MQ发布确认
生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,**所有在该信道上面发布的消息都将会被指派一个唯一的 ID( 从 1 开始),**一旦消息被投递到所有匹配的队列之后,broker 就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker 回传给生产者的确认消息中 delivery-tag 域包含了确认消息的序列号,此外 broker 也可以设置basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理。
默 语
2024/11/20
790
RibbitMQ学习笔记之MQ发布确认
RabbitMQ 学习(七)----发布确认
  保证生产者将信息成功的发送到 RabbitMQ的 server端了,那么broker就会回一个确认,如果没有收到或者收到拒绝信息,那么说明可能网络不好没有发送成功,server端宕机了,broker拒绝接收等情况,如果不进行后续处理,那么信息就会丢失,生产者收到失败的消息使用回调函数在进行处理。
RAIN7
2022/10/07
5150
RabbitMQ 学习(七)----发布确认
rabbitmq如何保证消息可靠性不丢失
因为MQ整个消息周期设计到上述的三个角色,所以我们从这个三个角色开始讨论丢失数据的情况。并如何解决
啵啵肠
2023/11/28
2210
爆肝3万字,为你吃透RabbitMQ,最详细的RabbitMQ讲解(VIP典藏版)
早在之前就了解到了消息中间件,但是一直没有系统的学习,最近花了一段时间系统学习了当下最为主流的 RabbitMQ 消息队列,学习过程中也随时记录,刚开始学习的时候懵懵懂懂,做的笔记都比较杂乱,系统学习完后我将笔记内容不断反复修改,对章节进行设计调整,最终整合出了以下好理解、案例多、超详细的 RabbitMQ 学习笔记,希望能帮到大家~
SmallRoll小卷
2023/03/05
12.6K0
爆肝3万字,为你吃透RabbitMQ,最详细的RabbitMQ讲解(VIP典藏版)
【RabbitMQ】发布确认机制的具体实现
发送确认机制最大的好处在于它是异步的,生产者可以同时发布消息和等待信道返回确认消息
椰椰椰耶
2025/05/15
850
【RabbitMQ】发布确认机制的具体实现
RabbitMQ事务和Confirm发送方消息确认——深入解读
根据前面的知识(深入了解RabbitMQ工作原理及简单使用、Rabbit的几种工作模式介绍与实践)我们知道,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示:
磊哥
2018/08/02
1.4K0
RabbitMQ事务和Confirm发送方消息确认——深入解读
MQ发布确认
  生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker回传给生产者的确认消息中delivery-tag域包含了确认消息的序列号,此外broker也可以设置basic.ack的multiple域,表示到这个序列号之前的所有消息都已经得到了处理。
一个风轻云淡
2022/11/13
1.3K0
MQ发布确认
RabbitMQ发布确认
  生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker 回传给生产者的确认消息中 delivery-tag 域包含了确认消息的序列号,此外 broker 也可以设置basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理。   confirm 模式最大的好处在于他是异步的,一旦发布一条消息,生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,如果 RabbitMQ 因为自身内部错误导致消息丢失,就会发送一条 nack 消息,生产者应用程序同样可以在回调方法中处理该 nack 消息。
别团等shy哥发育
2023/02/25
7270
RabbitMQ发布确认
RabbitMQ中的消息确认机制是什么?为什么需要消息确认?
RabbitMQ中的消息确认机制是指生产者发送消息后,等待消费者确认消息已经被正确接收和处理的一种机制。消息确认机制的主要目的是确保消息的可靠传递和处理,以避免消息丢失或重复处理的情况发生。
GeekLiHua
2025/01/21
2020
RabbitMQ异步发布确认
RabbitMQ的异步发布确认(Asynchronous Publish Confirm)是一种机制,用于在消息发送过程中异步地接收确认回调,以提高生产者的吞吐量和性能。通过使用异步发布确认,生产者可以在消息发送的同时继续执行其他操作,而不需要等待每条消息的确认回调。
堕落飞鸟
2023/05/16
7590
RabbitMQ之消息应答与发布确认
生产者发布消息到 RabbitMQ 后,需要 RabbitMQ 返回「ACK(已收到)」给生产者,这样生产者才知道自己生产的消息成功发布出去。
shaoshaossm
2022/12/27
5810
RabbitMQ之消息应答与发布确认
RabbitMQ 消息确认机制
消息的确认,是指生产者投递消息后,如果 Broker 收到消息,则会给我们生产者一个应答。生产者进行接收应答,用来确定这条消息是否正常的发送到 Broker ,这种方式也是消息的可靠性投递的核心保障!
海向
2019/09/23
1.2K0
RabbitMQ 消息确认机制
【消息队列之rabbitmq】Rabbitmq之消息可靠性投递和ACK机制实战
上篇文章介绍了rabbitmq的基本知识、交换机类型实战《【消息队列之rabbitmq】学习RabbitMQ必备品之一》 这篇文章主要围绕着消息确认机制为中心,展开实战;接触过消息中间件的伙伴都知道,消息会存在以下问题: 1、消息丢失问题和可靠性投递问题; 2、消息如何保证顺序消费; 3、消息如何保证幂等性问题,即重复消费问题等等… 本文主要以Rabbitmq消息中间件解决问题一的实践,其他问题小编会重新写文章总结;
沁溪源
2022/01/13
1.3K0
【消息队列之rabbitmq】Rabbitmq之消息可靠性投递和ACK机制实战
RabbitMq可靠性分析
最近了解并简单实用了下Rabbitmq,整个使用也大致了解了,但是要作做到真正的可靠,仅仅依赖于应用提供的方式是否在业务环境中真的能够达到可靠的目的。当然我们所谓的可靠性主要指的以下几方面(个人认为):
sucl
2019/08/07
4090
RabbitMQ学习
接口是为http协议的情况下,最好不要处理比较耗时的业务逻辑,耗时的业务逻辑应该单独交给多线程或者是mq处理。
晓果冻
2022/09/08
3110
RabbitMQ学习
RabbitMQ生产者Confirm消息(三)
RabbitMQ的特性是保障数据的一致性,稳定性和可靠性。但是如何来保障这些了?这就有了很多的保障机制。在前面的文章体系中也是介绍到RabbitMQ中的生产者负责把消息发送到Exchange,并不需要关心Queue是什么,那么问题就出现了,如果生产者发送的MQ消息消费者没有收到了?这如何可以做到前面说的数据的一致性以及可靠性了。我们可以结合现实的例子来看这部分,比如我向别人借了100元,然后我要了对方的银行卡号,把钱还给了对方,但是我给对方没有说,那么其实对方是不知道的,所以在对方的心理我始终还是欠他100元的,其实这样的案例在我实际的生活就出现过,当然是很多年前的事了,总是这过程确认反馈的机制。技术也是需要符合人性的,那么RabbitMQ为了做到数据的一致性的保障,在生产者端就有Confirm的确认机制。
无涯WuYa
2022/03/29
9210
RabbitMQ生产者Confirm消息(三)
RabbitMQ
​ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
OY
2022/03/21
1.8K0
RabbitMQ
消息队列RabbitMQ核心:简单(Hello World)模式、队列(Work Queues)模式、发布订阅模式
消息队列RabbitMQ提供了六种工作模式:简单模式、work queues、发布订阅模式、路由模式、主题模式、发布确认模式。本文将介绍前三种工作模式。所有的案例代码都是使用Java语言实现。
百思不得小赵
2022/12/07
5880
消息队列RabbitMQ核心:简单(Hello World)模式、队列(Work Queues)模式、发布订阅模式
RabbitMQ---消息队列---上半部分
MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
大忽悠爱学习
2021/12/07
1.1K0
RabbitMQ---消息队列---上半部分
RabbitMQ学习之消息可靠性及特性
转载自 https://blog.csdn.net/zhu_tianwei/article/details/53971296
allsmallpig
2021/02/25
5970
相关推荐
RibbitMQ学习笔记之MQ发布确认
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验