在知乎上看到 使用 Python 控制自己的电脑和键盘是一种什么样的体验? 里面介绍的 pyautogui,于是在 pyautogui 官网 上查了一下,因为挺有趣的特此记录:
可以用来写一个 LOL 打人机拿首胜的脚本 0.0
安装 pyautogui pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple
持续获取鼠标位置的示例 1 2 3 4 5 6 7 8 9 10 11 import pyautogui as pgprint('Press Ctrl+C to quit.' ) try : while True : x,y = pg.position() positionStr = 'X: ' +str(x).rjust(4 )+ ' Y: ' +str(y).rjust(4 ) print(positionStr, end = '' ) print('\b' * len(positionStr), end ='' , flush = True ) except KeyboardInterrupt: print('\n' )
退格 \b
也太好玩了
唯一新的东西就是 pg.position()
来获取鼠标位置
常用函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import pg as pgpg.PAUSE = 1 pg.move(x,y,duration = num_seconds) pg.moveTo(x, y, duration=num_seconds) pg.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left' ) pg.doubleClick(x=moveToX, y=moveToY) pg.mouseDown(x=moveToX, y=moveToY, button='left' ) pg.mouseUp(x=moveToX, y=moveToY, button='left' ) pg.dragTo(x, y, duration=num_seconds) pg.drag(x,, duration=num_seconds) pg.keyDown('alt' ) pg.press('tab' ) pg.press('tab' ) pg.keyUp('alt' ) pg.keyDown('shift' ) pg.press(['left' ]*3 ) pg.keyUp('shift' ) pg.hotkey('ctrl' ,'c' ) pg.hotkey('ctrl' ,'v' ) pg.moveTo(360 ,52 ) pg.click() pg.write('dna049.com' ,interval = 0.2 ) pg.press('enter' ) pg.alert(text='' , title='' , button='OK' ) pg.confirm(text='' , title='' , buttons=['OK' , 'Cancel' ]) pg.prompt(text='' , title='' , default='' ) pg.password(text='' , title='' , default='' , mask='*' )
挂机玩 LOL (上述 pyautogui 被弃用了) 很遗憾,LOL 拦截了虚拟键盘操作(包括 pyautogui pywin32
)
按键盒子 貌似可以解决(没试过)。最后我们需要驱动级的模拟按键:pywinio
键盘操作 用pip install keyboard
: keyboard 示例 。
鼠标操作 用pip install mouse
: mouse 示例
mouse keyboard
两个项目是同一个人创建的,并且带有按键监听功能,持续更新,十分推荐。它的使用 github 上有,直接下面代码也能看懂。
设计者需要考虑
买装备 (装备栏要注意固定)
选择路线 (上中下随机,根据时间去具体的点)
如何攻击 (乱打)
何时回城
使用者操作步骤
打开英雄联盟 训练模式或简单人机,选好英雄(建议寒冰)
所有的东西恢复默认设置,装备栏左上角对齐
在命令行执行 py lolAuto.py
切到游戏界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 import keyboard as kb import mouse as msfrom time import sleepfrom datetime import datetimefrom random import choicefrom random import randintimport osdef buyequipment (flag = True) : sleep(1 ) kb.send('p' ) sleep(0.5 ) if (flag): for i in range(4 ): for j in range(3 ): ms.move(196 -65 *j,695 -125 *i) ms.double_click() sleep(0.12 ) else : ms.move(64 ,192 ) ms.double_click() sleep(0.5 ) sleep(0.5 ) kb.send('p' ) def attack () : kb.send('a' ) sleep(0.2 ) ms.click() sleep(0.2 ) def skill () : kb.send(choice('qwer' )) ms.click() def upgradeskill () : kb.press('ctrl' ) skill() kb.release('ctrl' ) def infield (road, direc) : x,y = road[0 ][direc] ms.move(x,y,True ,0.2 ) sleep(0.2 ) ms.click('right' ) kb.press('space' ) sleep(28 ) if (direc != 'mid' ): sleep(6 ) kb.release('space' ) def myexit (event) : if (event.name == 'k' ): os._exit(1 ) try : print('Welcome lolAuto designed by dna049' ) print('请先打开 LOL 进入游戏,恢复默认设置,\n 然后把买装备的界面左上角对齐 \n 再打开次应用' ) print('按 k 键 结束!' ) kb.hook(myexit) sleep(10 ) road = [{'top' :[1687 ,857 ],'mid' :[1776 ,944 ],'ad' :[1864 ,1034 ]}] ms.click('right' ) kb.send('space' ) ms.move(960 ,540 ) ms.click('right' ) buyequipment(False ) sleep(1 ) direc = choice(['top' ,'mid' ,'ad' ]) infield(road,direc) start = timeB = timeE = timeS = datetime.now() sleep(50 ) while True : kb.press('space' ) x = 1920 + randint(-150 ,150 ) y = 1080 + randint(-80 ,80 ) ms.move(x//2 ,y//2 ,True ,0.2 ) sleep(0.2 ) kb.release('space' ) attack() if ((datetime.now()-timeS).seconds > 5 ): skill() timeS = datetime.now() sleep(0.5 ) if ((datetime.now()-timeE).seconds > 30 ): upgradeskill();upgradeskill() timeE = datetime.now() ms.move(road[0 ][direc][0 ],road[0 ][direc][1 ]) sleep(0.2 ) ms.click('right' ) sleep(4 ) if ((datetime.now()-timeB).seconds > 240 ): kb.send('s' ) kb.send('b' ) kb.sleep(8 ) buyequipment() timeB = datetime.now() infield(road,direc) sleep(0.5 ) except : print('Bye lolAuto designed by dna049' )
因为没法知道自己在哪,所以写的很捞。还有就是这是全局的鼠标键盘操作,而不是针对 LOL 的,哎就这样吧。
pywinio 安装和使用 由于 pywinio 安装和使用贼搞人,在此写一下教程,先去 这里 下载源码,然后解压到:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-packages
打开 cmd 进入上述目录,依次安装 requirements_dev.txt 中的依赖包,然后 pip install -e ./pywinio-master
就安装成功了。
使用 : 如果是 64 位操作系统(基本都是吧),管理员身份输入:
bcdedit.exe /set TESTSIGNING ON
1 2 3 import pywiniog_winio = pywinio.WinIO() print(g_winio.get_port_byte(0xA07 ))
运行上述代码,如果报错,可参考 这里
好不容易安装好了,然后我也不会用,后来也没用了,辣鸡…