用 Python 从零开始玩微信跳一跳
时间:2022-04-26
本文章向大家介绍用 Python 从零开始玩微信跳一跳,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关注 Python 的人想必都知道 跳一跳辅助外挂 这个项目近来在 Github 上火得不行,相信不少人也可能尝试过一番,并暗暗叹息,为什么我一开始就没有这个好想法呢!
现在,参照外挂项目的源码,我们就从零开始来自己动手写一个手动版本的跳一跳外挂。
思路:
1、利用 adb 命令先把跳一跳截图保留至本地
2、通过点击图上两个坐标点,算出两点之间的距离(勾股定理),最后得出按压屏幕3的时间。
3、通过 adb 命令执行按压屏幕操作
4、重复 1 - 3
思路已经有了,就可以动手开码了。不过要先安装好 adb 环境,至于怎么配置安装,Google it!无非就是下载安装 adb 驱动,并设置好环境变量而已!
先把后面需要的库引进来
import os
import math
# 这两个库用于图片的操作
import matplotlib.pyplot as plt
from PIL import Image
新建 WechatJump 类,并进行初始化操作
class WechatJump:
def __init__(self):
# 按压系数,不同分辨率的手机需要做调整
self._coefficient = 1.35
# 记录按压次数
self._click_count = 0
# 记录点击点坐标的数组
self._coords = []
首先需要保存图片至本地
def generate_screenshot(self):
# 截图,并将图片保存为 /sdcard/screenshot.png
os.system('adb shell screencap -p /sdcard/screenshot.png')
# pull 命令是将图片从手机发送到电脑本地
os.system('adb pull /sdcard/screenshot.png .')
点击图片坐标点
# event 是点击事件def on_click(self, event):
# event.xdata, event.ydata 分别是点击的横纵坐标,将坐标依次保存到 _coords 数组中
self._coords.append((event.xdata, event.ydata))
# 这里是每两次点击(起始点和目标点)就会执行按压按压屏幕操作,所以当
# self._click_count == 2 时才执行
self._click_count += 1
if self._click_count == 2:
self._click_count = 0
# 弹出第二次点击时的坐标
_next = self._coords.pop()
# 弹出第一次点击时的坐标
_prev = self._coords.pop()
# 根据勾股定理计算出两点之间的距离
self.jump_to_next( math.sqrt((_next[0] - _prev[0]) ** 2 + (_next[1] - _prev[1]) ** 2))
先点击 1 号点,再点击 2 好点即可。按压屏幕,执行跳跃操作
def jump_to_next(self, distance):
press_time = int(distance * self._coefficient)
# cmd 最后一个参数 press_time 为按压时间,按压时间为 距离x按压系数,至于按压系数是
# 多少则要根据每个人的手机分辨率而定,可自行测试调整
# 100 100 200 200 这四个数字其实无所谓,只是模拟 swipe 操作时的坐标点而已
cmd = 'adb shell input swipe 100 100 200 200 {}'.format(press_time)
print(cmd)
# 执行命令
os.system(cmd)
基本上函数已经完成了,最后整理一下,将 on_click 函数绑定到图片上,循环操作
def run(self):
# 循环执行操作
while True:
# 这里执行两次截图操作,不然会提示远程图片未找到的问题(可以注释其中一行试试看)
self.generate_screenshot()
self.generate_screenshot()
figure = plt.figure()
# 绑定 on_click 操作
figure.canvas.mpl_connect('button_press_event', self.on_click)
# 打开并显示图片
img = Image.open('screenshot.png')
plt.imshow(img)
plt.show()
最后,只需要运行 run 函数即可,参数调得好的话,落点可以说是非常准了。手动刷到个上千分完全没问题,只要你要耐心…..
wechat_jump = WechatJump()wechat_jump.run()
怎么样,是不是觉得其实也不难写出来。(其实原作者的第一版大概就长这样子)不过现在该项目,已经推出了自动跳跃的版本,兼容 iphone 的版本,甚至有大牛直接上了深度学习的版本!(有兴趣的同学可以阅读一下其源码,相信会有收获的。)不过这都是后来的事啦,总之一句话,想法才是最重要的!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java中的时间和日期(一):有关java时间的哪些坑
- Java中的时间和日期(二):java时间存储的基本原理
- 常用SQL语句
- Java中的时间和日期(三):java8中新的时间API介绍
- Java中的时间和日期(四):与java8时间API有关的一些总结和补充
- Head First设计模式——策略模式
- 可重用性的6个级别
- 您可能不需要使用Vue 3的Vuex
- 谈一谈若干的K-V NoSQL应用:LevelDB、Redis、Tair、RockesDB
- 高通量数据中批次效应的鉴定和处理(六)- 直接校正表达矩阵
- Go viper 配置文件读取工具
- spring security默认访问权限判定源码
- Springboot+mybatis最简单的增删改查写法
- Head First设计模式——观察者模式
- spring security oauth2 资源服务/客户端无法正确获取权限