上传群文件回执问题
-
请教一下,有什么办法可以获得机器人上传群文件的消息回执,即获得MessageSource等信息
-
你这是想干什么
-
@cssxsh 记录id,便于后面有用户引用回复这个上传文件消息的时候做处理
-
经过不断尝试,发现以下办法可以实现这个需求。
新api无法实现需求public void uploadImage(String dir, String fileName, File image, Group group) { RemoteFile root = group.getFilesRoot(); //idea标注已弃用 RemoteFile remoteDir = root.resolve(dir); if (!remoteDir.exists()) { remoteDir.mkdir(); } RemoteFile remoteFile = remoteDir.resolve(fileName); MessageReceipt<Contact> receipt = remoteFile.uploadAndSend(image); }
目前只能找到废弃的api的办法,也是能实现需求。
但是需要注意的是:- 通过上述代码创建dir,再上传图片没有问题,但是已经存在的dir,通过resolve方法获得到的dir对应的remoteFile上传文件会报错
- 如果要上传到已经存在的文件夹,需要用root对应的remotefile获取到其listFilesa api 通过遍历的方式获取到你想要的remoteFile dir,再进行上传则不会报错。即通过resolve获得到的dir file无法进行文件的上传。
希望作者能尽快完善群文件新api对获取群文件上传消息回执的支持。感谢!
-
群文件上传成功会触发GroupMessageEvent,你只需要判断该event中是否包含FileMessage即可。
个人建议,在你处理GroupMessageEvent代码中打个断点,然后上传一个群文件看看GroupMessageEvent中有哪些信息是你需要的。
顺带说一下,群文件删除是会触发MessageRecallEvent.GroupRecall事件,但从中无法获取被删除文件的信息,可能需要其他方法或途径实现,还是等待大佬答疑解惑吧。 -
Bot bot = BotFactory.INSTANCE.newBot(new Long(account), password, new BotConfiguration() {{ setProtocol(MiraiProtocol.ANDROID_PAD); String proto = getProtocol().name(); setWorkingDir(new File(workDir)); File dir = new File(workDir); if (!dir.exists()) { dir.mkdirs(); } this.disableContactCache(); setCacheDir(new File("cache")); fileBasedDeviceInfo(account + "-" + proto + "-" + "device.json"); }}); GlobalEventChannel.INSTANCE.subscribeAlways(Event.class, event -> { System.out.println(event.getClass().getSimpleName()); }); bot.login(); Group group = GroupUtil.getDataGroup(); AbsoluteFolder root = group.getFiles().getRoot(); File file = new File("/Users/jiashu/Downloads/1.jpg"); root.uploadNewFile("/1.jpg", ExternalResource.create(file).toAutoCloseable()); //程序运行结果 BotOnlineEvent 2022-12-13 23:46:45 I/Bot 2567327040: Bot login successful. 2022-12-13 23:46:45 V/Net 2567327040: Send: OidbSvc.0x6d6_0(OidbSvc.0x6d6_0) GetMsgSuccess 2022-12-13 23:46:45 I/Net 2567327040: Syncing friend message history: Success. 2022-12-13 23:46:45 V/Net 2567327040: Send: OidbSvc.0x6d9_4(OidbSvc.0x6d9_4) 2022-12-13 23:46:45 V/Net 2567327040: Recv: OidbSvc.0x6d6_0 SendGroupMessageReceipt 2022-12-13 23:46:46 V/Bot 2567327040: Group(701096958) <- [mirai:file:1.jpg, id=/304fe63e-b561-4b14-81d1-583969cbc8ca, internalId=102, size=229529] 2022-12-13 23:46:46 V/Net 2567327040: Recv: OidbSvc.0x6d9_4 2022-12-13 23:46:46.137 INFO 35457 --- [ main] c.zjs.facesignin.FacesigninApplication : Started FacesigninApplication in 3.501 seconds (JVM running for 3.762) ConfigPush 2022-12-13 23:46:47 V/Net 2567327040: Saving bdh session to cache 2022-12-13 23:46:47 V/Net 2567327040: Send: ConfigPushSvc.PushResp(ConfigPushSvc.PushResp) 2022-12-13 23:46:47 V/Net 2567327040: Recv: ConfigPushSvc.PushReq
并没有groupmessageEvent,唯一看到的一个receipt当我去尝试获得这个实例的时候。idea告诉我使用了来自不同模块的 Kotlin 内部声明 ,所以我好像也获得不到这个reciept。代码如下
if (event instanceof GroupMessageProcessor.SendGroupMessageReceipt) -
其实文件 id 就是 MessageSource id
要判断回复了什么文件还是可以的 -
@1130600015
我用的是mirai-core-jvm 2.13.2import net.mamoe.mirai.event.events.GroupMessageEvent; bot.getEventChannel() .subscribeAlways(GroupMessageEvent.class, groupMessageHandler::handle);
可以点击此处在线查看Mirai提供的事件列表