我们先来看下云变量的样子:

Scratch团队在FAQ里解释了
云变量可以让作品里保存的数据与Scratch社区的其他人所共享。你可以利用云变量发布调查或其他作品,而社区中的其他人可以访问和修改这些数据。
当你运行一个用了云变量的作品时,你使用过程中产生的数据会存放在你的用户名下,其他人可以看到这些数据。
云变量只能存放数字。
不可以。虽然在技术上是可能的,但Scratch网站不允许这样做。
只有你和项目的查看者才能将数据存储在项目的云变量中。 如果人们进入项目内部源码或重新混合(remix)你的代码,将会创建变量的副本,而不会影响或更改原始变量。
由于网速和同步的问题,创作多人游戏比较困难。但仍然有一些Scratcher别出心载,使用云变量制作回合制游戏以及其他类型的游戏。
云变量会在后台产生日志。每个项目最多有10个云变量。
Scratch新用户可能无法使用云数据。Scratch团队不希望Scratch新手滥用云变量,因为它可能会给系统带来很大的负担。
云变量会自动更新,利用这个特性,可以建立联机游戏和聊天室,但官方不希望有高频交互,这将带来服务器压力。此外,实时性也不能保证,如果你希望建立实时的强连接,参考codelab-adapter的虫洞(wormhole)。
说了半天,你可以看一个带有云变量的项目Google Chrome Dino Run 2 remix
解释完了云变量,我们进入技术分析部分,我们试图回答: 云变量是怎么实现的,并给出简单的实现例子。
和之前的分析一样,借助Chrome DevTools,我们来观察创建和使用云变量的过程中都发生了什么。
注意: 你的账号不能是新注册的,否则你没有创建云变量的权限。
创建我们的第一个云变量: test_cloud_var

来看看请求细节(Headers)

Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的。websocket中似乎没有处理用户凭证相关的问题。
接着看看Frames:

向上的箭头表示的数据流向为 client(scratch-gui)-> server
向下的箭头表示的数据流向为 server-> client
创建变量的过程非常简单:
后端的云变量服务地址位于wss://clouddata.scratch.mit.edu/,通过这个线索,我们可以找到与云变量相关的前端源码, 源码非常简单。

值得注意的是,设置变量的过程,数据从前端发往服务端,服务端不做响应。
项目中存在云变量时,我们重新打开这个项目,默认将拉去云变量中存储的的值


从前端源码中似乎没看到权限相关的部分。
明天有空做个实验,试试未登录状态是否能与云变量服务进行通信。
|
|
实验发现只有在登陆情况下,才能建立websocket连接。websocket在建立连接的时候会携带cookie,这就是实现用户身份验证的关键。
下边我们给出兼容Scratch开源前端的云变量后端实现。这个实现只作为原理展示,如果你要用于生产环境,需要做些调整。
该实现基于Python的websockets
|
|
测试代码与scratch-gui中的代码基本一致:
|
|

如果你要用于生产环境,还需要处理cookie和多个客户端一同读写云变量的问题(考虑到读写频率,推荐使用redis, 如果你的后端也用python异步api实现,推荐使用aioredis)。
Send a message to the cloud server at a rate of no more than 10 messages/sec
this.sendCloudData = throttle(this._sendCloudData, 100);
我们先来看下云变量的样子:

Scratch团队在FAQ里解释了
云变量可以让作品里保存的数据与Scratch社区的其他人所共享。你可以利用云变量发布调查或其他作品,而社区中的其他人可以访问和修改这些数据。
当你运行一个用了云变量的作品时,你使用过程中产生的数据会存放在你的用户名下,其他人可以看到这些数据。
云变量只能存放数字。
不可以。虽然在技术上是可能的,但Scratch网站不允许这样做。
只有你和项目的查看者才能将数据存储在项目的云变量中。 如果人们进入项目内部源码或重新混合(remix)你的代码,将会创建变量的副本,而不会影响或更改原始变量。
由于网速和同步的问题,创作多人游戏比较困难。但仍然有一些Scratcher别出心载,使用云变量制作回合制游戏以及其他类型的游戏。
云变量会在后台产生日志。每个项目最多有10个云变量。
Scratch新用户可能无法使用云数据。Scratch团队不希望Scratch新手滥用云变量,因为它可能会给系统带来很大的负担。
云变量会自动更新,利用这个特性,可以建立联机游戏和聊天室,但官方不希望有高频交互,这将带来服务器压力。此外,实时性也不能保证,如果你希望建立实时的强连接,参考codelab-adapter的虫洞(wormhole)。
说了半天,你可以看一个带有云变量的项目Google Chrome Dino Run 2 remix
解释完了云变量,我们进入技术分析部分,我们试图回答: 云变量是怎么实现的,并给出简单的实现例子。
和之前的分析一样,借助Chrome DevTools,我们来观察创建和使用云变量的过程中都发生了什么。
注意: 你的账号不能是新注册的,否则你没有创建云变量的权限。
创建我们的第一个云变量: test_cloud_var

来看看请求细节(Headers)

Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的。websocket中似乎没有处理用户凭证相关的问题。
接着看看Frames:

向上的箭头表示的数据流向为 client(scratch-gui)-> server
向下的箭头表示的数据流向为 server-> client
创建变量的过程非常简单:
后端的云变量服务地址位于wss://clouddata.scratch.mit.edu/,通过这个线索,我们可以找到与云变量相关的前端源码, 源码非常简单。

值得注意的是,设置变量的过程,数据从前端发往服务端,服务端不做响应。
项目中存在云变量时,我们重新打开这个项目,默认将拉去云变量中存储的的值


从前端源码中似乎没看到权限相关的部分。
明天有空做个实验,试试未登录状态是否能与云变量服务进行通信。
|
|
实验发现只有在登陆情况下,才能建立websocket连接。websocket在建立连接的时候会携带cookie,这就是实现用户身份验证的关键。
下边我们给出兼容Scratch开源前端的云变量后端实现。这个实现只作为原理展示,如果你要用于生产环境,需要做些调整。
该实现基于Python的websockets
|
|
测试代码与scratch-gui中的代码基本一致:
|
|

如果你要用于生产环境,还需要处理cookie和多个客户端一同读写云变量的问题(考虑到读写频率,推荐使用redis, 如果你的后端也用python异步api实现,推荐使用aioredis)。
Send a message to the cloud server at a rate of no more than 10 messages/sec
this.sendCloudData = throttle(this._sendCloudData, 100);