Python实现自动挂机脚本(基础篇)

本文介绍了一个针对阴阳师游戏的自动挂机脚本,包括基础的鼠标操作、识别图像及判断游戏状态等核心功能,并提供了完整的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客原文【不好吃の蛋蛋】
完整代码

不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然很想尝试着写个脚本挂机,话不多说进入正题。

简单的鼠标操作

游戏挂机脚本,无非就是自动移动鼠标,自动点击,进行重复操作,所以,第一步就是如何控制鼠标

import win32api
import time
def move_click(x, y, t=0):  # 移动鼠标并点击左键
    win32api.SetCursorPos((x, y))  # 设置鼠标位置(x, y)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN |
                         win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)  # 点击鼠标左键
    if t == 0:
        time.sleep(random.random()*2+1)  # sleep一下
    else:
        time.sleep(t)
    return 0

# 测试
move_click(30, 30)

当然,再后续操作中你可能需要获取屏幕分辨率,我只打算让脚本能在自己电脑上跑就满足了,所以没有实现适配不同分辨率

def resolution():  # 获取屏幕分辨率
    return win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)

值得注意的是,一定要在管理员权限下的cmd中运行,否则点击无效

这个时候,你已经可以写个while循环,不停地点击屏幕上不同的几个点了,最基础的挂机脚本就实现了

使用PIL识别图像

我们肯定不满足于机械式的连续点击,万一被封号呢…
所以需要识别图像,再进行点击
首先,就需要定位到阴阳师的窗口

import win32gui
def get_window_info():  # 获取阴阳师窗口信息
    wdname = u'阴阳师-网易游戏'
    handle = win32gui.FindWindow(0, wdname)  # 获取窗口句柄
    if handle == 0:
        # text.insert('end', '小轩提示:请打开PC端阴阳师\n')
        # text.see('end')  # 自动显示底部
        return None
    else:
        return win32gui.GetWindowRect(handle)

get_window_info()函数返回阴阳师窗口信息(x1, y1, x2, y2),(x1, y1)是窗口左上角的坐标,(x2, y2)是窗口右下角的坐标,代码中的text可以暂时忽略,这在后续GUI界面中用于输出提示信息。
下面使用PIL获取游戏截图

def get_posx(x, window_size):  # 返回x相对坐标
    return (window_size[2] - window_size[0]) * x / 870


def get_posy(y, window_size):  # 返回y相对坐标
    return (window_size[3] - window_size[1]) * y / 520

topx, topy = window_size[0], window_size[1]
img_ready = ImageGrab.grab((topx + get_posx(500, window_size), topy + get_posy(480, window_size),
                            topx + get_posx(540, window_size), topy + get_posy(500, window_size)))
# 查看图片
im_ready.show()

考虑到窗口大小不同,位置会有所偏移,这里使用屏幕上点的相对位置
获取到关键位置的截图之后,计算图片的hash值

def get_hash(img):
    img = img.resize((16, 16), Image.ANTIALIAS).convert('L')  # 抗锯齿 灰度
    avg = sum(list(img.getdata())) / 256  # 计算像素平均值
    s = ''.join(map(lambda i: '0' if i < avg else '1', img.getdata()))  # 每个像素进行比对,大于avg为1,反之为0
    return ''.join(map(lambda j: '%x' % int(s[j:j+4], 2), range(0, 256, 4)))

将关键位置截图的hash值保存下来,下次脚本运行时,将截图hash值与原始hash值进行比对,判断是否相似。
这里使用汉明距离进行计算,比较hash值中相同位置上不同元素的个数

def hamming(hash1, hash2, n=20):
    b = False
    assert len(hash1) == len(hash2)
    if sum(ch1 != ch2 for ch1, ch2 in zip(hash1, hash2)) < n:
        b = True
    return b

准备工作做完了,下面就可以开心刷御灵了

def yu_ling(window_size):
    global is_start
    topx, topy = window_size[0], window_size[1]
    state = []

    while is_start:
        # print 'start'
        # text.insert('end', 'start')
        time.sleep(0.5)
        img_ready = ImageGrab.grab((topx + get_posx(750, window_size), topy + get_posy(465, window_size),
                                    topx + get_posx(840, window_size), topy + get_posy(500, window_size)))
        if hamming(get_hash(img_ready), ready_hash, 10):
            state.append(0)
            move_click(topx + get_posx(740, window_size), topy + get_posy(380, window_size))
            text.insert('end', strftime('%H:%M:%S', localtime()) + ' 点击准备\n')
            text.see('end')  # 自动显示底部
            time.sleep(15)
            continue

        img_success = ImageGrab.grab((topx + get_posx(400, window_size), topy + get_posy(320, window_size),
                                      topx + get_posx(470, window_size), topy + get_posy(400, window_size)))
        if hamming(get_hash(img_success), success_hash):
            time.sleep(2)
            state.append(1)
            text.insert('end', strftime('%H:%M:%S', localtime()) + ' 成功%d次\n' % state.count(1))
            text.see('end')  # 自动显示底部
            move_click(topx + get_posx(730, window_size), topy + get_posy(380, window_size))
            continue

        img_fail = ImageGrab.grab((topx + get_posx(560, window_size), topy + get_posy(340, window_size),
                                   topx + get_posx(610, window_size), topy + get_posy(390, window_size)))
        if hamming(get_hash(img_fail), fail_hash):
            time.sleep(2)
            state.append(2)
            text.insert('end', strftime('%H:%M:%S', localtime()) + ' 失败%d次\n' % state.count(2))
            text.see('end')  # 自动显示底部
            move_click(topx + get_posx(720, window_size), topy + get_posy(380, window_size))
            continue

        img_attack = ImageGrab.grab((topx + get_posx(615, window_size), topy + get_posy(350, window_size),
                                     topx + get_posx(675, window_size), topy + get_posy(375, window_size)))
        if hamming(get_hash(img_attack), yu_attack_hash):
            move_click(topx + get_posx(670, window_size), topy + get_posy(365, window_size))
            text.insert('end', strftime('%H:%M:%S', localtime()) + ' 点击进攻\n')
            text.see('end')  # 自动显示底部
            state.append(3)
            if state[-6:] == [3]*6:
                text.insert('end', strftime('%H:%M:%S', localtime()) + ' 痴汉券可能不够了\n')
                text.see('end')  # 自动显示底部
                click()
                break
            continue

至此,我们已经可以通过管理员cmd运行脚本了
Python实现自动挂机脚本(GUI & 打包)我们还可以为脚本设计GUI界面并打包成.exe文件

<think>好的,用户之前问过关于学习《魔力宝贝》端游脚本制作的问题,现在又问“Python是一个什么软件”。需要先理解用户可能的背景和需求。 用户之前对游戏脚本制作感兴趣,可能有一定的编程需求,但可能还是新手,对Python不太了解。现在他想知道Python是什么,可能是为了进一步学习脚本制作做准备。 首先,需要明确Python不是软件,而是一种编程语言,这点很重要,避免误解。接下来要解释Python的特点,比如简单易学、跨平台、丰富的库,这些对于游戏脚本开发很有帮助。 然后要联系他之前的兴趣,说明Python自动脚本游戏开发中的应用,比如用PyAutoGUI模拟操作,Pygame做小游戏,或者使用OpenCV进行图像识别,这些都是他可能用到的方面。 还要考虑到用户可能的后续问题,比如如何安装Python,推荐学习资源,或者具体的库的使用。所以在回答中需要简明扼要地涵盖这些点,同时保持结构清晰,便于用户理解。 另外,用户之前的问题涉及到法律和道德提醒,所以在介绍Python时,可以适当提醒合法使用,呼应之前的回答,保持一致性。 最后,确保用中文口语化,避免专业术语过多,但又要准确,比如解释解释型语言时,用“边翻译边执行”这样的比喻,帮助用户理解。 总结下来,回答的结构应该是:定义Python,核心特点,应用场景,结合用户需求的具体例子,学习建议,以及合法提醒。这样既解答了当前问题,又连接了之前的上下文,提供实用信息。</think>#### Python 是什么? **Python** 是一种**高级编程语言**(并非软件),由 Guido van Rossum 于 1991 年创建。它以简洁的语法和强大的功能著称,被广泛应用于多个领域,以下是其核心特点: --- #### 一、核心特性 1. **易学易用** - 语法接近自然语言,例如输出文字仅需: ```python print("你好,世界!") ``` - 强制缩进规则(用 `空格/制表符` 控制代码结构)天然提升代码可读性 2. **跨平台运行** - 支持 Windows/macOS/Linux 等系统 - 一次编写代码,多平台无需修改直接运行 3. **丰富的生态系统** - 拥有超过 30 万第三方库(截至 2023 年),涵盖: $$ \text{数据分析} \rightarrow \text{人工智能} \rightarrow \text{网络开发} \rightarrow \text{自动脚本} $$ --- #### 二、典型应用场景 | 领域 | 具体应用 | 常用工具库 | |-------------------|-----------------------------------|---------------------| | **自动化办公** | 批量处理 Excel/PDF/邮件 | `openpyxl`, `PyPDF2`| | **网络爬虫** | 抓取网页数据 | `Requests`, `Scrapy`| | **游戏开发** | 开发 2D 游戏或辅助脚本 | `Pygame`, `pyautogui`| | **人工智能** | 机器学习/深度学习模型开发 | `TensorFlow`, `PyTorch`| --- #### 三、与游戏脚本开发的关系 1. **自动化操作实现** - 通过 `pyautogui` 库控制鼠标键盘(适用于简单挂机脚本): ```python import pyautogui pyautogui.moveTo(100, 200) # 移动鼠标到坐标(100,200) ``` - 通过 `OpenCV` 实现图像识别(需搭配反反作弊措施) 2. **开发优势与局限** - ✅ 开发速度快,适合快速验证脚本逻辑 - ❌ 执行效率低于 C++,且易被游戏保护系统检测 --- #### 四、学习建议 1. **安装环境** - 官网下载安装包:https://www.python.org - 推荐使用 `VSCode` 或 `PyCharm` 作为代码编辑器 2. **学习路径** ```mermaid graph LR A[基础语法] --> B[函数与模块] --> C[面向对象编程] --> D[第三方库实战] ``` 3. **免费资源推荐** - 入门教程:菜鸟教程 Python - 实战项目:GitHub 搜索 "python-game-bot" - 进阶书籍:《流畅的 Python》 --- > **注意**:使用 Python 开发游戏脚本需遵守游戏用户协议,技术应服务于合法用途(如开发单机游戏或学习研究)。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值