最近discord又推出了一个新功能,拥有全局管理员权限的用户可以将其guild导出成server templates,这样别人拿到这个templates链接(顺便一提的是,discord官方居然做了些这种templates)就能一键生成和那个guild几乎完全一样的guild了,准确点来说频道、roles和权限设置(包括每个频道的特殊权限设置)都能继承,emoji好像不能
当然这个功能得全局管理员那么大的权限才能使用,不过。。。
I discord guild datastructure
我前段时间在写频道备份脚本,我在想discord肯定有api可以获取一个guild里所有channels的数据,然后就可以一个for循环搞定
然后我就看了下注诸如https://discordapp.com/api/v6/guilds/[guild id]
和https://discordapp.com/api/v6/guilds/[guild id]/channels
返回的结果,然后我发现了一件非常生草的事情:
无论用户有什么roles,哪怕没有roles,都能获得里面所有频道的信息、所有roles的信息,甚至所有和权限有关的信息
从某种程度上来说,获取的信息和templates功能返回的信息几乎一样多,甚至更多,毕竟还有emoji的信息,还有每个玩意的id(在templates返回的信息里面id只是个位数,而不是和时间相关的参数,不过这个不太重要)
所以我在想,有没有办法利用抓取的这部分metadata手动构造一个和原版一毛一样的guild?
II bruh
我仍然懒得看discord官方文档,所以我打算抓包解决
尽管我肯定希望discord有那么一个api,能让我把抓包得到的metadata全部扔进去它就能让一个guild变成一个和那些metadata一毛一样的guild,然而很不幸的是它并没有这种api;所以我们只能手动来了:
- 建立一个guild,并按照metadata修改其基本属性
- 按照metadata的内容建立一系列channels,别忘了channel有三种,文字channel,语音channel,还有category也是channel的一种,三种都需要抓包
- 对每一个channel以其metadata进行修改属性操作
- 按照metadata的内容建立一系列roles,并设置其permissions(但愿其设置permissions的api也是直接一个数字过去)
- 对每个channel设置permission override
- 如果可能的话,emoji也重新上传一遍,这个好办,上传动画emoji好像不需要nitro我也不清楚
- 调用discord的template功能:wiebitte:
现在已知的api操作:
- 貌似频道的position这个参数只在其parent id里面,而category它也有自己的position
- 一次请求就可以搞定所有频道的排序,所以理论上来说可以在一次请求中加入所有原来的parent id和position,理论上来说就能搞定排序问题
- roles也能一次性搞定排序;另外和channels一样,排序的api和每个元素属性的api是两个不同的api
- 奇怪的是channel的permission override用了put请求,而且貌似每个channel的每个role都需要请求一遍;只不过好像没有新建override和更改的区别
- 其实permission override可以建立频道channel的时候就加进去,不然的话它就和category同步;我觉得category会有permission override这么一个选项可能就和这个有关吧
UPDATE:终于写完了,建立频道的时候我建立了两遍,第一遍先建立categories,然后对它们排序,然后在metadata里面替换一遍id,就像建立roles时做的那样(其实roles应该先建立,然后在metadata里替换掉id,这样才能正确地设置permission override);第二遍再建立其他channels;我发现在建立channel时就可以设置好除了position之外的所有参数,甚至包括parent id(但就是position需要从所有参数里移除,之后再设置,不然会导致部分channels创建失败)
接下来当然就可以用discord的那个templates功能创建个template了,然后就可以用来troll人了;比如:
某个shuann(p5的joker和ann chan)聊天室
是时候迫害一波perusonafags了(手动滑稽