这是一个Java工具集合,包含多个独立的模块,主要用于飞书机器人API调用、阿里云OSS操作和OpenAI API调用等功能。
lark_sdk_bot
: 基于飞书开放平台SDK的机器人实现lark_bot
: 基于HTTP请求的飞书机器人实现lark_custom_bot
: 飞书自定义机器人实现aliyun_oss
: 阿里云OSS客户端工具openai
: OpenAI API调用工具cross_comm
: 跨语言、多设备通信库(Java客户端)android_example
: Android示例工程
- JDK 8+
- Maven 3.6+
# 在根目录执行,构建所有模块
mvn clean install
# 构建单个模块(在对应模块目录下执行)
cd [module_name]
mvn clean package
# 方式1:使用maven exec插件运行(在对应模块目录下执行)
cd [module_name]
mvn exec:java
# 方式2:直接运行jar包
cd [module_name]
java -jar target/[module_name]-[version].jar
# 示例:运行aliyun_oss模块
cd aliyun_oss
mvn exec:java
# 或
java -jar target/aliyun_oss-1.1.1.jar
需要在 Main.java
中配置:
- APP_ID
- APP_SECRET
需要在 Main.java
中配置:
- APP_ID
- APP_SECRET
需要在 Main.java
中配置:
- WEBHOOK_URL
需要在 Main.java
中配置:
- ACCESS_KEY_ID
- ACCESS_KEY_SECRET
- ENDPOINT
- BUCKET_NAME
需要在 Main.java
中配置:
- API_KEY
需要在 Main.java
中配置:
- SERVER_IP(默认:localhost)
- SERVER_PORT(默认:9898)
- OSS配置(用于文件传输功能):
- OSS_ENDPOINT
- OSS_BUCKET_NAME
- OSS_ACCESS_KEY_ID
- OSS_ACCESS_KEY_SECRET
在 ~/.m2/settings.xml
中添加:
<settings>
<servers>
<server>
<id>github</id>
<username>你的GitHub用户名</username>
<password>你的GitHub Personal Access Token</password>
</server>
</servers>
</settings>
部署新版本前,需要更新以下文件中的版本号:
- 根目录
pom.xml
- 各模块目录下的
pom.xml
确保在各模块的 pom.xml
中将依赖的 scope 设置为 provided:
<dependency>
<groupId>com.wayne</groupId>
<artifactId>模块名</artifactId>
<version>${version}</version>
<scope>provided</scope>
</dependency>
mvn clean deploy
在项目根目录的 build.gradle
中添加:
allprojects {
repositories {
maven {
name = "GitHub Packages"
url = uri("https://maven.pkg.github.com/wangyendt/java_tools")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
}
在app模块的 build.gradle
中添加:
dependencies {
implementation 'com.wayne:lark-sdk-bot:最新版本号'
implementation 'com.wayne:lark-bot:最新版本号'
implementation 'com.wayne:lark-custom-bot:最新版本号'
implementation 'com.wayne:aliyun-oss:最新版本号'
implementation 'com.wayne:openai:最新版本号'
}
// 使用SDK机器人
LarkBot bot = new LarkBot(APP_ID, APP_SECRET);
bot.sendTextToUser(openId, "测试消息");
// 使用自定义机器人
LarkCustomBot customBot = new LarkCustomBot(WEBHOOK_URL);
customBot.sendText("测试消息");
AliyunOSS oss = new AliyunOSS(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ENDPOINT, BUCKET_NAME);
oss.uploadFile("本地文件路径", "OSS文件路径");
OpenAI openai = new OpenAI(API_KEY);
String response = openai.chatCompletion("你的提问");
- 确保Android项目的
minSdkVersion
不低于21 - 添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 如果使用文件上传功能,需要添加存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
CrossComm是一个基于WebSocket的跨语言、多设备通信库的Java客户端实现。它提供了简洁的API,让Java应用能够与其他语言(如Python)编写的客户端进行实时通信。
- 🚀 简洁易用: 类似Python装饰器的注解方式处理消息
- 🔗 WebSocket通信: 基于WebSocket协议,支持实时双向通信
- 📝 多种消息类型: 支持文本、JSON、字典、字节数据、文件、图片、文件夹
- 📁 文件传输: 基于阿里云OSS,支持文件、图片、文件夹的上传下载
- 📥 自动下载: 支持指定下载目录,自动下载接收的文件
- 🎯 消息过滤: 支持按消息类型和发送方过滤消息
- ❤️ 自动心跳: 内置心跳机制,保持连接稳定
- 📋 客户端管理: 支持获取在线客户端列表
- 🎭 双模式运行: 支持监听模式(只接收)和发送模式(可发送+接收)
- 🌐 跨平台兼容: 与Python/Swift版本完全兼容,支持互相通信
进入 cross_comm
目录,使用Maven命令运行:
cd cross_comm
# 运行监听模式(只接收消息)
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="listener"
# 运行发送模式(可发送消息)
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="sender"
- 用途: 专门用于接收和处理消息
- 特点: 启动后自动连接服务器,持续监听所有类型的消息
- 适用场景: 后台服务监控、消息日志记录、被动接收通知
- 操作: 按
Ctrl+C
退出
- 用途: 既可以发送消息,也可以接收消息
- 特点: 启动后会发送测试消息,然后进入交互式命令行
- 适用场景: 主动发送消息、调试和测试、交互式通信
- 交互命令:
- 直接输入文本:发送文本消息
json:{"key":"value"}
:发送JSON消息bytes:content
:发送字节数据file:文件路径
:发送文件image:图片路径
:发送图片folder:文件夹路径
:发送文件夹list
:获取在线客户端列表quit
:退出程序
TEXT
- 文本消息JSON
- JSON格式消息DICT
- 字典/映射消息BYTES
- 字节数据消息FILE
- 文件消息(通过OSS传输)IMAGE
- 图片消息(通过OSS传输)FOLDER
- 文件夹消息(通过OSS传输)
import com.wayne.cross_comm.CrossCommService;
import com.wayne.cross_comm.CommMsgType;
import com.wayne.cross_comm.MessageListener;
import com.wayne.cross_comm.Message;
// 连接到默认服务器
CrossCommService client = new CrossCommService("localhost", 9898);
// 或指定客户端ID和心跳间隔
CrossCommService client = new CrossCommService("localhost", 9898, "my_java_client", 30);
public class MyMessageHandler {
private static final Logger logger = LoggerFactory.getLogger(MyMessageHandler.class);
// 处理文本消息
@MessageListener(msgType = {CommMsgType.TEXT})
public void handleTextMessage(Message message) {
logger.info("收到文本消息: {}", message.getContent());
logger.info("来自: {}", message.getFromClientId());
}
// 处理JSON消息
@MessageListener(msgType = {CommMsgType.JSON})
public void handleJsonMessage(Message message) {
logger.info("收到JSON消息: {}", message.getContent());
}
// 处理文件消息(自动下载到指定目录)
@MessageListener(msgType = {CommMsgType.FILE}, downloadDirectory = "./downloads/files")
public void handleFileMessage(Message message) {
logger.info("收到文件: {}", message.getContent()); // 本地文件路径
logger.info("OSS Key: {}", message.getOssKey()); // 原始OSS路径
}
// 处理特定客户端的消息
@MessageListener(fromClientId = "python_client")
public void handlePythonClientMessage(Message message) {
logger.info("收到来自Python客户端的消息: {}", message.getContent());
}
// 处理所有类型的消息
@MessageListener
public void handleAllMessages(Message message) {
logger.debug("收到消息: {} ({})", message.getContent(), message.getMsgType().getValue());
}
}
// 创建消息处理器并注册
MyMessageHandler handler = new MyMessageHandler();
client.registerMessageHandlers(handler);
// 连接到服务器
boolean connected = client.connect();
if (!connected) {
logger.error("连接失败");
return;
}
// 发送不同类型的消息
client.sendMessage("Hello World!", CommMsgType.TEXT);
client.sendMessage("{\"type\": \"notification\"}", CommMsgType.JSON);
client.sendMessage("private message", CommMsgType.TEXT, "target_client_id");
// 发送字节数据
byte[] data = "binary data".getBytes();
client.sendMessage(data, CommMsgType.BYTES);
// 发送字典数据
Map<String, Object> dict = new HashMap<>();
dict.put("action", "update");
dict.put("id", 123);
client.sendMessage(dict, CommMsgType.DICT);
// 发送文件(需要配置OSS)
client.sendFile("./test_files/document.pdf");
client.sendFile("./test_files/report.txt", "specific_client_id");
// 发送图片
client.sendImage("./images/photo.jpg");
// 发送文件夹
client.sendDirectory("./backup_files");
// 获取客户端列表
Map<String, Object> clients = client.listOnlineClients(5); // 5秒超时
if (clients != null) {
System.out.println("在线客户端数量: " + clients.get("total_count"));
}
// 断开连接
client.disconnect();
用于标注消息处理方法的注解,支持以下参数:
msgType
: 指定监听的消息类型数组,默认监听所有类型fromClientId
: 指定监听特定发送方的消息,默认监听所有发送方downloadDirectory
: 文件下载目录(仅对FILE、IMAGE、FOLDER类型有效),为空则不自动下载
// 只处理文本和JSON消息
@MessageListener(msgType = {CommMsgType.TEXT, CommMsgType.JSON})
public void handleTextAndJson(Message message) { ... }
// 只处理来自特定客户端的消息
@MessageListener(fromClientId = "python_client")
public void handlePythonMessages(Message message) { ... }
// 处理文件消息并自动下载
@MessageListener(msgType = {CommMsgType.FILE}, downloadDirectory = "./downloads")
public void handleFileWithDownload(Message message) { ... }
方法 | 描述 |
---|---|
connect() |
连接到服务器 |
disconnect() |
断开连接 |
sendMessage(content, msgType) |
发送消息给所有客户端 |
sendMessage(content, msgType, toClientId) |
发送消息给指定客户端 |
sendFile(filePath) |
发送文件给所有客户端 |
sendImage(imagePath) |
发送图片给所有客户端 |
sendDirectory(dirPath) |
发送文件夹给所有客户端 |
listClients(onlyOnline, timeout) |
获取客户端列表 |
listOnlineClients(timeout) |
获取在线客户端列表 |
registerMessageHandlers(handler) |
注册消息处理器 |
# 终端1:启动监听客户端
cd cross_comm
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="listener"
# 终端2:启动发送客户端
cd cross_comm
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="sender"
# 在发送客户端中输入消息,监听客户端会收到
# 启动发送客户端
cd cross_comm
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="sender"
# 输入 "list" 查看当前在线的所有客户端
# 启动监听客户端
cd cross_comm
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="listener"
# 启动发送客户端
cd cross_comm
mvn exec:java -Dexec.mainClass="com.wayne.cross_comm.Main" -Dexec.args="sender"
# 输入文件传输命令:
# file:test_files/test.txt (发送文件)
# image:images/photo.jpg (发送图片)
# folder:backup (发送文件夹)
- 消息处理方法签名: 使用
@MessageListener
注解的方法必须接受一个Message
类型的参数 - 连接管理: 确保在应用关闭时调用
disconnect()
方法 - 线程安全: 消息处理器的方法会在单独的线程中调用,请注意线程安全
- 错误处理: 消息处理器中的异常会被捕获并记录,不会影响其他处理器
- 心跳机制: 客户端会自动发送心跳,无需手动管理
- 服务器连接: 确保服务器地址正确且服务器正在运行
Apache License 2.0