Appearance
错误处理
概述
Bngeuit 在调用 QQ Bot API 失败时会抛出 BotApiException,携带 HTTP 状态码、业务错误码和追踪 ID,便于排查问题。
异常捕获
java
import cn.org.bukkit.bngeuit.Bngeuit;
import cn.org.bukkit.bngeuit.exception.BotApiException;
try {
Bngeuit.sendGroupText(groupOpenid, "Hello");
} catch (BotApiException e) {
System.err.println("API 调用失败: " + e.getMessage());
System.err.println("HTTP 状态码: " + e.getStatusCode());
System.err.println("业务错误码: " + e.getErrCode());
System.err.println("追踪ID: " + e.getTraceId());
}BotApiException
| 方法 | 返回类型 | 说明 |
|---|---|---|
getMessage() | String | 错误描述(含错误码中文释义) |
getStatusCode() | int | HTTP 状态码(-1 表示非 HTTP 来源) |
getErrCode() | Integer | 业务错误码(来自响应 JSON 的 err_code) |
getTraceId() | String | 追踪 ID(来自响应 JSON 的 trace_id,联系腾讯排查时提供) |
常见错误码
消息发送
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 40034100 | 主动消息发送超过频控限制 | 降低发送频率 |
| 40034105 | 主动消息发送失败,无权限 | 检查机器人权限 |
| 40034128 | 被动回复时间或次数超限 | 在 5 秒内回复,且只能回复一次 |
| 40034005 | 回复消息 msg_id 已过期 | 使用最新的消息 ID |
| 40034006 | 消息内容违规 | 检查消息内容 |
| 40054005 | 消息被去重 | 使用不同的 msgSeq |
| 40054007 | 消息长度超限 | 缩短消息内容 |
机器人状态
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 40054002 | 机器人被禁言 | 等待禁言解除 |
| 40054003 | 机器人不是群成员 | 将机器人拉入群 |
| 40054016 | 机器人已下线 | 检查机器人状态 |
| 40054004 | 无好友关系 | 先添加好友 |
富媒体上传
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 850019 | 不支持的文件格式 | 检查文件类型 |
| 850031 | 上传文件超过大小限制 | 压缩文件或分片上传 |
| 40093002 | 超过今天发送文件容量上限 | 等待次日重试 |
| 40034004 | 富媒体信息转存失败 | 重新上传 |
权限相关
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 11253 | 应用无接口访问权限 | 检查应用权限配置(群成员、黑名单等内邀接口未开通时即报此码) |
| 40062003 | 无操作权限 | 确认机器人角色 |
模板 Markdown 权限码
旧文档中的 304036(无 Markdown 模板权限)对应模板 Markdown 能力,该能力已随官方废弃从框架移除(MessageMarkdown 只保留 content 与 forceVerifyImageResource),不再需要申请。
图片素材
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 40035001 | 图片格式不支持 | 扩展名与 Content-Type 需为 png/jpeg/gif/webp 且一致 |
| 40035002 | 图片超过大小上限 | 单张不超过 10MB |
| 40035003 | 上传任务不存在或已过期 | 上传任务 4 小时有效;complete 的 md5 必须是直传返回的 ETag |
| 40035006 | 素材服务内部错误 | 稍后重试 |
| 40035007 | 图片数量超过上限 | 单机器人上限 100 张,删除部分素材后重试 |
| 40035008 | 图片不存在或已被删除 | 检查 image_id |
| 40035009 | 图片已过期或被删除 | 引用链接失效,重新上传 |
| 40035010 | 引用链接无效或不属于当前机器人 | 确认链接来源与 AppID |
服务端错误
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 50001 | 服务内部错误 | 稍后重试 |
| 50002 | 频率限制 | 降低请求频率 |
| 50055001 | 消息发送异常 | 稍后重试 |
最佳实践
关键操作必须捕获异常
java
@SubscribeEvent
public void onGroupAt(GroupAtMessageEvent e) {
try {
Bngeuit.replyGroupText(e.getGroupOpenid(), e.getId(), 1, "回复内容");
} catch (BotApiException ex) {
// 记录日志但不中断事件处理
getLogger().warn("回复消息失败: {} (traceId={})", ex.getMessage(), ex.getTraceId());
}
}利用 TraceId 排查问题
java
try {
Bngeuit.sendGroupText(groupOpenid, message);
} catch (BotApiException e) {
if (e.getTraceId() != null) {
// 记录 traceId 用于联系腾讯排查
getLogger().error("API 失败,traceId: {}", e.getTraceId());
}
}频控场景的重试
java
public void sendWithRetry(String groupOpenid, String content, int maxRetries) {
for (int i = 0; i < maxRetries; i++) {
try {
Bngeuit.sendGroupText(groupOpenid, content);
return; // 成功
} catch (BotApiException e) {
if (e.getErrCode() != null && e.getErrCode() == 50002) {
// 频率限制,等待后重试
try { Thread.sleep(1000 * (i + 1)); } catch (InterruptedException ignored) {}
} else {
throw e; // 其他错误直接抛出
}
}
}
}