All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pkslow.ai.util.BardUtils Maven / Gradle / Ivy

package com.pkslow.ai.util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.pkslow.ai.domain.Answer;
import com.pkslow.ai.domain.AnswerStatus;
import com.pkslow.ai.domain.BardRequest;
import com.pkslow.ai.domain.BardResponse;
import lombok.extern.slf4j.Slf4j;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.jetbrains.annotations.NotNull;

import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.pkslow.ai.util.Constants.*;

@Slf4j
public class BardUtils {

    public static Request.Builder createBuilderWithBardHeader(String token) {
        return new Request.Builder()
                .addHeader("Host", HOSTNAME)
                .addHeader("Content-Type", CONTENT_TYPE)
                .addHeader("X-Same-Domain", "1")
                .addHeader("User-Agent", USER_AGENT)
                .addHeader("Origin", BASE_URL)
                .addHeader("Referer", BASE_URL)
                .addHeader("Cookie", TOKEN_COOKIE_NAME + "=" + token);
    }

    public static Request createRequestForSNlM0e(String token) {
        Request.Builder headerBuilder = createBuilderWithBardHeader(token);
        return headerBuilder.url(BASE_URL)
                .build();
    }

    public static String fetchSNlM0eFromBody(String input) {
        Pattern p = Pattern.compile("SNlM0e\":\"(.*?)\"");
        Matcher m = p.matcher(input);
        if (m.find()) {
            String result = m.group();
            result = result.substring(9, result.length() - 1);
            return result;
        }
        return null;
    }

    @NotNull
    public static Map genQueryStringParamsForAsk() {
        int randonNum = ThreadLocalRandom.current().nextInt(0, 10000);
        randonNum = randonNum + 100000;

        Map params = new HashMap<>();
        params.put("bl", BARD_VERSION);
        params.put("_reqid", String.valueOf(randonNum));
        params.put("rt", "c");
        return params;
    }

    @NotNull
    public static HttpUrl.Builder createHttpBuilderForAsk() {
        Map params = genQueryStringParamsForAsk();
        HttpUrl.Builder httpBuilder = Objects.requireNonNull(HttpUrl.parse(BASE_URL + ASK_QUESTION_PATH)).newBuilder();
        for (Map.Entry param : params.entrySet()) {
            httpBuilder.addQueryParameter(param.getKey(), param.getValue());
        }
        return httpBuilder;
    }

    /**
     * remove backslash \ in answer string
     */
    public static String removeBackslash(String answerStr) {
        answerStr = answerStr.replace("\\\\n", "\n");
        answerStr = answerStr.replace("\\", "\"");
        return answerStr;
    }

    @NotNull
    public static Request createPostRequestForAsk(String token, BardRequest bardRequest) {
        HttpUrl.Builder httpBuilder = createHttpBuilderForAsk();
        RequestBody body = buildRequestBodyForAsk(bardRequest);
        Request.Builder headerBuilder = createBuilderWithBardHeader(token);
        return headerBuilder.url(httpBuilder.build())
                .method("POST", body)
                .build();
    }


    @NotNull
    public static RequestBody buildRequestBodyForAsk(BardRequest bardRequest) {
        return new FormBody.Builder()
                .add("f.req", String.format("[null,\"[[\\\"%s\\\"],null,[\\\"%s\\\",\\\"%s\\\",\\\"%s\\\"]]\"]",
                        bardRequest.getQuestion(), bardRequest.getConversationId(), bardRequest.getResponseId(), bardRequest.getChoiceId()))
                .add("at", bardRequest.getStrSNlM0e())
                .build();
    }

    public static BardResponse renderBardResponseFromResponse(String content) {
        Answer.AnswerBuilder builder = Answer.builder();
        Answer answer;
        String conversationId = "";
        String responseId = "";
        String choiceId = "";

        try {
            JsonArray jsonArray = new Gson().fromJson(content, JsonArray.class);

            JsonElement element3 = ((JsonArray) jsonArray.get(0)).get(2);
            String content3 = element3.getAsString();

            JsonArray jsonArray3 = new Gson().fromJson(content3, JsonArray.class);

            conversationId = ((JsonArray) jsonArray3.get(1)).get(0).getAsString();
            responseId = ((JsonArray) jsonArray3.get(1)).get(1).getAsString();

            String chosenAnswer = ((JsonArray) jsonArray3.get(0)).get(0).getAsString();
            chosenAnswer = removeBackslash(chosenAnswer);

            builder.chosenAnswer(chosenAnswer);

            choiceId = ((JsonArray) ((JsonArray) jsonArray3.get(4)).get(0)).get(0).getAsString();


            try {
                String imageURL = ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) jsonArray3.get(4)).get(0)).get(4)).get(0)).get(3)).get(0)).get(0).getAsString();
                String articleURL = ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) ((JsonArray) jsonArray3.get(4)).get(0)).get(4)).get(0)).get(1)).get(0)).get(0).getAsString();
                builder.imageURL(imageURL);
                builder.articleURL(articleURL);
            } catch (Exception e) {
                log.info("No image");
            }

        } catch (Exception e) {
            builder.status(AnswerStatus.NO_ANSWER);
            answer = builder.build();
            return new BardResponse(conversationId, responseId, choiceId, answer);
        }

        builder.status(AnswerStatus.OK);
        answer = builder.build();
        return new BardResponse(conversationId, responseId, choiceId, answer);
    }


    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy