最近把法环的一周目打通了,想去双人老妪那把锻造石都囤一囤,下周目不想再找灵珠了,可这时候卢恩又是个大问题了,我哪里来这么多钱呢。贴心的宫崎英高为我们贴心地想到了这一点,在我们打通一周目后就将银行卡双手奉上——神躯化剑。让我们能够在蒙格温银行自由自在地提款,不得不感谢蒙格行长对我们艾尔登之王事业的大力支持。
银行卡的问题解决了,接下来只需要手动前往蒙格温一行一遍又一遍地刷银行卡了。那懒人突然有疑问了:一遍一遍刷也要刷很久才能刷够卢恩,而且手动一遍一遍刷也太无聊了,有没有办法可以自动刷呢?
由此诞生了一个想法,何不写一个脚本,让脚本控制银行卡让它自己去银行提款呢,于是我写下了这么一个脚本:
首先是先要搞清楚怎么才能让电脑控制我们的人物行走,需要用到python库“pynput”——打开cmd命令行输入以下命令:
pip install pynput
pynput库提供了强大的功能,能让python模拟对键盘鼠标的控制,同时还能监控其行动。
首先将控制人物移动代码贴出来:由于我们需要一直刷魂,所以刷魂的控制逻辑一定要在死循环里面,同时我们还要为之后的关闭、重启功能留后路,所以用一个全局 running 变量来控制脚本是否运行。
from pynput import keyboard
import time
global running #标识脚本运行状态
while True:
if running:
# 吃黄金角币
keyboard.Controller().press('r')
time.sleep(3)
keyboard.Controller().release('r')
# 控制移动
keyboard.Controller().press('w')
time.sleep(3)
keyboard.Controller().release('w')
keyboard.Controller().press('a')
time.sleep(0.8)
keyboard.Controller().release('a')
keyboard.Controller().press('w')
time.sleep(2.25)
keyboard.Controller().release('w')
# 黄金波动!
keyboard.Controller().press(keyboard.Key.ctrl)
time.sleep(0.1)
keyboard.Controller().release(keyboard.Key.ctrl)
time.sleep(2.5)
# 重新传送
keyboard.Controller().press('g')
time.sleep(0.1)
keyboard.Controller().release('g')
time.sleep(0.8)
keyboard.Controller().press('f')
time.sleep(0.1)
keyboard.Controller().release('f')
time.sleep(0.1)
keyboard.Controller().press('e')
time.sleep(0.1)
keyboard.Controller().release('e')
time.sleep(2.5)
keyboard.Controller().press('e')
time.sleep(0.1)
keyboard.Controller().release('e')
# 传送读条
time.sleep(7)
else:
time.sleep(0.1)
这一部分结束之后如果没有别的需求,只需要点击运行代码后迅速切换到法环的进程(提前传送到通往王朝路上的赐福点,同时右手装备神躯化剑)即可。
那么我们想的深一点,如果我们想做一个开关比如说“win+n”控制脚本的开关,当我们刷够了,我们就按一下关掉脚本,再按一下脚本再次运行。这个时候我们就需要用到keyboard中监控功能了:
创建一个监听器,需要实例化
keyboard.Listener
类,并传递回调函数作为参数。以下是创建监听器的基本语法:
listener = keyboard.Listener(
on_press=None, # 按键按下时的回调函数
on_release=None, # 按键释放时的回调函数
suppress=False # 是否抑制事件的默认行为
)
我们在下面定义了两个回调函数,一个是监听我们是否按下了“win”键的on_press,一个是监听我们是否按下了"n"的on_press_n
第一个回调函数on_press:当我们按下win时,那么代码接下来会创建一个
keyboard.Listener
对象也就是监听器,并进入了一个上下文管理器。on_press=on_press_n
参数指定了当有按键被按下时应该调用的回调函数是on_press_n,
如果此时我们一直按住win,那么程序就会被挂起。
第二个回调on_press_n:当我们按下n,切换脚本运行状态,并且打印此时运行状态,同时停止监听。
最后我们将监听器实例化
def on_press(key):
global running #表示能在函数中修改该全局变量
try:
if key == keyboard.Key.cmd_l or key == keyboard.Key.cmd_r:
# 按下Win键时,监听下一次按键是否是'n'
with keyboard.Listener(on_press=on_press_n) as listener:
listener.join()
except AttributeError:
pass
def on_press_n(key):
global running
try:
if key.char == 'n':
running = not running
if running:
print('Started')
else:
print('Stopped')
except AttributeError:
pass
return False # 停止当前监听器
# 创建监听器
listener = keyboard.Listener(on_press=on_press)
listener.start()
print('Press Win+N to start/stop the loop')
最后就是创建一个系统托盘用以标识我们的脚本是否运行中:此时需要用到新的python库,,因为icon.run()会阻断后续代码的运行,所以我们需要多线程运行他。
import pystray
import PIL.Image
import threading
#加载系统托盘图标
image=PIL.Image.open("ER2.ico")
#系统托盘定义
def on_clicked(icon,item):
global running
if str(item)=="Say Hello":
print("HelloWorld")
elif str(item)=="Exit!":
running = False
icon.stop()
os._exit(0)
#创建系统托盘
def setup_tray_icon():
icon=pystray.Icon("Nude",image,menu=pystray.Menu(
pystray.MenuItem("Say Hello",on_clicked),
pystray.MenuItem("Exit!",on_clicked)
))
icon.run()
# 在单独的线程中运行托盘图标
tray_thread = threading.Thread(target=setup_tray_icon)
tray_thread.daemon = True
tray_thread.start()
所以我们最后的代码就是这样子:
import time
from pynput import keyboard
import pystray
import PIL.Image
import threading
import os
#加载系统托盘图标
image=PIL.Image.open("ER2.ico")
# 初始化控制变量
running = False
#系统托盘定义
def on_clicked(icon,item):
global running
if str(item)=="Say Hello":
print("HelloWorld")
elif str(item)=="Exit!":
running = False
icon.stop()
os._exit(0)
#创建系统托盘
def setup_tray_icon():
icon=pystray.Icon("Nude",image,menu=pystray.Menu(
pystray.MenuItem("Say Hello",on_clicked),
pystray.MenuItem("Exit!",on_clicked)
))
icon.run()
# 在单独的线程中运行托盘图标
tray_thread = threading.Thread(target=setup_tray_icon)
tray_thread.daemon = True
tray_thread.start()
def on_press(key):
global running
try:
if key == keyboard.Key.cmd_l or key == keyboard.Key.cmd_r:
# 按下Win键时,监听下一次按键是否是'n'
with keyboard.Listener(on_press=on_press_n) as listener:
listener.join()
except AttributeError:
pass
def on_press_n(key):
global running
try:
if key.char == 'n':
running = not running
if running:
print('Started')
else:
print('Stopped')
except AttributeError:
pass
return False # 停止当前监听器
# 创建监听器
listener = keyboard.Listener(on_press=on_press)
listener.start()
print('Press Win+N to start/stop the loop')
while True:
if running:
# 吃黄金角币
keyboard.Controller().press('r')
time.sleep(3)
keyboard.Controller().release('r')
# 控制移动
keyboard.Controller().press('w')
time.sleep(3)
keyboard.Controller().release('w')
keyboard.Controller().press('a')
time.sleep(0.8)
keyboard.Controller().release('a')
keyboard.Controller().press('w')
time.sleep(2.25)
keyboard.Controller().release('w')
# 黄金波动!
keyboard.Controller().press(keyboard.Key.ctrl)
time.sleep(0.1)
keyboard.Controller().release(keyboard.Key.ctrl)
time.sleep(2.5)
# 重新传送
keyboard.Controller().press('g')
time.sleep(0.1)
keyboard.Controller().release('g')
time.sleep(0.8)
keyboard.Controller().press('f')
time.sleep(0.1)
keyboard.Controller().release('f')
time.sleep(0.1)
keyboard.Controller().press('e')
time.sleep(0.1)
keyboard.Controller().release('e')
time.sleep(2.5)
keyboard.Controller().press('e')
time.sleep(0.1)
keyboard.Controller().release('e')
# 传送读条
time.sleep(7)
else:
time.sleep(0.1)
最后有条件可以打包成exe就直接可以迁移到别的电脑用了。