用 Lua 实现微信跳一跳辅助

开发环境

电脑:Windows 或 Mac
软件:Lua 编辑器、抓色器(可以在官网下载)
手机:触动精灵(iOS 或者安卓都可以)

工作原理

抓色器远程连接手机截图,找到坐标点和颜色值,作业部落上有使用教程。(https://www.zybuluo.com/miniknife/note/629913)。
通过 Lua 实现模拟点击

下面是 xtutu 在知乎发表的源码: 微信跳一跳辅助2.0

网上很多大神分享了各种语言写的版本,其实用 Lua 也可以实现的,而且还支持 iOS 越狱系统。

昨天花了点时间,写了这样一个模拟操作的脚本。今天整理了一下,发到知乎上来。

该脚本是直接在手机上运行,不需要借助电脑来使用。

演示视频见原帖。

当然,如果不想被删好友的话,就不要用脚本跑。。。(我是用测试帐号在运行)

代码

init(0, 0)
local screenWidth, screenHeight= getScreenSize();
local distanceTimeRate = 1.32
local targetPositionOffset = screenHeight * 0.013

function Touch(x, y, milliSecond)
    touchDown(x, y)
    mSleep(milliSecond)
    touchUp(x, y)
end

function main()
	dialog("请在5秒内打开游戏,并点击开始按钮", 0);
	mSleep(5000)
	DoLoop()
end

function DoLoop()
	for i = 1, 1000 do 
		keepScreen(true);  
		if DoJump() == false then
			keepScreen(false); 
			break
		end
		keepScreen(false); 
		mSleep(2500)
	end
end

function DoJump() 
	local x, y = GetCalcSelfPosition()
	if x == -1 or x == 0 then
		return false
	end
	local endX = screenWidth	-- 1080 1920
	local endY = screenHeight * 0.7
	local startX = 0
	local startY = screenHeight * 0.2

	if x < screenWidth / 2 then
		startX =  screenWidth / 2
	else
		endX = screenWidth / 2
	end
	
	local targetX, targetY = GetTargetPosition(startX, startY, endX, endY)
	local distance = math.sqrt( (x - targetX) * (x - targetX) + (y - targetY) * (y - targetY) )
	local pressTime = CalcHoldTime(distance)
	Touch(100,100, pressTime)
	return true
end

function GetCalcSelfPosition()
	x,y = findMultiColorInRegionFuzzy( 0x38365e, "-16|-6|0x35335a,13|-5|0x39375f", 98, 0, 0, screenWidth, screenHeight)
	return x, y
end

function GetTargetPosition(startX, startY, endX, endY)
	local step = 3
	local r, g, b, rr, gg, bb 
	for y = startY , endY, step do
		r, g, b = getColorRGB(1, y)
		for x = startX, endX , step do
			rr, gg, bb  = getColorRGB(x, y)
			if isColor(r, g, b, rr, gg, bb, 98)  then
				r = rr
				g = gg
				b = bb
			else
				return x, y + targetPositionOffset
			end
		end
	end
	return -1, -1
end

function isColor(rr, gg, bb, r, g, b ,s) 
    local fl,abs = math.floor,math.abs
    s = fl(0xff*(100-s)*0.01)
    if abs(r-rr) < s and abs(g-gg) < s and abs(b-bb) < s then
        return true
	end
	return false
end

function CalcHoldTime(distance)
	return distance * distanceTimeRate
end

main()

如果脚本跑的并不准确,可以修改参数

distanceTimeRate: 数字越大表示蓄力时间越长
targetPositionOffset: 表示方块最上方的点,距离中心点的偏移
如果还是不行的话,那就算了吧…

思路
1.确定自己的当前位置

直接查找像素就可以了

2.确定目标点位置

可以通过自己当前的位置判断一个大致的范围。

然后通过从左上,到右下角,依次遍历像素。找到方块最上方的像素点。

然后把y + 上一个大概的值来确定。

3.距离与时间转换

游戏的公式是线性的,直接乘以系数就可以了

使用方法
必备条件:root 了的 Android手机或越狱了的 iOS 手机

Android 手机安装触动精灵

  1. 左上角Wifi传输
  2. 复制上述代码(直接手机新建脚本复制,会导致代码格式变乱,没法运行,得通过电脑wifi传输等方式来传输!脚本放在目录TouchSprite/lua/下,文件名可以取为 main.lua)
  3. 勾选该脚本
  4. 点击右侧菜单,点击立即运行(按照提示进行即可)

iOS 手机安装触动精灵

  1. Cydia 添加源:apt.tousprite.com 安装触动精灵
  2. 左上角 WIFI 传输
  3. 复制代码
  4. 勾选脚本
  5. 点击右侧菜单运行脚本

需要优化的点

  1. 并没有去精确的识别位置
  2. sleep函数并不精确,需要一个更加精确的方式来控制
  3. 不同分辨率的屏幕,并没有做完美的适配(我的是1080 * 1920)
  4. 距离时间的比率,不应该粗暴的用一个值去控制,应该用两个值去分别乘以x,y的距离,然后再算距离(这得看游戏画面本身的屏幕适配是如何做的)
  5. 性能差的机型,跑得并不稳定(我用红米2,跑了大概10次,最高跑到2000多分,最低只跑了几百分),这有一部分是因为“优化点 1”导致的。

其它的方式:

除了手动模拟操作,应该还可以直接截取网络请求,通过篡改分数来达到目的。

(不过感觉这样做的话,就没有了好看的视觉效果…)