diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6347174
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,131 @@
+# User-specific stuff
+.idea/
+
+*.iml
+*.ipr
+*.iws
+
+# IntelliJ
+out/
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+.gradle
+build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Cache of project
+.gradletasknamecache
+
+**/build/
+
+# Common working directory
+run/
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+
+# Local Test Launch point
+src/test/kotlin/RunTerminal.kt
+
+# Mirai console files with direct bootstrap
+/config
+/data
+/plugins
+/bots
+
+# Local Test Launch Point working directory
+/debug-sandbox
diff --git a/.run/RunTerminal.run.xml b/.run/RunTerminal.run.xml
new file mode 100644
index 0000000..d5e7432
--- /dev/null
+++ b/.run/RunTerminal.run.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ false
+
+
+
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..5737ac3
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,29 @@
+plugins {
+ val kotlinVersion = "1.8.10"
+ kotlin("jvm") version kotlinVersion
+ kotlin("plugin.serialization") version kotlinVersion
+
+ id("net.mamoe.mirai-console") version "2.16.0"
+}
+
+group = "com.plugin"
+version = "0.1.0"
+
+dependencies{
+ implementation ("com.squareup.okhttp3:okhttp:5.0.0-alpha.12")
+ implementation ("org.yaml:snakeyaml:2.2")
+ implementation ("cn.hutool:hutool-all:5.8.28")
+ implementation("cn.bigmodel.openapi:oapi-java-sdk:release-V4-2.0.2")
+ implementation ("com.aliyun:ocr_api20210707:3.1.1")
+ implementation ("junit:junit:4.13.2")
+
+}
+
+repositories {
+ maven("https://maven.aliyun.com/repository/public")
+ mavenCentral()
+}
+
+mirai {
+ jvmTarget = JavaVersion.VERSION_17
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..29e08e8
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1 @@
+kotlin.code.style=official
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..249e583
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..5e32371
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.3.1-all.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
\ No newline at end of file
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..8755a19
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,234 @@
+\\#!/bin/sh
+
+\\#
+\\# Copyright © 2015-2021 the original authors.
+\\#
+\\# Licensed under the Apache License, Version 2.0 (the "License");
+\\# you may not use this file except in compliance with the License.
+\\# You may obtain a copy of the License at
+\\#
+\\# https://www.apache.org/licenses/LICENSE-2.0
+\\#
+\\# Unless required by applicable law or agreed to in writing, software
+\\# distributed under the License is distributed on an "AS IS" BASIS,
+\\# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+\\# See the License for the specific language governing permissions and
+\\# limitations under the License.
+\\#
+
+\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#
+\\#
+\\# Gradle start up script for POSIX generated by Gradle.
+\\#
+\\# Important for running:
+\\#
+\\# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+\\# noncompliant, but you have some other compliant shell such as ksh or
+\\# bash, then to run this script, type that shell name before the whole
+\\# command line, like:
+\\#
+\\# ksh Gradle
+\\#
+\\# Busybox and similar reduced shells will NOT work, because this script
+\\# requires all of these POSIX shell features:
+\\# * functions;
+\\# * expansions «\#[[\#[[\$]]#]]\#var», «\#[[\#[[\$]]#]]\#{var}», «\#[[\#[[\$]]#]]\#{var:-default}», «\#[[\#[[\$]]#]]\#{var+SET}»,
+\\# «\#[[\#[[\$]]#]]\#{var\\#prefix}», «\#[[\#[[\$]]#]]\#{var%suffix}», and «\#[[\#[[\$]]#]]\#( cmd )»;
+\\# * compound commands having a testable exit status, especially «case»;
+\\# * various built-in commands including «command», «set», and «ulimit».
+\\#
+\\# Important for patching:
+\\#
+\\# (2) This script targets any POSIX shell, so it avoids extensions provided
+\\# by Bash, Ksh, etc; in particular arrays are avoided.
+\\#
+\\# The "traditional" practice of packing multiple parameters into a
+\\# space-separated string is a well documented source of bugs and security
+\\# problems, so this is (mostly) avoided, by progressively accumulating
+\\# options in "\#[[\#[[\$]]#]]\#@", and eventually passing that to Java.
+\\#
+\\# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+\\# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+\\# see the in-line comments for details.
+\\#
+\\# There are tweaks for specific operating systems such as AIX, CygWin,
+\\# Darwin, MinGW, and NonStop.
+\\#
+\\# (3) This script is generated from the Groovy template
+\\# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+\\# within the Gradle project.
+\\#
+\\# You can find Gradle at https://github.com/gradle/gradle/.
+\\#
+\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#
+
+\\# Attempt to set APP_HOME
+
+\\# Resolve links: \#[[\#[[\$]]#]]\#0 may be a link
+app_path=\#[[\#[[\$]]#]]\#0
+
+\\# Need this for daisy-chained symlinks.
+while
+ APP_HOME=\#[[\#[[\$]]#]]\#{app_path%"\#[[\#[[\$]]#]]\#{app_path\\#\\#*/}"} \\# leaves a trailing /; empty if no leading path
+ [ -h "\#[[\#[[\$]]#]]\#app_path" ]
+do
+ ls=\#[[\#[[\$]]#]]\#( ls -ld "\#[[\#[[\$]]#]]\#app_path" )
+ link=\#[[\#[[\$]]#]]\#{ls\\#*' -> '}
+ case \#[[\#[[\$]]#]]\#link in \\#(
+ /*) app_path=\#[[\#[[\$]]#]]\#link ;; \\#(
+ *) app_path=\#[[\#[[\$]]#]]\#APP_HOME\#[[\#[[\$]]#]]\#link ;;
+ esac
+done
+
+APP_HOME=\#[[\#[[\$]]#]]\#( cd "\#[[\#[[\$]]#]]\#{APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=\#[[\#[[\$]]#]]\#{0\\#\\#*/}
+
+\\# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+\\# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "\#[[\#[[\$]]#]]\#*"
+} >&2
+
+die () {
+ echo
+ echo "\#[[\#[[\$]]#]]\#*"
+ echo
+ exit 1
+} >&2
+
+\\# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "\#[[\#[[\$]]#]]\#( uname )" in \\#(
+ CYGWIN* ) cygwin=true ;; \\#(
+ Darwin* ) darwin=true ;; \\#(
+ MSYS* | MINGW* ) msys=true ;; \\#(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=\#[[\#[[\$]]#]]\#APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+\\# Determine the Java command to use to start the JVM.
+if [ -n "\#[[\#[[\$]]#]]\#JAVA_HOME" ] ; then
+ if [ -x "\#[[\#[[\$]]#]]\#JAVA_HOME/jre/sh/java" ] ; then
+ \\# IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=\#[[\#[[\$]]#]]\#JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=\#[[\#[[\$]]#]]\#JAVA_HOME/bin/java
+ fi
+ if [ ! -x "\#[[\#[[\$]]#]]\#JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: \#[[\#[[\$]]#]]\#JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+\\# Increase the maximum file descriptors if we can.
+if ! "\#[[\#[[\$]]#]]\#cygwin" && ! "\#[[\#[[\$]]#]]\#darwin" && ! "\#[[\#[[\$]]#]]\#nonstop" ; then
+ case \#[[\#[[\$]]#]]\#MAX_FD in \\#(
+ max*)
+ MAX_FD=\#[[\#[[\$]]#]]\#( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case \#[[\#[[\$]]#]]\#MAX_FD in \\#(
+ '' | soft) :;; \\#(
+ *)
+ ulimit -n "\#[[\#[[\$]]#]]\#MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to \#[[\#[[\$]]#]]\#MAX_FD"
+ esac
+fi
+
+\\# Collect all arguments for the java command, stacking in reverse order:
+\\# * args from the command line
+\\# * the main class name
+\\# * -classpath
+\\# * -D...appname settings
+\\# * --module-path (only if needed)
+\\# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+\\# For Cygwin or MSYS, switch paths to Windows format before running java
+if "\#[[\#[[\$]]#]]\#cygwin" || "\#[[\#[[\$]]#]]\#msys" ; then
+ APP_HOME=\#[[\#[[\$]]#]]\#( cygpath --path --mixed "\#[[\#[[\$]]#]]\#APP_HOME" )
+ CLASSPATH=\#[[\#[[\$]]#]]\#( cygpath --path --mixed "\#[[\#[[\$]]#]]\#CLASSPATH" )
+
+ JAVACMD=\#[[\#[[\$]]#]]\#( cygpath --unix "\#[[\#[[\$]]#]]\#JAVACMD" )
+
+ \\# Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case \#[[\#[[\$]]#]]\#arg in \\#(
+ -*) false ;; \\# don't mess with options \\#(
+ /?*) t=\#[[\#[[\$]]#]]\#{arg\\#/} t=/\#[[\#[[\$]]#]]\#{t%%/*} \\# looks like a POSIX filepath
+ [ -e "\#[[\#[[\$]]#]]\#t" ] ;; \\#(
+ *) false ;;
+ esac
+ then
+ arg=\#[[\#[[\$]]#]]\#( cygpath --path --ignore --mixed "\#[[\#[[\$]]#]]\#arg" )
+ fi
+ \\# Roll the args list around exactly as many times as the number of
+ \\# args, so each arg winds up back in the position where it started, but
+ \\# possibly modified.
+ \\#
+ \\# NB: a `for` loop captures its iteration list before it begins, so
+ \\# changing the positional parameters here affects neither the number of
+ \\# iterations, nor the values presented in `arg`.
+ shift \\# remove old arg
+ set -- "\#[[\#[[\$]]#]]\#@" "\#[[\#[[\$]]#]]\#arg" \\# push replacement arg
+ done
+fi
+
+\\# Collect all arguments for the java command;
+\\# * \#[[\#[[\$]]#]]\#DEFAULT_JVM_OPTS, \#[[\#[[\$]]#]]\#JAVA_OPTS, and \#[[\#[[\$]]#]]\#GRADLE_OPTS can contain fragments of
+\\# shell script including quotes and variable substitutions, so put them in
+\\# double quotes to make sure that they get re-expanded; and
+\\# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=\#[[\#[[\$]]#]]\#APP_BASE_NAME" \
+ -classpath "\#[[\#[[\$]]#]]\#CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "\#[[\#[[\$]]#]]\#@"
+
+\\# Use "xargs" to parse quoted args.
+\\#
+\\# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+\\#
+\\# In Bash we could simply go:
+\\#
+\\# readarray ARGS < <( xargs -n1 <<<"\#[[\#[[\$]]#]]\#var" ) &&
+\\# set -- "\#[[\#[[\$]]#]]\#{ARGS[@]}" "\#[[\#[[\$]]#]]\#@"
+\\#
+\\# but POSIX shell has neither arrays nor command substitution, so instead we
+\\# post-process each arg (as a line of input to sed) to backslash-escape any
+\\# character that might be a shell metacharacter, then use eval to reverse
+\\# that process (while maintaining the separation between arguments), and wrap
+\\# the whole thing up as a single "set" statement.
+\\#
+\\# This will of course break if any of these variables contains a newline or
+\\# an unmatched quote.
+\\#
+
+eval "set -- \#[[\#[[\$]]#]]\#(
+ printf '%s\n' "\#[[\#[[\$]]#]]\#DEFAULT_JVM_OPTS \#[[\#[[\$]]#]]\#JAVA_OPTS \#[[\#[[\$]]#]]\#GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"\#[[\#[[\$]]#]]\#@"'
+
+exec "\#[[\#[[\$]]#]]\#JAVACMD" "\#[[\#[[\$]]#]]\#@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..a826253
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem \\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem \\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#\\#
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..a8b1124
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,7 @@
+pluginManagement {
+ repositories {
+ maven("https://maven.aliyun.com/repository/gradle-plugin")
+ gradlePluginPortal()
+ }
+}
+rootProject.name = "ChatAI-InGroup-v2"
\ No newline at end of file
diff --git a/src/test/java/MyTest.java b/src/test/java/MyTest.java
new file mode 100644
index 0000000..b82d4f7
--- /dev/null
+++ b/src/test/java/MyTest.java
@@ -0,0 +1,135 @@
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MyTest {
+ public static void www(String[] args) {
+ String miraiCode = "看下这个题目[mirai:image:https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=CgoyOTk4ODEzODgyEhQW4G7W3v2lT-NKItOqORRIbuK6rxiZzgcg_woo4u2zytCqiANQgL2jAQ&spec=0&rkey=CAMSKMa3OFokB_Tlf6uVSrtr8zFEBtyDtGIdmuztQCnfO9gIDN19LUsLquI]";
+ String url = null;
+ if (miraiCode.matches(".*[mirai:image:(https?://[\\w./?&=]+)].*")) {
+ String regex = "\\[mirai:image:(.*?)]";
+ Pattern pattern = Pattern.compile(regex);
+
+ // 创建Matcher对象
+ Matcher matcher = pattern.matcher(miraiCode);
+
+ // 查找并提取链接
+ if (matcher.find()) {
+ url = matcher.group(1); // 提取第一个括号内的内容
+ }
+ }
+ System.out.println(url);
+ }
+
+ @Test
+ public void sseTest() throws IOException {
+
+ @Data
+ class Content {
+ private String type;
+ private String text;
+
+ public Content() {
+ }
+
+ public Content(String type, String text) {
+ this.type = type;
+ this.text = text;
+ }
+ }
+
+ @Data
+ class Message {
+ private String role;
+ private Content[] content;
+ }
+
+ CloseableHttpClient client = HttpClients.createDefault();
+ HttpPost httpPost = new HttpPost("https://open.bigmodel.cn/api/paas/v4/assistant");
+ httpPost.setHeaders(new Header[]{
+ new BasicHeader("content-type", "application/json"),
+ new BasicHeader("authorization", "abce8567e434a0e4b987c34763c23c73.NCwRwbrkW9Mi6t63")
+ });
+
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("assistant_id", "65a265419d72d299a9230616");
+ jsonObject.put("model", "glm-4-assistant");
+ jsonObject.put("stream", "True");
+ Message message = new Message();
+ message.role = "user";
+ Content[] contents = new Content[]{new Content("text", "改写提示词:现在你是一名Java开发工程师...")};
+ message.content = contents;
+ Message[] messages = new Message[]{message};
+ jsonObject.put("messages", messages);
+ HttpEntity httpEntity = new StringEntity(jsonObject.toString(), "UTF-8");
+
+ httpPost.setEntity(httpEntity);
+
+ CloseableHttpResponse response = client.execute(httpPost);
+ System.out.println(response.getStatusLine());
+
+ HttpEntity entity = response.getEntity();
+ String result = EntityUtils.toString(entity, "UTF-8");
+ String[] strs = result.split("\n\n");
+ for (String str : strs) {
+ pojo.Data data = JSONObject.parseObject(str.substring(6), pojo.Data.class);
+ if (data.getStatus().equals("completed")) {
+ break;
+ }
+ //解析返回结果
+// System.out.println(data.getChoices().get(0).getDelta());
+ String delta = data.getChoices().get(0).getDelta();
+ JSONObject deltaJsonObject = JSONObject.parseObject(delta);
+
+ String role = deltaJsonObject.get("role").toString();
+ if ("assistant".equals(role)) {
+ //输出content
+ System.out.print(deltaJsonObject.get("content"));
+ } else if ("tool".equals(role)) {
+ //解析tool_call内容,根据字段type
+ JSONObject toolCall = deltaJsonObject.getJSONArray("tool_calls").getJSONObject(0);
+ String type = toolCall.get("type").toString();
+ if ("function".equals(type)) {
+ //如果调用了函数
+ JSONObject functionJsonObject = toolCall.getJSONObject("function");
+ if (functionJsonObject.get("outputs") != null) {
+ String contentUrl = functionJsonObject.getJSONArray("outputs").getJSONObject(0).getJSONObject("content").get("url").toString();
+ System.out.println("\r\n" + contentUrl);
+ }
+ } else if ("drawing_tool".equals(type)) {
+ //如果是绘画工具
+ JSONObject drawingToolJsonObject = toolCall.getJSONObject("drawing_tool");
+ if (drawingToolJsonObject.get("outputs") != null) {
+ String imageUrl = drawingToolJsonObject.getJSONArray("outputs").getJSONObject(0).get("image").toString();
+ System.out.println(imageUrl);
+ }
+ } else if ("web_browser".equals(type)) {
+ JSONObject webBrowserJsonObject = toolCall.getJSONObject("web_browser");
+ if (webBrowserJsonObject.get("outputs") != null) {
+ for (Object o : webBrowserJsonObject.getJSONArray("outputs")) {
+ System.out.println(JSONObject.parseObject(o.toString()).get("title"));
+ System.out.println(JSONObject.parseObject(o.toString()).get("link"));
+ System.out.println(JSONObject.parseObject(o.toString()).get("content"));
+ }
+ }
+ }
+ }
+
+ }
+ response.close();
+ client.close();
+ }
+}
diff --git a/src/test/java/pojo/Choices.java b/src/test/java/pojo/Choices.java
new file mode 100644
index 0000000..c4da6a7
--- /dev/null
+++ b/src/test/java/pojo/Choices.java
@@ -0,0 +1,28 @@
+package pojo;
+
+public class Choices {
+ /**
+ * index
+ */
+ private int index;
+ /**
+ * delta
+ */
+ private String delta;
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+ public String getDelta() {
+ return delta;
+ }
+
+ public void setDelta(String delta) {
+ this.delta = delta;
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/pojo/Data.java b/src/test/java/pojo/Data.java
new file mode 100644
index 0000000..5872113
--- /dev/null
+++ b/src/test/java/pojo/Data.java
@@ -0,0 +1,93 @@
+package pojo;
+
+import java.util.List;
+
+public class Data {
+
+ /**
+ * id
+ */
+ private String id;
+ /**
+ * created
+ */
+ private long created;
+ /**
+ * model
+ */
+ private String model;
+ /**
+ * choices
+ */
+ private List choices;
+ /**
+ * status
+ */
+ private String status;
+ /**
+ * assistant_id
+ */
+ private String assistant_id;
+ /**
+ * conversation_id
+ */
+ private String conversation_id;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public long getCreated() {
+ return created;
+ }
+
+ public void setCreated(long created) {
+ this.created = created;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public List getChoices() {
+ return choices;
+ }
+
+ public void setChoices(List choices) {
+ this.choices = choices;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getAssistant_id() {
+ return assistant_id;
+ }
+
+ public void setAssistant_id(String assistant_id) {
+ this.assistant_id = assistant_id;
+ }
+
+ public String getConversation_id() {
+ return conversation_id;
+ }
+
+ public void setConversation_id(String conversation_id) {
+ this.conversation_id = conversation_id;
+ }
+
+
+}