MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接
    1. 主页
    2. Michael1015198808
    3. 帖子
    M
    • 资料
    • 关注 1
    • 粉丝 1
    • 主题 4
    • 帖子 21
    • 最佳 1
    • 有争议的 0
    • 群组 0

    Michael1015198808 发布的帖子

    • RE: 新人提问,如何让群主/管理能开关bot在该群的所有响应

      @Karlatemp 这个是不接收消息,但楼主想要的是不发送消息吧?有的插件可能不是交互式的,比如每日/每周定时发一条什么消息,如果很多机器人装载了这个插件,只是不接收消息不太能处理这种情况

      发布在 使用交流
      M
      Michael1015198808
    • 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!")
              }
          }
      }
      
      发布在 使用交流
      M
      Michael1015198808
    • RE: 新人提问,如何让群主/管理能开关bot在该群的所有响应

      监听GroupMessagePreSendEvent,然后判定一下该bot的消息是否要发送(另外实现一个插件或者增加一个权限,用权限来判断),如果不需要就intercept() cancel()

      发布在 使用交流
      M
      Michael1015198808
    • 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

      发布在 使用交流
      M
      Michael1015198808
    • 求问如何使用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

      发布在 使用交流
      M
      Michael1015198808
    • 机器人编码异常

      在接收到某个含有特殊编码的群后,mcl-2.1.1的输出开始出现乱码,之前使用mcl-1.2.2的时候没遇到过这个问题。

      QQ图片1145141919810.png

      附触发bug的群名

      LUG@NJU<$ǿĀD>

      发布在 BUG反馈
      M
      Michael1015198808
    • RE: English-Helper英语单词竞赛插件

      @tsudzuki 啥问题(现在开学了,我和原插件开发者估计没啥时间能花在这插件上了)

      发布在 插件发布
      M
      Michael1015198808
    • RE: English-Helper英语单词竞赛插件

      @heckerz 要解压

      发布在 插件发布
      M
      Michael1015198808
    • RE: English-Helper英语单词竞赛插件

      @ryan 请问您使用的版本对应哪个commit?动态读取词书的功能是在96b65f49之后提供的,但是当时没有放出支持该功能的release。您可以考虑使用3天前的release试试。

      发布在 插件发布
      M
      Michael1015198808
    • RE: English-Helper英语单词竞赛插件

      @fuyon 请问您使用的版本对应哪个commit?之前有一系列更新没有放出release,您可以考虑使用3天前的release试试。

      发布在 插件发布
      M
      Michael1015198808
    • RE: Mirai-Repeater:复读机插件:复读/打断/跟读

      @233yuzi 估计是源代码使用contentToString的锅,这个函数会把图片变成[图片],进而导致无法区分不同的图片,@xtexChooser 可以考虑换用serializeToMiraiCode

      发布在 插件发布
      M
      Michael1015198808
    • RE: Mirai如何实现延时执行?

      我是用Kotlin开发的,专门瞄了一眼Java的示例代码。
      eventChannel.subscribeAlways的本质是注册了一个回调,每当特定事件发生时,启动一个协程来运行这个回调函数。
      因此,Thread.sleep只是暂停这个协程,应该不会影响后续消息到来触发回调

      发布在 开发交流
      M
      Michael1015198808
    • RE: Mirai-Repeater:复读机插件:复读/打断/跟读

      @saikewei 在 Mirai-Repeater:复读机插件:复读/打断/跟读 中说:

      而且英文字符也有长度限制 三个字就没了

      应该是被风控了,我之前也会这样,解决方法是手机端登陆一下bot那个号(把自动登录关了),不放心的话可以登陆之后在群里发一句话,然后重新用bot登录就行了

      发布在 插件发布
      M
      Michael1015198808
    • RE: 在mirai-console输入exit后自动发消息

      @nambers 您的方法确实可行,但其实我希望的是输入exit或者终端^C之后,bot都能在下线时自动发消息

      发布在 开发交流
      M
      Michael1015198808
    • RE: 在mirai-console输入exit后自动发消息

      @karlatemp 感谢您的回复。在我实装了上线自动发消息后,登陆了3~4次之后,我的号就被封了……
      根据我对log的查看,最后一次上线发完消息之后,过了2分钟就被强制下线了。
      希望能警示各位。

      发布在 开发交流
      M
      Michael1015198808
    • 在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发送下线消息呢?

      发布在 开发交流
      M
      Michael1015198808
    • RE: sendMessage无法使用?

      建议多了解一点Kotlin,然后阅读一下插件模板,新手可以在模板的基础上删删改改来实现自己的插件,追求从0开始的话很多地方容易踩坑

      发布在 开发交流
      M
      Michael1015198808
    • RE: English-Helper英语单词竞赛插件

      老哥猛!

      发布在 插件发布
      M
      Michael1015198808
    • RE: 关于AutoSavePluginData存储大数据的方案

      感谢各位,我最后想了一个多文件的惰性加载的办法。

      class PlayerInfoLoader(playerId: Long): AutoSavePluginData("players/$playerId") {
          var score: Long by value()
          var wins: Long by value()
          var loses: Long by value()
      }
      

      不过这个方法没有加锁,可能存在多线程隐患。
      再次感谢各位,我主要是想找一个语言难度低一点的技巧绕开批量存取的问题,现在这个解决方案对我来说应该算是比较好的了

      发布在 开发交流
      M
      Michael1015198808
    • RE: 关于AutoSavePluginData存储大数据的方案

      感觉引入Redis会让插件大小变得不必要的大,我好像想到了一个解决方案,稍后尝试一下,如果可行再回来()

      发布在 开发交流
      M
      Michael1015198808
    • 1
    • 2
    • 1 / 2