@Karlatemp 这个是不接收消息,但楼主想要的是不发送消息吧?有的插件可能不是交互式的,比如每日/每周定时发一条什么消息,如果很多机器人装载了这个插件,只是不接收消息不太能处理这种情况
Michael1015198808 发布的帖子
-
RE: 新人提问,如何让群主/管理能开关bot在该群的所有响应
-
RE: 想找一个b站视频下载转发到qq群的助手
我有一个用
you-get
的方法,不过不是很优雅,抛砖引玉吧object YougetCommand: SimpleCommand( owner = PluginMain, "youget", "you-get", description = "you-get" ) { private var cnt = 0 private var lock = Any() private fun getNo(): Int { synchronized(lock) { cnt += 1 return cnt } } private fun get(process: Process): String { return String(process.inputStream.readNBytes(process.inputStream.available())) } @Handler suspend fun CommandSenderOnMessage<GroupMessageEvent>.run(arg: String, refresh: Long? = null) { val cookie = if (arg.contains("bilibili")) { "/home/michael/cookies/bilibili/youget.txt" } else { null } val no = getNo() var cmdline = "you-get $arg -O /tmp/mirai-$no" if (cookie != null) { cmdline += " -c $cookie" } val f = File("/tmp/").listFiles { _, name -> name.contains("mirai-$no") }.firstOrNull() if (f != null) { f.delete() } val process = ProcessBuilder(cmdline.split(' ')).start() var title = "untitled" var s = "" while (!process.waitFor(1, TimeUnit.SECONDS)) { s += get(process) if (s.contains("Downloading ")) { fromEvent.subject.sendMessage(s.substring(0, s.lastIndexOf("\n"))) val titleLine = s.split("\n")[1] title = titleLine.substring(titleLine.lastIndexOf(' ') + 1) "\\/:*?\"<>|".forEach { title = title.replace(it, '_') } s = s.substring(s.lastIndexOf("\n") + 1) } } if (refresh != null) { do { s += get(process) val pos = s.lastIndexOf('\r') if (pos != -1) { val sub = s.substring(0, pos) val pos2 = sub.lastIndexOf('\r') s = s.substring(pos2) fromEvent.subject.sendMessage(sub.substring( pos2 + 1)) } } while(!process.waitFor(refresh, TimeUnit.SECONDS)) } else { while(!process.waitFor(1, TimeUnit.SECONDS)); } val video = File("/tmp/").listFiles { _, name -> name.contains("mirai-$no") }.firstOrNull() if (video != null) { val ext = video.extension // fromEvent.subject.sendMessage("Uploading ...") println(video.length()) fromEvent.group.files.uploadNewFile( "/$title.$ext", video.toExternalResource(ext).toAutoCloseable(), object : ProgressionCallback<AbsoluteFile, Long> { var last = 0 val tot = video.length() } ) // video.delete() } else { fromEvent.subject.sendMessage("file not found!") } } }
-
RE: 新人提问,如何让群主/管理能开关bot在该群的所有响应
监听
GroupMessagePreSendEvent
,然后判定一下该bot的消息是否要发送(另外实现一个插件或者增加一个权限,用权限来判断),如果不需要就intercept()
cancel()
-
RE: 求问如何使用Python的requests库mirai-api-http中上传图片
file_path = "/tmp/c_exam.png" with open(file_path, "rb") as f: imageUrl = json.loads(requests.post( "http://localhost:9999/uploadImage", files = { "sessionKey":(None, session_key), "type":(None, "friend"), "img": (file_path, f.read()) } ).text)["url"]
解决了解决了orz
-
求问如何使用Python的requests库mirai-api-http中上传图片
查阅文档之后看到需要以
multipart/form-data
格式上传,然后查了一下怎么用requests上传这种格式,写出了如下代码with open("/tmp/c_exam.png", "rb") as f: res = requests.post( "http://localhost:9999/uploadImage", headers={ "sessionKey":session_key, "type":"friend", }, files = { "img": ("/tmp/c_exam.png", f.read()) # "img": ("/tmp/c_exam.png", b"") } )
然而res.text内容为
{"code":400,"msg":"无效参数"}
实在想不出如何解决,用Google搜索mirai-api-http
+requests
+图片
也没找到合适的解法orz -
RE: English-Helper英语单词竞赛插件
@ryan 请问您使用的版本对应哪个commit?动态读取词书的功能是在
96b65f49
之后提供的,但是当时没有放出支持该功能的release。您可以考虑使用3天前的release试试。 -
RE: English-Helper英语单词竞赛插件
@fuyon 请问您使用的版本对应哪个commit?之前有一系列更新没有放出release,您可以考虑使用3天前的release试试。
-
RE: Mirai-Repeater:复读机插件:复读/打断/跟读
@233yuzi 估计是源代码使用
contentToString
的锅,这个函数会把图片变成[图片]
,进而导致无法区分不同的图片,@xtexChooser 可以考虑换用serializeToMiraiCode
-
RE: Mirai如何实现延时执行?
我是用Kotlin开发的,专门瞄了一眼Java的示例代码。
eventChannel.subscribeAlways
的本质是注册了一个回调,每当特定事件发生时,启动一个协程来运行这个回调函数。
因此,Thread.sleep
只是暂停这个协程,应该不会影响后续消息到来触发回调 -
RE: Mirai-Repeater:复读机插件:复读/打断/跟读
@saikewei 在 Mirai-Repeater:复读机插件:复读/打断/跟读 中说:
而且英文字符也有长度限制 三个字就没了
应该是被风控了,我之前也会这样,解决方法是手机端登陆一下bot那个号(把自动登录关了),不放心的话可以登陆之后在群里发一句话,然后重新用bot登录就行了
-
RE: 在mirai-console输入exit后自动发消息
@karlatemp 感谢您的回复。在我实装了上线自动发消息后,登陆了3~4次之后,我的号就被封了……
根据我对log的查看,最后一次上线发完消息之后,过了2分钟就被强制下线了。
希望能警示各位。 -
在mirai-console输入exit后自动发消息
由于有时候机器人需要频繁重启以更新插件,所以想实现开关mcl时都在群里发送消息的功能。
上线发送消息的功能可以通过
eventChannel.subscribeAlways<BotOnlineEvent>{ for ((group, message) in GreetingConfig.OnlineMessages) { bot.getGroup(group)?.sendMessage(if (message != "") message else "机器人已上线!") } }
实现,但是将
BotOnlineEvent
改为BotOfflineEvent
之后,并不能发送消息(可能是因为已经下线了?)。而在插件的onDisable
里通过Bot.instances
访问Bot
实例时,发现已经清空了。
所以我估计mcl对机器人和插件的顺序应该是- 注册插件
- 登录机器人
- 登出机器人
- 解除插件
那么,如何在mirai-console输入exit之后,让bot发送下线消息呢?
-
RE: 关于AutoSavePluginData存储大数据的方案
感谢各位,我最后想了一个多文件的惰性加载的办法。
class PlayerInfoLoader(playerId: Long): AutoSavePluginData("players/$playerId") { var score: Long by value() var wins: Long by value() var loses: Long by value() }
不过这个方法没有加锁,可能存在多线程隐患。
再次感谢各位,我主要是想找一个语言难度低一点的技巧绕开批量存取的问题,现在这个解决方案对我来说应该算是比较好的了