最小应用实践 - Valorant桌面小部件开发

Share

需求背景

Valorant是拳头的新FPS游戏,皮肤商店每天只刷新4件商品,因此如果想要买到想要的皮肤需要每日登录帐号查看。有些第三方网站可以填写帐号密码查看,除了信任危机,也有社区传闻单IP频繁登录有可能造成帐号封禁,每天都去查看也很恼人。

小调研

iOS16后开放了桌面小部件的接口,Scriptable支持通过代码开发小部件,我也曾做过简单的小部件

csgo 小部件

在Github冲浪了一下,找到了拳头登录的接口、Valorant游戏数据的接口以及相关的图片等静态资源

开发背景

2021年底我就实现了这样的功能。能用,但不好用。

老的valorant 小部件
  1. 很慢而且容易出错脚本请求了近十个境外的接口,仅完成登录就需要请求三次拳头的接口,作为后台刷新的程序,普通用户的网络条件下常出现错误。
  2. 展示不够美观Scriptable 提供的方法不足以简单的绘制好看的界面,也不支持自适应布局。无论是Stack(容器)还是Text (文字) 都需要手动指定尺寸,不同屏幕下的组件宽高比不同,想完美绘制界面,需要为每一个不同的屏幕尺寸设定不同的大小,尽管社区存在这样的对应关系 但这仍不是好的解法。

改进

2022年11月一次居家办公,我回归了Valorant,顺便优化了这个程序。

  1. 减轻客户端负载

登录需要在本机完成,获取第三方数据和计算的工作可以迁移到外部。

  1. 使用satori

satori支持使用HTML + CSS进行图像的绘制,Scriptable只需展示一个图片,完美做到自适应。

例如在Scriptable内我就无法使用ObjectFit使图片保持比例的撑满容器。借助丰富的CSS属性,摆布图片和文字的位置变得轻松,我还顺便支持了得意体/落霞孤鹜两种字体。

valorant 小部件
  1. 缓存机制

除了将常用的静态资源存到本地。皮肤商店只在每日8点刷新,8点后的重复计算将会读取本地文件进行渲染,不做重复请求。缓存命中时,执行几乎无延迟,缓存未命中时,可以在10s内执行完毕(原来约1分钟)。

  1. 繁体中文翻译

开发时还没出国服,只有官方的繁体中文翻译,借助了OpenCC在服务端渲染时繁体转简体。

  1. 拓展网页

Scriptable可以为小部件添加跳转Url,小部件会跳转到网页,可以查看皮肤的图像和视频。

valorant网页
  1. 支持了大、中、小三种视图

不同的尺寸的小部件会请求不同的图像,只需做简单参数的区分。

不同大小的小部件

逻辑时序

  1. Scriptable中新建脚本,填写拳头的账号和密码,将小组件添加到桌面
  2. 系统后台运行脚本,根据账密请求拳头接口鉴权获取token,根据token查询账户余额以及商店皮肤的ID
  3. 调用API服务,根据皮肤ID查询名称、价格、图像等信息,使用OpenCC进行繁体转换,satori绘制图像为SVG格式,使用Resvg.js转成Png格式返回。
  4. 小部件展示图像,点击可跳转至开发的前端部分。

其他

出于稳定性和避免接口滥用考虑,使用了cloudflare workers的定时任务,定期将三方接口数据转存至cloudflare R2。

总结

找到了一个真实存在的需求解决很难得。

技术上并没有什么卡点,以上开发、调研、部署等内容在工作之余花了两天时间全部搞定。

相比一个Web应用来说,桌面小部件的空间有限,容纳很少的数据,但仍然是一个很完整的应用。

Read more

WASM初探

前言 最近开发上线了xhair.pro, 其核心的数据是通过爬虫下载.dem文件并使用一些开源的解析库如demoinfocs-golang,demoparser解析获取最终的数据 在本地下载解析上传可以随意配置环境,但浏览器无法直接运行Golang或Rust的代码。想要将解析的能力制作成web应用,需要使用WebAssembly技术。 WASM WebAssembly 是一种新的编码方式,可以在现代的 Web 浏览器中运行——它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C++、C# 和 Rust 等语言提供编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。 我们可以把Rust、Go等语言编译成.wasm后缀的二进制文件,浏览器可以通过WebAssembly的API加载该模块,并调用相关能力 实践 不同编程语言需要通过不同的方式编译至wasm,我尝试了Go与Rust。 Golang实践 1. 首先需要配置Go的环境 go 安装 2. 初始化项目 mkdir w

By pureink

家用服务器公网访问方案

前言 因为ipv4地址数量受限,家庭宽带几乎都没有公网IP。在局域网内可以使用类似192.168.0.100这样的内网IP进行访问,但是想要在外访问或是提供给朋友使用是不行的。 方案一:内网穿透 可以使用具备公网IP的服务器进行中转,用户访问具备公网IP的服务器,该公网服务器再与家庭服务器通信,最终用户访问到家庭内网。 方案对比 方案 价格 优缺点 使用免费服务如ngrok、cloudflare tunnel 无 速度受限,部分功能需要收费如绑定域名 购买云服务器搭建 中 价格高,需要部署维护 购买FRP服务如sakura frp 低 有流量和带宽限制 个人建议 临时需求可以使用ngrok,例如给朋友看正在开发的网站 长期需求建议购买FRP服务,服务器安装frp软件后,可以通过网页配置隧道如下图,可以使用香港的服务器省去域名的备案,但不太适合云盘等大流量应用。 方案二:DDNS 内网穿透需要付费,并且有带宽和流量限制,额外的一个中转服务器也会影响访问速度。 好在ipv6已经逐渐普及,若服务端和客户端同时支持ipv6网络,

By pureink