(坑)Rabbit 一个使用 Lua、Python 的 按键精灵 替代品

Written on December 4, 2014 View on GitHub

该项目源码能够在我的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