Skip to content

Commit 03e4225

Browse files
authored
Merge pull request #4 from AcaiSoftware/development
Added `cfClearance` and `userAgent` in order to bypass newly implemen…
2 parents 72eb47f + e5f9866 commit 03e4225

8 files changed

Lines changed: 35 additions & 11 deletions

File tree

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
# ChatGPT-Java
33
A **Java** wrapper for the unofficial reverse-engineered [ChatGPT](https://chat.openai.com/) API.
44

5+
## Important Update
6+
OpenAI have recently implemented Cloudflare's Under Attack mode on ChatGPT, meaning you will need to supply a valid Cloudflare cookie and user agent to use the API.
7+
8+
This may be temporary, however we do not know at the moment.
9+
10+
Refer to the [Registering ChatGPT](https://github.com/AcaiSoftware/chatgpt-java#registering-chatgpt) section for more information on how to set these values.
11+
512
## Add ChatGPT-Java to your own build
613
### Maven
714
```xml
@@ -13,7 +20,7 @@ A **Java** wrapper for the unofficial reverse-engineered [ChatGPT](https://chat.
1320
<dependency>
1421
<groupId>gg.acai</groupId>
1522
<artifactId>chatgpt-java</artifactId>
16-
<version>1.0.1</version>
23+
<version>1.0.2</version>
1724
</dependency>
1825
```
1926

@@ -22,7 +29,9 @@ A **Java** wrapper for the unofficial reverse-engineered [ChatGPT](https://chat.
2229
All builder fields are optional except for ``sessionToken``.
2330
```java
2431
ChatGPT chatGpt = ChatGPT.newBuilder()
25-
.sessionToken("token_here") // required field
32+
.sessionToken("token_here") // required field: get from cookies
33+
.cfClearance("cf_clearance_here") // required to bypass Cloudflare: get from cookies
34+
.userAgent("user_agent_here") // required to bypass Cloudflare: google 'what is my user agent'
2635
.addExceptionAttribute(new ParsedExceptionEntry("exception keyword", Exception.class)) // optional: adds an exception attribute
2736
.connectTimeout(60L) // optional: specify custom connection timeout limit
2837
.readTimeout(30L) // optional: specify custom read timeout limit

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>gg.acai</groupId>
88
<artifactId>chatgpt-java</artifactId>
9-
<version>1.0.1</version>
9+
<version>1.0.2</version>
1010

1111
<properties>
1212
<java.version>17</java.version>

src/main/java/gg/acai/chatgpt/AbstractConversation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public Response sendMessage(ChatGPTRequest request) {
6262
Request req = new okhttp3.Request.Builder()
6363
.header("Authorization", "Bearer " + gpt.getAccessToken())
6464
.header("Accept", "text/event-stream")
65-
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
65+
.header("User-Agent", gpt.getUserAgent())
6666
.header("Cookie", "cf_clearance=" + gpt.getCfClearance())
6767
.url(APIUrls.CONVERSATION_URL.getUrl())
6868
.post(b)

src/main/java/gg/acai/chatgpt/AbstractStreamConversation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public Response sendMessage(ChatGPTRequest request) {
6565
Request req = new okhttp3.Request.Builder()
6666
.header("Authorization", "Bearer " + gpt.getAccessToken())
6767
.header("Accept", "text/event-stream")
68-
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
68+
.header("User-Agent", gpt.getUserAgent())
6969
.header("Cookie", "cf_clearance=" + gpt.getCfClearance())
7070
.url(APIUrls.CONVERSATION_URL.getUrl())
7171
.post(b)

src/main/java/gg/acai/chatgpt/ChatGPT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,5 @@ static ChatGPTBuilder newBuilder() {
8989
*/
9090
ExceptionParser getExceptionParser();
9191

92+
String getUserAgent();
9293
}

src/main/java/gg/acai/chatgpt/ChatGPTAPI.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public final class ChatGPTAPI implements ChatGPT {
2525
private final OkHttpClient client;
2626
private final ExceptionParser exceptionParser;
2727
private final String cfClearance;
28-
public ChatGPTAPI(String sessionToken, String cfClearance, EventBus eventBus, List<ParsedExceptionEntry> entries, long connectTimeout, long readTimeout, long writeTimeout) {
28+
private final String userAgent;
29+
public ChatGPTAPI(String sessionToken, String cfClearance, String userAgent, EventBus eventBus, List<ParsedExceptionEntry> entries, long connectTimeout, long readTimeout, long writeTimeout) {
2930
instance = this;
3031

3132
this.client = new OkHttpClient.Builder()
@@ -40,6 +41,7 @@ public ChatGPTAPI(String sessionToken, String cfClearance, EventBus eventBus, Li
4041
this.exceptionParser = new ExceptionParser();
4142
this.exceptionParser.register(entries);
4243
this.cfClearance = cfClearance;
44+
this.userAgent = userAgent;
4345
}
4446

4547
@Override
@@ -87,6 +89,11 @@ public ExceptionParser getExceptionParser() {
8789
return this.exceptionParser;
8890
}
8991

92+
@Override
93+
public String getUserAgent() {
94+
return this.userAgent;
95+
}
96+
9097
public static ChatGPTAPI getInstance() {
9198
return instance;
9299
}

src/main/java/gg/acai/chatgpt/ChatGPTBuilder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ChatGPTBuilder {
2222
private long connectTimeout;
2323
private long writeTimeout;
2424
private String cfClearance;
25+
private String userAgent;
2526

2627
/**
2728
* Specifies the session token of the ChatGPT API
@@ -96,23 +97,29 @@ public ChatGPTBuilder writeTimeout(long writeTimeout) {
9697
return this;
9798
}
9899

100+
public ChatGPTBuilder userAgent(String userAgent) {
101+
this.userAgent = userAgent;
102+
return this;
103+
}
99104

100105
/**
101106
* Builds the ChatGPT API
102107
* @return Returns the ChatGPT API
103108
*/
104109
public ChatGPT build() {
105110
doBuildProcedure();
106-
ChatGPTAPI api = new ChatGPTAPI(sessionToken, cfClearance, eventBus, exceptionAttributes, connectTimeout, readTimeout, writeTimeout);
111+
ChatGPTAPI api = new ChatGPTAPI(sessionToken, cfClearance, userAgent, eventBus, exceptionAttributes, connectTimeout, readTimeout, writeTimeout);
107112
api.getComplexAccessCache().refreshAccessToken();
108113
return api;
109114
}
110115

111116
private void doBuildProcedure() {
112117
Requisites.requireNonNull(sessionToken, "Session token cannot be null");
113-
Requisites.requireNonNull(cfClearance, "cfClearance cannot be null");
118+
if (userAgent == null) userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36";
114119
if (connectTimeout == 0) connectTimeout = 60;
115120
if (readTimeout == 0) readTimeout = 30;
116121
if (writeTimeout == 0) writeTimeout = 30;
117122
}
123+
124+
118125
}

src/main/java/gg/acai/chatgpt/ComplexAccessCache.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ public AsyncPlaceholder<String> refreshAccessToken() {
5656
return cachedAccessToken;
5757
}
5858

59-
59+
ChatGPTAPI gpt = ChatGPTAPI.getInstance();
6060
ObjectMapper mapper = new ObjectMapper();
6161
Request req = new okhttp3.Request.Builder()
62-
.header("Cookie", "cf_clearance=" + ChatGPTAPI.getInstance().getCfClearance() + ";__Secure-next-auth.session-token=" + this.sessionToken)
63-
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
62+
.header("Cookie", "cf_clearance=" + gpt.getCfClearance() + ";__Secure-next-auth.session-token=" + this.sessionToken)
63+
.header("User-Agent", gpt.getUserAgent())
6464
.url(APIUrls.REFRESH_TOKEN_URL.getUrl())
6565
.get()
6666
.build();

0 commit comments

Comments
 (0)