在知乎上看到 使用 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
# getMousePosition.py
import pyautogui as pg
print('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 pg
pg.PAUSE = 1 # 每条语句相隔1s执行
# 鼠标操作
pg.move(x,y,duration = num_seconds) #相对移动
pg.moveTo(x, y, duration=num_seconds) #数秒内鼠标移动到(x,y)位置
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')

# messageBox
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 keyboardkeyboard 示例

鼠标操作 pip install mousemouse 示例

mouse keyboard 两个项目是同一个人创建的,并且带有按键监听功能,持续更新,十分推荐。它的使用 github 上有,直接下面代码也能看懂。

设计者需要考虑

  • 买装备 (装备栏要注意固定)
  • 选择路线 (上中下随机,根据时间去具体的点)
  • 如何攻击 (乱打)
  • 何时回城

使用者操作步骤

  1. 打开英雄联盟 训练模式或简单人机,选好英雄(建议寒冰)
  2. 所有的东西恢复默认设置,装备栏左上角对齐
  3. 在命令行执行 py lolAuto.py
  4. 切到游戏界面
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
# lolAuto.py
import keyboard as kb
import mouse as ms
from time import sleep
from datetime import datetime
from random import choice
from random import randint
import os

def 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应该随着时间改变的!
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 pywinio
g_winio = pywinio.WinIO()
print(g_winio.get_port_byte(0xA07))

运行上述代码,如果报错,可参考 这里

好不容易安装好了,然后我也不会用,后来也没用了,辣鸡…