onebot icon indicating copy to clipboard operation
onebot copied to clipboard

将通信方式 webhook 改为可选

Open idranme opened this issue 2 years ago • 3 comments

  • 状态:草稿
  • 相关 PR:无

摘要

实现端并非必须实现通信方式 webhook。

动机

实现端对应用端发送事件后,应用端返回动作请求。动作请求完成后,无法在同一个连接内发送动作响应。

具体描述

OneBot 实现必须完整实现 OneBotRPC 所规定的所有通信方式(HTTP Webhook 为可选)和数据协议。每种通信方式可以允许用户同时配置多个。

局限

替代方案

不返回动作响应

idranme avatar May 06 '22 07:05 idranme

此提议我认为是合理的。从 LibOneBot 开发角度来看,通信方式应该是无关实现本身的,但是有时候又会考虑到实现协议有可能和 OneBot 通信协议本身重合或冲突。比如,在某些语言中,启动了一个 Server 后,无法再启动另一个 Server 监听,可能需要考虑共用一个 Server 然后使用分流方式处理数据。再比如,现在的微信公众平台如果不使用认证,仅可使用被动回复的 Webhook 类似的方式回复微信,而此处微信假定它为 OneBot 一种实现,那么就只能使用 Webhook 通信方式进行沟通。

而现在已知的是,微信公众平台的被动回复本身就是无动作状态的,微信平台的服务器只会区分两种情况,一种是服务器访问成功,回复了期望内的值(例如不用回复消息时返回一个 success 字符串,回复消息时回复对应合规的 XML 对象),以及非法的值(非法时它会尝试重新发起一次 HTTP 请求),直到达到重试上限(默认好像是 5 次)或重试次数之内成功一次。

所以我们假设,在使用 libob 库开发 OneBot 实现时,如果我们选择实现微信公众号聊天,那么默认只能选择让 libob 本身开启一个用于接收微信服务器 Webhook 前方的HTTP 服务器,由 libob 转换为 OneBot 12 格式后再发起一个 HTTP 客户端,之后再通过回包对其转换,此处的 WebHook 通信方式应该是必不可少,其他通信方式反而可能是不可用的状态。假设使用了反向 ws,那么发出 ws 数据包后,由于是全双工,无法确定什么时候的动作数据回包会发送,只能通过一个最大限度的等待,比如 2 秒内收到动作请求即转换响应为被动回复等。

通信协议此处应该描述准确一点,大致意思就是,如果使用某种通信方式,则必须按照 OneBotRPC 规定的对应通信方式进行编写,而不是必须每种通信协议都应该保证可使用。

crazywhalecc avatar Jun 13 '22 10:06 crazywhalecc

此处的 WebHook 通信方式应该是必不可少,其他通信方式反而可能是不可用的状态。假设使用了反向 ws,那么发出 ws 数据包后,由于是全双工,无法确定什么时候的动作数据回包会发送,只能通过一个最大限度的等待,比如 2 秒内收到动作请求即转换响应为被动回复等。

其实我感觉,作为 LibOneBot 应该要实现所有通信方式,微信公众号这种的 OneBot 实现应该有一个最大等待时间,对应用端来讲仍然可以采取任何通信方式连接。其实这和原来 WebSocket 的使用逻辑是一样的,应用端发送 action request 之后,也是需要等待 response 至一个超时时间的。

stdrc avatar Jun 13 '22 11:06 stdrc

其实我感觉,作为 LibOneBot 应该要实现所有通信方式,微信公众号这种的 OneBot 实现应该有一个最大等待时间,对应用端来讲仍然可以采取任何通信方式连接。其实这和原来 WebSocket 的使用逻辑是一样的,应用端发送 action request 之后,也是需要等待 response 至一个超时时间的。

但是对于一些语言或平台本身的限制来说,可能无法同一时间实现对应 LibOB 所有的通信方式。比如浏览器无法直接实现多 Server,比如部分语言只支持 HTTP 协议等情况。我们的目标固然是让 OneBot 和 LibOB 在越来越多的语言和平台上运行,所以通信方式理论上不应作为必须实现的门槛。

此外,对于此 RFC 本身提到的替代方案,我认为目前的 Webhook 默认行为应该就是这样的。

crazywhalecc avatar Jun 18 '22 17:06 crazywhalecc

但是对于一些语言或平台本身的限制来说,可能无法同一时间实现对应 LibOB 所有的通信方式。比如浏览器无法直接实现多 Server,比如部分语言只支持 HTTP 协议等情况。我们的目标固然是让 OneBot 和 LibOB 在越来越多的语言和平台上运行,所以通信方式理论上不应作为必须实现的门槛。

我在想,可以把对 OneBot 实现的要求改为“除非语言或运行环境不允许,否则应实现所有的通信方式,当确实有客观限制时应实现尽可能多的通信方式”。因为我们确实希望实现要支持更多通信方式,不然应用端和实现端对不上的话,生态还是残,所以还是对实现要求高一点比较好。

stdrc avatar Aug 16 '22 14:08 stdrc