安卓版本微信跳一跳自动执行代码的示例分析
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍安卓版本微信跳一跳自动执行代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!整体的结构脚本的整体结构还是比较简洁的,如下图所示。手机连接PC,PC通过
千家信息网最后更新 2025年01月22日安卓版本微信跳一跳自动执行代码的示例分析
这篇文章主要介绍安卓版本微信跳一跳自动执行代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
整体的结构
脚本的整体结构还是比较简洁的,如下图所示。
手机连接PC,PC通过adb命令对手机游戏界面进行截图;
PC通过adb命令将该截图拷贝回PC;
PC端通过python对图像进行处理(第一版中使用的opencv,目前使用的是直接读取像素的rgb值),获取棋子的位置,获取下一个棋盘的位置,然后计算出下一跳的距离,从而根据经验值计算出按压时间t;
通过adb命令模拟按压时间t即可实现棋子的跳跃;
重复1~4就可以自动化执行"跳一跳"游戏。
安卓手机屏幕坐标
代码剖析
主函数代码
def main(): #获取设备信息 dump_device_info() #检查adb check_adb() #主循环 while True: #通过adb截图,并将图片拷贝回PC pull_screenshot() #将图片加载进内存 im = Image.open('./autojump.png') # 获取棋子和 board 的位置 piece_x, piece_y, board_x, board_y = find_piece_and_board(im) #打印调试信息 ts = int(time.time()) print(ts, piece_x, piece_y, board_x, board_y) #将按压的位置设置为【再来一局】的位置,这样失败的时候可以自动开始 set_button_position(im) #计算下一跳的距离,根据经验值转换为时间,并通过adb下发给设备模拟按压 jump(math.sqrt((board_x - piece_x) ** 2 + (board_y - piece_y) ** 2)) #对调试界面进行截图,方便调试。并将调试截图进行备份 save_debug_creenshot(ts, im, piece_x, piece_y, board_x, board_y) backup_screenshot(ts) # 为了保证截图的时候应落稳了,多延迟一会儿 time.sleep(random.uniform(1, 1.1))
通过adb下发截图命令,并将截图拷贝回PC,这里直接使用了adb命令,不多解释。
def pull_screenshot(): os.system('del autojump.png') os.system('adb shell screencap -p /sdcard/autojump.png') os.system('adb pull /sdcard/autojump.png .')
计算坐标
find_piece_and_board函数为核心代码,这里主要做了两件事情:一是计算棋子的位置;二是计算下一个棋盘的位置。下面挑主要代码说。
1.查找棋子的位置坐标
#这里是在简单地查找下范围,其实不加也行,但是将整个屏幕遍历一遍太浪费时间,作者做了两件事情#1.先查找屏幕1/3~2/3范围,自上而下#2.查找与背景颜色不同的点就停止,说明从这个高度开始下面的像素点可能就是棋子或底座for i in range(int(h / 3), int( h*2 /3 ), 50): last_pixel = im_pixel[0,i] for j in range(1, w): pixel=im_pixel[j,i] #不是纯色的线,则记录scan_start_y的值,准备跳出循环 #pixel数组中的0 1 2分别是RGB三色值,只要存在一个不相同说明该点不是背景颜色 if pixel[0] != last_pixel[0] or pixel[1] != last_pixel[1] or pixel[2] != last_pixel[2]: #向上退回50个像素,以免上面的这个高度不是最上面的不同像素点 scan_start_y = i - 50 break #跳出循环 if scan_start_y: break #作者开始接着上面的点自上而下详细遍历 # 从scan_start_y开始往下扫描,棋子应位于屏幕上半部分,这里暂定不超过2/3 for i in range(scan_start_y, int(h * 2 / 3)): # 横坐标去除一定的边界,然后开始遍历,节省了一部分时间 for j in range(scan_x_border, w - scan_x_border): #取出该坐标上的坐标点 pixel = im_pixel[j,i] #这里是查找棋子的最低一行,根据颜色进行判别,RGB的范围作者是事先取好的 # 根据棋子的最低行的颜色判断,找最后一行那些点的平均值,这个颜色这样应该 OK,暂时不提出来 if (50 < pixel[0] < 60) and (53 < pixel[1] < 63) and (95 < pixel[2] < 110): #像素点的横坐标值之和,因为棋子是对称的,这些横坐标的平均值就是棋子的中心位置 piece_x_sum += j piece_x_c += 1 #棋子最低点所处的位置 piece_y_max = max(i, piece_y_max) #如果其中有一个为0,则直接返回异常 if not all((piece_x_sum, piece_x_c)): return 0, 0, 0, 0 #平均得到棋子的横坐标 piece_x = piece_x_sum / piece_x_c #棋子的最低点并不是棋子所在的中心位置,需要补偿一定的值,这个值就是棋子底盘的高度一半 piece_y = piece_y_max - piece_base_height_1_2
2.查找下一跳底盘的坐标
#同样,查找缩小查找范围,只查找屏幕1/3~2/3范围之内的 for i in range(int(h / 3), int(h * 2 / 3)): #取边界上的坐标作为上一次坐标初始值。该变量的作用是判断像素是否变化,如果变化则进入了底座像素 last_pixel = im_pixel[0, i] #如果计算得到了坐标,跳出循环 if board_x or board_y: break #与查找棋子类型,底座也是对称的,则像素点横坐标的平均值就是底座的中心点 board_x_sum = 0 board_x_c = 0 #开始查找底座,横向扫描 for j in range(w): #取出一个像素点 pixel = im_pixel[j,i] # 修掉脑袋比下一个小格子还高的情况的 bug if abs(j - piece_x) < piece_body_width: continue #像素点的RGB值发生了变化,则说明进入了底座像素区域 # 修掉圆顶的时候一条线导致的小 bug,这个颜色判断应该 OK,暂时不提出来 if abs(pixel[0] - last_pixel[0]) + abs(pixel[1] - last_pixel[1]) + abs(pixel[2] - last_pixel[2]) > 10: board_x_sum += j board_x_c += 1 #计算底座的横坐标 if board_x_sum: board_x = board_x_sum / board_x_c #下一个底座是在当前底座的30度方向,所以根据上面计算出的横坐标可以计算出底座的纵坐标 # 按实际的角度来算,找到接近下一个 board 中心的坐标 这里的角度应该是30°,值应该是tan 30°, math.sqrt(3) / 3 board_y = piece_y - abs(board_x - piece_x) * math.sqrt(3) / 3 #如果有一个值为空,返回异常 if not all((board_x, board_y)): return 0, 0, 0, 0
进行跳跃
知道当前坐标和下一跳的坐标,则可以计算出两点间的距离。
math.sqrt((board_x - piece_x) ** 2 + (board_y - piece_y) ** 2)
然后将该值传给跳跃函数即可
#该函数由距离根据经验值计算出按压时间def jump(distance): press_time = distance * press_coefficient press_time = max(press_time, 200) # 设置 200 ms 是最小的按压时间 press_time = int(press_time) #通过adb传输模拟按压命令 cmd = 'adb shell input swipe {x1} {y1} {x2} {y2} {duration}'.format( x1=swipe['x1'], y1=swipe['y1'], x2=swipe['x2'], y2=swipe['y2'], duration=press_time ) print(cmd) os.system(cmd)
以上是"安卓版本微信跳一跳自动执行代码的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
棋子
位置
坐标
像素
底座
截图
横坐标
代码
命令
时间
屏幕
范围
颜色
最低
函数
就是
面的
循环
安卓
作者
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全的五个小故事
信息安全工程网络安全总市值
数据库随机数函数
软件开发项目规划设计流程
服务器ping的通打不开
比较三个数据库
aaa服务器的作用
人民日报军地网络安全
网络技术的风险有哪些
服务器每天正常关机
治超站终端服务器
软件开发龙哥评论
互联网聚焦it科技
邮政软件开发与大数据维护
数据资源中心基础数据库
蓝思网络技术有限公司营业额
数据库表的多表查询实验总结
软件开发网络培训
服务器内部错误通知管理员
网络安全员证书报考条件
数据库书大专
大兴区网络安全警察
最后一个网络服务器是哪个
阿修罗山东互联网科技有限公司
缓存服务器管理
服务器换了公网变变慢了
工信部负责统筹协调网络安全工作
有没有自己的工业软件开发公司
软件开发的日常工作
网络安全为人民体会