【Elden Ring】艾尔登法环蒙格温银行刷钱脚本解析

        最近把法环的一周目打通了,想去双人老妪那把锻造石都囤一囤,下周目不想再找灵珠了,可这时候卢恩又是个大问题了,我哪里来这么多钱呢。贴心的宫崎英高为我们贴心地想到了这一点,在我们打通一周目后就将银行卡双手奉上——神躯化剑。让我们能够在蒙格温银行自由自在地提款,不得不感谢蒙格行长对我们艾尔登之王事业的大力支持。

        银行卡的问题解决了,接下来只需要手动前往蒙格温一行一遍又一遍地刷银行卡了。那懒人突然有疑问了:一遍一遍刷也要刷很久才能刷够卢恩,而且手动一遍一遍刷也太无聊了,有没有办法可以自动刷呢?

        由此诞生了一个想法,何不写一个脚本,让脚本控制银行卡让它自己去银行提款呢,于是我写下了这么一个脚本:

        首先是先要搞清楚怎么才能让电脑控制我们的人物行走,需要用到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就直接可以迁移到别的电脑用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值