0x00写在前面

开一个帖,记录一下Nekobot的开发心得吧(主要是自己认为比较重要的某些功能的代码实现方法,写给自己,以免忘记)

不过,如果笔记里的这些内容对你有所帮助,那就更好了2333.

0x01通过Get方式请求来获取网页源码

1
2
3
4
5
6
7
8
9
10
fun httpget(url: String): String? {
val client = OkHttpClient()
val request = Request.Builder().get()
.url(url)
.build()
val call = client.newCall(request)
val response = call.execute()
val HTML = response.body?.string()
return HTML
}

肯定要有的,不然网页api以及爬虫都做不了了

0x02读取本地文件夹的文件名

1
2
3
4
5
6
7
8
fun getImgList(path: String): MutableList<String> {
val files: MutableList<String> = mutableListOf()
val fileTree: FileTreeWalk = File(path).walk()
fileTree.maxDepth(1)
.filter { it.isFile }
.forEach { files.add(it.name) }
return files
}

示例是读取本地文件夹的图片,通过类似的思路做了个黑名单读取

1
2
3
4
5
6
7
8
fun getList(path: String): MutableList<Long> {
val files: MutableList<Long> = mutableListOf()
val fileTree: FileTreeWalk = File(path).walk()
fileTree.maxDepth(1)
.filter { it.isFile }
.forEach { files.add(it.name.toLong()) }
return files
}

读取时转换为id(类型为Long),一般来说这个添加方式比修改服务器上的黑名单列表文件内容方便多了,我只要新建个文件,文件名为屏蔽的id就是了;想要移除,删掉就是了。

为什么不在QQ上直接指示机器人屏蔽某个QQid?对不起,我对本人的编程水平极不自信,虽然源文件泄露导致发现漏洞然后攻击的可能性极微。但是给mirai以root权限对服务器的文件进行创建删除写入,我不太敢这样做。

顺便一提.filter是选择器而.forEach是循环,类似与if和for,不过咱只有在这块使用了这个kotlin推荐(?)使用的选择语句和循环语句,其他地方一般就是if和for,有的时候还是when(选择语句),语法相当混乱(捂脸)

0x03获取网络资源并转换为流

1
2
3
4
5
6
7
8
9
//获取网络图片
fun getNetImg(urlstr: String): InputStream? {
val url = URL(urlstr)
// return try { 实有异常了再说
return url.openConnection().getInputStream()
// }catch(err:java.io.IOException){
// null
// }
}

学会这个的契机是想发送网络上的图片来着的

https://mirai.mamoe.net/topic/337/%E8%AF%B7%E9%97%AE%E5%A4%A7%E4%BD%AC%E4%BB%AC%E6%9C%89%E4%BB%80%E4%B9%88%E5%8F%91%E9%80%81%E7%BD%91%E7%BB%9C%E5%9B%BE%E7%89%87%E7%9A%84%E6%80%9D%E8%B7%AF%E5%90%97

就是这个思路,另外提一下mirai的具体食用方法吧

1
2
3
4
5
6
7
8
9
10
getNetImg(imgurl).use {
if (it != null) {
//方法一,最原始的发送图片的方法,就是先uploadImage 然后sendMessage
val img = it.toExternalResource()
group.sendMessage(group.uploadImage(img))
//方法二,sendImage相当于先进行uploadImage然后再sendMessage
group.sendImage(img)
} else {
}
}

0x05发送语音

其实也没啥,不过注意,只支持 amrsilk 格式

1
group.sendMessage(File("${voiceDir}Av845256252.silk").toExternalResource().uploadAsVoice(group))