这个服务器监控微信小程序,有点意思

2020-05-13 18:09:34 +08:00
 jerrodpoole

写在前面

想写一个服务器监控的网页供自己用,突发奇想能不能用小程序实现。然而遇到了一些问题,众所周知小程序请求地址必须在开发信息中手动报备并且要求域名备案。而我想实现的是可以动态添加节点,并且通过小程序直接连接到服务器,不经过第三方服务器。琢磨了一段时间做了这个,可以实现小程序和服务器的点对点连接。

特点

原理

这是一个黑魔法( hhh 开玩笑

原理很简单,是巧妙运用了小程序 image 组件的 bindload 接口,当图片加载成功时会返回图片的宽和高。也就是说一个图片能够返回两个数值,前后端约定好请求 API 后可以动态创建 image 获取一系列数值。

注意这个接口是不要求图片地址是备案域名,不用在小程序开发信息中报备。但是这种信息传递方式比较低下,只适合传递少量的信息,但是对这个需求来说足够了。

但是直接传递大体积的二进制图片很浪费带宽,解决方案是后端动态生成 svg 图片。也就是说,动态返回下面这种形式的文字信息:

<svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg"></svg>

详细的实现可以看这个文件

截图给你

不是所有人都有空去打开小程序,截个图放这里,长这样:

节点列表界面

自定义主题样式界面

小程序二维码和后端 github 地址

扫码或者微信搜索 miniStatus 小程序

后端项目地址:https://github.com/axipo/mini-status

(顺手求个 star

10914 次点击
所在节点    分享创造
93 条回复
tanranran
2020-05-13 18:16:32 +08:00
LZ 思路骨骼清奇,太强了。
dixeran
2020-05-13 18:39:22 +08:00
骚操作,学到了
proqj
2020-05-13 18:41:59 +08:00
666 牛皮
misaka19000
2020-05-13 18:55:22 +08:00
哈哈哈有点意思
zhuangjia
2020-05-13 19:28:34 +08:00
有点意思
narmgalaxy
2020-05-13 20:19:47 +08:00
可以直接生成一个图片呢,把数据画在图片上。弊端 浪费流量,好处就是数据量更大了。
narmgalaxy
2020-05-13 20:20:16 +08:00
你这思路确实 np,学习了。
hlwjia
2020-05-13 20:24:43 +08:00
这思路太 np 了!
jerrodpoole
2020-05-13 20:33:52 +08:00
@narmgalaxy #6 此路不通的,wx.canvasGetImageData 需要先 CanvasContext.drawImage,而 CanvasContext.drawImage 所要绘制的网络图片要通过 getImageInfo / downloadFile 先下载,下载需要先配置开发信息,死胡同。微信几乎把所有能想到的方法都堵死了 :(
s609926202
2020-05-13 20:39:40 +08:00
@jerrodpoole 所以实际不可行喽?
s609926202
2020-05-13 20:41:14 +08:00
@s609926202 抱歉看错了,是 6 楼的不可行,😓
jerrodpoole
2020-05-13 20:43:42 +08:00
@s609926202 #10 这个提问有点模糊,不知道说的是哪个不可行
楼上说的`把数据画在图片上`的做法不可行,解释过了
利用 bindload 获取宽和高的办法是可行的,毕竟都做出来了,总不至于空口说浪费大家时间啦
jerrodpoole
2020-05-13 20:47:29 +08:00
@s609926202 #11 没事没事,消息延迟,我又跟你发了一遍
neekeV2
2020-05-13 21:16:40 +08:00
这个思路好骚啊
Meiyun
2020-05-13 21:36:39 +08:00
不错啊 写到我博客了
qiayue
2020-05-13 21:44:19 +08:00
miniStatus 转成二进制是
01101101011010010110111001101001010100110111010001100001011101000111010101110011

再每 12 位分割,最后补 0,得到
011011010110 : 1750
100101101110 : 2414
011010010101 : 1685
001101110100 : 884
011000010111 : 1559
010001110101 : 1141
011100110000 : 1840
四次请求就可以传递了
1750,2414
1685,884
1559,1141
1840,0
jerrodpoole
2020-05-13 21:59:20 +08:00
@qiayue #16 如果用到的字符有限的话,可以自制码表,甚至可以更省
vc1
2020-05-13 22:19:49 +08:00
数据转 10 进制纯数字,不知道最大到几位
Tink
2020-05-13 22:50:28 +08:00
骚气
etouyang
2020-05-13 22:53:17 +08:00
骚年, 好想法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/671337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX