(坑)Rabbit 一个使用 Lua、Python 的 按键精灵 替代品
该项目源码能够在我的github上找到。 [url]https://github.com/yangyuan/rabbit[/url]
Rabbit
定位
我对 Rabbit 的定位是个 按键精灵 替代品。由于经常写一些自动脚本,对按键精灵这种软件有一定需求。 按键精灵功能有限,广告多,兼容性等问题,使用 VB 写复杂逻辑也有点不顺手,使得我有时候不得不自己直接用 C++ 或者 C# 写程序。 自己写程序,每次编译比较麻烦,每个脚本要弄个工程也略夸张,所以搞了 Rabbit。
选型
Rabbit 默认支持 Lua 和 Python 两种脚本语言,使用同一套库(rabbit)进行编程。 Rabbit 目前只支持命令行模式,在这个项目表现出自己的价值之前,不准备做界面。 默认监控 F7、F8 分别触发执行脚本和终止脚本。 main.cpp 为 Rabbit 的入口,可自定义配置。
rabbit module
Rabbit 的内置模块名为 rabbit,调用语法如 rabbit.keypress(‘1’) rabbit.sleep(1000) rabbit.moveto(x, y) rabbit.click() rabbit.rightclick() 相关细节请参考[url]./post.php?id=1075[/url]
为什么不
为什么不写成 Python 模块,直接用 Python 执行?
直接 Python 执行需要处理好一些 Windows 特有的行为,如消息循环。这些代码属于重复的,但是又是必须的。如果一个 Python 程序员能够处理好这些东西,那他完全可以利用 ctype 直接调用 Windows API 执行 SendInput 等行为,也没必要用 Rabbit。 此外,还有 Lua 呢。 此外,Windows API 的设计,是从操作系统的角度提供接口。Rabbit 是从人的角度封装基本的 API,实现了人的输入操作(如单击、双击、敲击键盘),以及一些视觉查找行为(找窗口,找按钮,找色,找图)。会有一些辅助的 API 但都是以人的行为封装。
[!code=python]
附录
Python 版本的魔兽世界钓鱼脚本 # 等一秒,喘口气 rabbit.sleep(1000)
while True:
# 按 '1' 开始钓鱼,记得把钓鱼技能拖到 1。
rabbit.keypress('1')
# 找鱼漂,1.5 秒留给动画,会有个渐变。
rabbit.sleep(1500)
# 通过颜色 0x993326 找,查找起始点 (220,90),范围 (850,350),容错度 0.5。
# 这个范围和颜色根据实际需要调整。 反正 1280*800 + 淡蓝色调地图 运转非常好。
x, y = rabbit.findcolor(0x993326, 220, 90, 850, 350, 0, 0.5)
if x < 0 or y < 0:
# 没找到,重来。
continue;
# 鼠标移过去,看看是不是鱼钩的图标
rabbit.moveto(x, y)
rabbit.sleep(100)
# 取得鼠标图标的采样值,从理论上讲不是唯一,概率上讲唯一。2113134769、1364804655 都是事先取好的。
cursor = rabbit.get_cursor_hash()
if cursor != 2113134769:
# 竟然不是鱼钩图标
continue;
# 接下来原理比较特别,利用 WOW 钓鱼动画的特点捕捉鱼上钩事件。
# 鱼上钩时,整体鱼泡会下沉一次,假如鼠标刚好放到鱼钩下面,那么图标就会变化。
# 寻找鱼泡下面的很近的位置(循环减速查找,姑且认为你的魔兽鱼钩图标不超过1024像素。。。。)
# 向下移动鼠标
for i in range(0, 1024):
rabbit.sleep(15)
rabbit.moveto(x, y+i)
cursor = rabbit.get_cursor_hash()
if cursor == 1364804655:
y = y+i
break
# 向上移动鼠标
for i in range(0, 1024):
rabbit.sleep(45)
rabbit.moveto(x, y-i)
cursor = rabbit.get_cursor_hash()
if cursor == 2113134769:
y = y-i
break
# 再向下移动鼠标
for i in range(0, 1024):
rabbit.sleep(75)
rabbit.moveto(x, y+i)
cursor = rabbit.get_cursor_hash()
if cursor == 1364804655:
y = y+i
break
# 找到了合适的位置,鼠标移过去。
rabbit.moveto(x, y)
# 等鱼上钩,等待不超过 22 秒。
for i in range(0, 220):
rabbit.sleep(100)
cursor = rabbit.get_cursor_hash()
if cursor == 2113134769:
# 上钩了!
rabbit.rightclick()
rabbit.sleep(2000)
# 重钓
break