没有添加 JitPack 的 Repo 的话首先添加 Repo,在 pom 里面把这些粘贴进去:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
然后添加这个库:
<dependency>
<groupId>com.github.hydevelop</groupId>
<artifactId>PicqBotX</artifactId>
<version>2.4.5.566</version>
</dependency>
然后ReImport之后就导入好了!
没有添加 JitPack 的 Repo 的话首先添加 Repo, 在 pom 里面把这些粘贴进去:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
然后添加这个库:
dependencies {
implementation 'com.github.hydevelop:PicqBotX:2.4.5.566'
}
1. 下载 酷Q... (如果有 酷Q Pro 的话效果更好哦!)
下载完后解压到你想安装的目录下
首次启动请运行 cqa.exe
或 cqp.exe
, 并登陆机器人的 QQ 号
然后退出 酷Q (右键悬浮窗点退出)
2. 添加 酷Q HTTP 插件:
把 .cpk
文件下载下来, 放进 酷Q安装目录\app
文件夹里
启动 酷Q
右键悬浮窗, 然后点击 应用 -> 应用管理
列表里现在应该有 [未启用] HTTP API
, 点击它, 点击启用
启用的时候会提示需要一些敏感权限, 选择继续
启用之后在 酷Q安装目录\app
文件夹里会出现 io.github.richardchien.coolqhttpapi
文件夹
退出 酷Q
在 io.github.richardchien.coolqhttpapi
文件夹里创建一个文件名为 config.cfg
的配置文件
并在其中写入以下代码
[general]
host=0.0.0.0
port=接收端口
post_url=http://127.0.0.1:发送端口
enable_backward_compatibility=false
把发送端口和接收端口改成你的机器人程序里用的端口 (测试机器人的接收为31091
, 发送31092
)
注意: 酷Q 配置里的发送端口
要和传进 Picq 的接收端口
一样, 然后 Picq 的发送端口
也要和 酷Q 的接收端口
一样!
( 这是因为 酷Q 需要发送到 Picq 的接收端口去, 而不是发送到对方的发送端口ww )
如果 酷Q 要和你的机器人程序分开运行的话, 请把127.0.0.1
改成你的机器人部署的服务器的地址
保存配置文件
在 main 方法中, 先创建一个机器人对象:
注意: 因为所有事件和指令执行的时候都能获取到机器人对象,
所以不建议把机器人对象设置为 static 或者全局变量.
// 创建机器人对象 ( 信息发送 URL, 发送端口, 接收端口, 是否 DEBUG )
PicqBotX bot = new PicqBotX("127.0.0.1", 31091, 31092, false);
注意: 酷Q 配置里的发送端口
要和传进 Picq 的接收端口
一样, 然后 Picq 的发送端口
也要和 酷Q 的接收端口
一样!
注意: 酷Q 配置里的发送端口
要和传进 Picq 的接收端口
一样, 然后 Picq 的发送端口
也要和 酷Q 的接收端口
一样!
注意: 酷Q 配置里的发送端口
要和传进 Picq 的接收端口
一样, 然后 Picq 的发送端口
也要和 酷Q 的接收端口
一样!
( 这是因为 酷Q 需要发送到 Picq 的接收端口去, 而不是发送到对方的发送端口ww )
重要的事情要加粗说三遍了w
已经有4个人问我为什么端口不对了噗...
例子: 如果你的 酷Q 的 port
写的是 12345
, 然后 post_url
写的是 http://127.0.0.1:54321
,
那么你的传入 PicqBotX 的 postPort
就应该是 12345
, 然后 socketPort
就应该是 54321
.
注册监听器:
可以注册多个监听器
监听器的构造器可以有参数
bot.getEventManager().registerListener(new 监听器());
启用指令管理器:
如果不想用自带的指令管理器, 想自己写指令管理器, 不写这行就好了.
不过这个指令管理器真的很方便哦! 注册都完全是自动的_(:з」∠)_
因为完全自动注册, 所以只要这一行就行了!
// 启用指令管理器, 启用的时候会自动注册指令
// 这些字符串是指令前缀, 比如 !help 的前缀就是"!"
bot.enableCommandManager("bot -", "!", "/", "~");
启动机器人:
// 启动机器人, 这个因为会占用线程, 所以必须放到最后
bot.startBot();
嗯, 然后就没了!
就这么简单方便!!
完整例子代码:
public class TestBot
{
public static void main(String[] args)
{
// 创建机器人对象 ( 信息发送URL, 发送端口, 接收端口, 是否DEBUG )
PicqBotX bot = new PicqBotX("127.0.0.1", 31091, 31092, false);
try
{
bot.getEventManager()
.registerListener(new TestListener()) // 注册监听器
.registerListener(new RequestListener()); // 可以注册多个监听器
if (!bot.isDebug()) bot.getEventManager().registerListener(new SimpleTextLoggingListener()); // 条件下注册监听器
// 启用指令管理器, 启用的时候会自动注册指令
// 这些字符串是指令前缀, 比如!help的前缀就是!
bot.enableCommandManager("bot -", "!", "/", "~");
// 启动机器人, 这个因为会占用线程, 所以必须放到最后
bot.startBot();
}
catch (HttpServerStartFailedException | VersionIncorrectException | IllegalAccessException | InstantiationException e)
{
e.printStackTrace(); // 启动失败, 结束程序
}
}
}
其他例子去看TestBot!
public class 类名随意 extends IcqListener // 必须继承 IcqListener 监听器类
{
@EventHandler // 这个注解必须加, 用于反射时判断哪些方法是事件方法的, 不用 @Override
public void 方法名随意(事件类名 event) // 想监听什么事件就写在事件类名这里, 一个方法只能有一个事件参数
{
// 处理
}
@EventHandler
public void 方法名随意(事件类名 event) // 同一个类下可以无限添加监听器方法
...
}
嗯... 创建一个类, 写成上面那个样子就行了_(:з」∠)_
可用事件:
事件类名 | 事件介绍 |
---|---|
Event | 所有事件(不推荐监听) |
EventMessage | 所有消息事件 |
EventDiscussMessage | 讨论组消息事件 |
EventGroupMessage | 群聊消息事件 |
EventPrivateMessage | 私聊消息事件 |
EventNotice | 所有提醒事件 |
EventNoticeFriendAdd | 加好友提醒 |
EventNoticeGroupAdminChange | 所有群管理员数量更改事件 |
EventNoticeGroupAdminSet | 群员被设为管理员事件 |
EventNoticeGroupAdminRemove | 群员被取消管理员事件 |
EventNoticeGroupMemberChange | 所有群员数量更改事件 |
EventNoticeGroupMemberDecrease | 所有群员数量减少事件 |
EventNoticeGroupMemberKick | 群员被踢事件 |
EventNoticeGroupMemberKickBot | 自己被踢事件 |
EventNoticeGroupMemberLeave | 群员主动退出事件 |
EventNoticeGroupMemberIncrease | 所有群员数量增加事件 |
EventNoticeGroupMemberApprove | 群员被同意进群事件 |
EventNoticeGroupMemberInvite | 群员被邀请进群事件 |
EventNoticeGroupUpload | 上传群文件事件 |
EventRequest | 所有请求事件 |
EventFriendRequest | 加好友请求事件 |
EventGroupAddRequest | 加群请求事件 |
EventGroupInviteRequest | 拉你入群请求事件 |
EventLocal | 所有本地事件 |
EventLocalSendMessage | 所有本地向外发送的事件 |
EventLocalSendDiscussMessage | 发送讨论组消息事件 |
EventLocalSendGroupMessage | 发送群聊消息事件 |
EventLocalSendPrivateMessage | 发送私聊消息事件 |
EventLocalHttpRecieveEvent | 接收HTTP请求事件 |
EventLocalHttpFailEvent | 接收HTTP请求失败事件 |
public class TestListener extends IcqListener
{
@EventHandler
public void onPMEvent(EventPrivateMessage event)
{
System.out.println("接到消息");
// 判断消息是不是这段文字, 如果是就回复那段文字, 很简单的测试_(:з」∠)_
if (event.getMessage().equals("你以为这是 yangjinhe/maintain-robot?"))
event.respond("其实是我 HyDevelop/PicqBotX 哒!");
}
}
public class TestFilter extends IcqListener
{
@EventHandler
public void onAllLocalMessageEvent(EventLocalSendMessage event) // 监听所有发送消息的事件
{
// 获取消息
String message = event.getMessage();
// 这里可以做任何处理
// 我把所有"%prefix%"变量替换成了"!"
message = message.replace("%prefix%", "!");
// 设置消息, 因为这个事件是在发送之前执行的, 所以这样设置的消息能生效
// 设置为 null 就能拦截了
event.setMessage(message);
}
}
需要一个 bot 对象, 请不要使用全局变量存 bot 对象
其实监听器里的话直接用 event.getBot()
就行了, 不是监听器的话也很少会直接用到 bot 对象...
返回数据为 ReturnData<Pojo 数据类>
形式, 获取数据的话用 response.getData()
就行了.
ReturnData<RMessageReturnData> response = event.getHttpApi().封装方法名(参数); // response就是响应数据
ReturnData<RMessageReturnData> response = event.getHttpApi().sendPrivateMsg(871674895, "hi"); // 给871674895发送hi
ReturnData<RMessageReturnData> response = event.getHttpApi().send(请求目标, 参数); // 请求目标在IcqHttpApi里面有常量
ReturnData<RMessageReturnData> response = event.getHttpApi().send(IcqHttpApi.SEND_PRIVATE_MSG,
"user_id", 871674895,
"message", "hi",
"auto_escape", false); // 这个参数因为不常用就没有封装, 所以要用的话这样发送
注意: .add(object) 方法对于所有类型的对象都有效, 只要能 toString 就行
new MessageBuilder()
.add("添加一条字符串消息")
.add(123)
.add(16.5f)
.newLine() // 换行
.add(new ComponentImage("此处填图片文件路径或者 URL")) // 图片组件
.add(new ComponentImageBase64("此处填图片 Base64 码")) // Base64 图片组件
.add(new ComponentRecord("此处填语音文件路径或者 URL")) // 语音组件
.toString();
可用组件 (需要 酷Q Pro 才能用, 详细介绍请看CQ码):
组件类名 | 组件介绍 |
---|---|
ComponentAt | @组件 |
ComponentBFace | 原创表情组件 |
ComponentEmoji | Emoji 表情组件 |
ComponentFace | QQ 表情组件 |
ComponentImage | 图片组件 |
ComponentImageBase64 | Base64 编码图片组件 |
ComponentSFace | 小表情组件 |
ComponentShare | 分享链接组件 |
ComponentDice | 掷骰子组件 (只能单独发送) |
ComponentMusic | 音乐组件 (只能单独发送) |
ComponentRecord | 语音组件 (只能单独发送) |
ComponentRockPaperSissors | 猜拳组件 (只能单独发送) |
ComponentShake | 抖一抖组件 (只能单独发送) |
每一个指令需要单独创建一个类, 实现一个指令接口
如果这个指令在所有消息环境内都能执行的话, 实现 EverywhereCommand
类
如果这个指令只需要在 群 或者 讨论组 或者 私聊 执行的话,
实现 GroupCommand
或者 DiscussCommand
或者 PrivateCommand
就可以了
因为启动的时候自动注册指令, 不需要做任何其他事情, 只创建类就能用了!
例子:
public class CommandVersion implements EverywhereCommand // 实现EverywhereCommand就是无论私聊群聊还是讨论组都能收到的指令
{
// 指令属性
@Override
public CommandProperties properties()
{
// 这个括号里填指令名和其他名称, 指令名必须至少有一个
// 这个的话, 用"!v", "!version", 和"!版本"都能触发指令 (感叹号为你设置的前缀, 不一定必须要感叹号)
return new CommandProperties("version", "v", "版本");
}
// 机器人接到指令后会执行这个方法 ( 实现不同的接口的话方法名不一定一样 )
@Override
public String run(EventMessage event, User sender, String command, ArrayList<String> args)
{
// 处理, 返回值会自动回复回去
// 这里因为这个指令是用来查版本的, 所以直接返回字符串了
return "TestBot - PicqBotX v2.4.5.566";
}
}
因为用户信息在账号管理器里缓存了啦...
不会自动刷新的...
监听加群的事件然后
event.getBot().getAccountManager().refreshCache();
就行啦w