--- title: 为什么不是 OneBot? --- 样的问题——「Chronocat 推荐使用 Satori。为什么不是 OneBot?」 实际上,这个问题可以拆分成两个问题: 1. **为什么 Chronocat 只提供了 Satori,没有提供 OneBot?** 1. **为什么 Chronocat 推荐使用 Satori,而不是 OneBot?** 第一个问题很好解答:我和我认识的人主要使用 Satori。我个人的 Bot 从很久以前开始就基于 Satori。 所以,Chronocat 不支持 OneBot 只是因为目前我没有使用 OneBot 的需求,也就没有提供 OneBot 的实现。未来如果我有用到 OneBot 的地方,那么也会提供 OneBot 实现的。 但是为什么 Chronocat 推荐使用 Satori 而非 OneBot 呢?让我们先从几个经常遇到的场景开始说起。 --- 111111111111111111111111111111111111111111111111 # 为什么 Satori 数据包中消息使用 string? 如果你还不了解 Satori 或 Satori 消息元素,那么请前往 [Satori 官网] 列举一下各协议传递消息内容的方式,在 Satori 出现以前应当只有这两种: - 使用 String 传递,并定义一种特殊元素 - 使用 JSON 传递 ## 为什么使用 XML 而不是 JSON? ```cs var 消息; // 遍历消息 foreach (var 消息段 in 消息) { // 要判断的是文字消息 if (消息段.类型 == "text") { // 判断内容有无「我超」 if (消息段.内容.包含("我超")) { 发送("原!"); } } } ``` ```cs if (消息.包含("我超")) 发送("原!") ``` 不过,具体到这个问题的话,`alt_message` 呢?一些协议的 ## 既然使用 String,那么表达消息的能力会不会遇到问题? ```html 你好! 我是 Chronocat 。 ``` 这是一段 HTML 文本。把它保存成 `.html` 格式的文件后用浏览器打开,你会发现上面的粗体(b)和斜体(i)都正确得到了渲染(是的,你不需要添加 `` 和 `
` 等标签)。很显然,HTML 是 String,并且它的表达能力没有任何问题,因为我们每天都会使用的各个网站全都使用 Web 技术构建。 那么,为什么在机器人开发中,我们就会开始担心 String 的表达能力问题呢?确切地来说,为什么我们会开始担心 **String 相较 JSON 的表达能力问题呢**? 显然,是 OneBot 的 String 形式消息的表达能力出现了问题。这一问题实际上是由 CQ 码带来的。CQ 码只有一个最核心的问题: **CQ 码不支持嵌套。** 不支持嵌套是 CQ 码表达能力出现缺失的根本原因,CQ 码无力表达类似合并转发(`