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

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

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

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 扫描枚举类并获取属性
1、(必须)要返回的枚举必须遵守 MyEnum 接口规范,不一定要实现该接口,但必须有 getKey 和 getValue 两个方法;
訾博ZiBo
2025/01/06
1180
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
下面的部分就是存放对应模型的url和Serverid以及秘钥 这些是根据你们要选定的模型去改的
苏泽
2024/03/01
3.2K0
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
还不会SpringBoot项目模块分层?来这手把手教你
经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美。反观自己代码层级混乱,,却不知如何整理分层。此文手把手教你一步一步创建模块,左手右手一个慢动作。结合本人实际开发及个人项目中分层思路的分享,大神请勿喷。
JavaDog程序狗
2024/10/11
1.1K0
还不会SpringBoot项目模块分层?来这手把手教你
Java开发SDK详解->SDK开发
File ——》 Project Structure ——》 Project Settings ——》 Artifacts ——》 右栏左上角+ ——》JAR ——》 From Modules with dependencies——》OK
全栈程序员站长
2022/09/08
5.9K0
Redis系列之实现分布式自增主键
使用Redis来实现分布式的主键自增主要是依赖于Redis的INCR命令,调用INCR命令的对应key,其数值是实现递增加一,所以利用这个性质,将redis独立部署起来就可以实现分布式环境的自增ID,如图,使用INCR命令的例子
SmileNicky
2023/11/10
6040
Redis系列之实现分布式自增主键
命令模式-接收者与执行者解耦和
老板:阿飞,咱们公司又接了个新项目,一个客户,,卧室和客厅很大,电灯电视开关也不好找,所以希望制造一个遥控器来控制一些家具的开启与关闭,目前需要5个按键,卧室的灯,卧室的电视,客厅的灯,客厅的电视,在留一个预备按键。我等会把需求文档给你。 项目组长阿飞:好的,老板 项目组长阿飞:小三,来了个需求,你看下,你先设计一下架构 阿三:好的,飞哥
杨小杰
2019/07/04
4180
SpringSecurity入门
Spring Security是一套权限框架,此框架可以帮助我们为项目建立丰富的角色与权限管理。
半月无霜
2023/03/25
1.5K0
SpringSecurity入门
Spring Boot 2.X 来临,本文将带你起飞!
当前互联网技术盛行,以Spring 框架为主导的Java 互联网技术成了主流,而基于Spring 技术衍生出来的Spring Boot,采用了“约定优于配置”的思想,极大地简化了Spring 框架的开发。
Java技术栈
2018/08/17
4960
Spring Boot 2.X 来临,本文将带你起飞!
Springboot整合RabbitMQ ,用心看完这一篇就够了
其中APPLICATIONS DISABLED 标示是必须要安装的,另外两个项目可以忽略,我们上上面--without-javac忽略了java编译,出现这个就算配置成功了。
I Teach You 我教你
2023/07/18
7140
Spring boot整合JWT
springboot整合jwt pom.xml添加依赖 <dependencies> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.
ruochen
2021/11/25
6830
Spring Boot 2.x: 定时给对象发送天气
不知不觉,又到了雨季,你对象是不是经常忘记带伞呢,这个时候写一个自动定时发送邮件的程序,提醒她带伞,会不会对你崇拜有加呢,当然,如果你对象是一位攻城狮,当我没讲~
全栈程序员站长
2022/09/18
2710
Spring Boot 2.x: 定时给对象发送天气
史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29 完善更新小程序代码,2022.4.27 更新
在网上找了很多很多,看了不下几十篇,说实话,有些给出了核心代码,添上一个微信官方的那张流程图就结束了,会的人一下就懂了。但是说实话,真的不适合入门学者,浪费很多时间都不一定能解决问题,将代码复制完不是少这就是少那,或者就是不齐,不然就是跑不起来,不知道看到这篇文章的你有没有遇到过这样的问题。
宁在春
2022/10/31
7.9K1
史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29 完善更新小程序代码,2022.4.27 更新
Java | 实现一个ORM比你想象的还要简单
原理ORM 实现1. 通过注解来将 Java Bean 和数据库字段关联2. 反射工具类3. 简单的 model 示例4. 注解解析5. 数据库操作6. 结合反射实现查询操作使用动态代理实现 @Query @Select 类似功能1. 动态代理2. 注解3. 表设计4. model5. repository7. 大体流程8. 代理使用9. 将生成代理放入 Spring IOC 容器中10. invoke方法处理
双鬼带单
2021/03/18
1.5K0
Spring学习笔记(三十一)——SpringBoot JPA优雅高效的工具:QueryHelp
有下面的一个问题: 如果需要一个接口,可以根据传进来的不确定的多个参数动态的,条件的查询数据,这个需要怎么处理呢? 其实这个问题在之前的做项目中也有遇到过,处理方法是使用MyBatis的配置语句动态进行拼接,有一种if-else的感觉,当时做这个需求还是挺麻烦的。
不愿意做鱼的小鲸鱼
2022/09/26
1.5K0
Spring学习笔记(三十一)——SpringBoot JPA优雅高效的工具:QueryHelp
实现免费ChatGPT前后端SpringBoot&Vue
第四步:复制密钥值,替换上面代码中的sk-*******,替换后的代码如下所示:.header(“Authorization”, “Bearer sk-1234567890123456789”)
知识浅谈
2024/05/25
3550
实现免费ChatGPT前后端SpringBoot&Vue
基于Feign初探Ranger Api
在大数据平台之权限管理组件 - Aapche Ranger一文中我们了解了Ranger以及安装部署过程以及Admin可视化界面的使用。
端碗吹水
2020/11/13
9831
基于Feign初探Ranger Api
SpringBoot系列之基于Jersey实现文件上传API
在IDEA里new一个project,这里使用Spring Initializer快速创建一个SpringBoot项目,Server url可以使用Spring官网的,也可以使用阿里的,然后点击Next
SmileNicky
2023/08/14
7260
SpringBoot系列之基于Jersey实现文件上传API
【微信小程序】使用Java后端语言发送订阅(模板)消息
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
小帅丶
2021/12/28
2.2K0
【微信小程序】使用Java后端语言发送订阅(模板)消息
【Java对象转换】003- Java 对象与 Yaml 互转
可参考本人其他文章:《【Spring Boot】003-yaml语法》 https://blog.csdn.net/qq_29689343/article/details/108545693 二、yaml语法
訾博ZiBo
2025/01/06
2020
Java验证身份证号入参还能这样操作?雅,太优雅了
之前我一般是在Controller验证,自己编写正则表达式,提示和返回错误提示信息。
大风写全栈
2024/11/21
1100
Java验证身份证号入参还能这样操作?雅,太优雅了
推荐阅读
相关推荐
Java 扫描枚举类并获取属性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验