外观
使用 Python 初步建立连点器
2097字约7分钟
用于 Egg
这类放置类或点击类游戏,确实有些玩家会用连点器来加快进度。
不过,有些游戏会检测到这种自动点击行为,可能存在封号风险。
一、用 PyAutoGUI 库模拟鼠标点击
下面是一个简单的代码示例:
import pyautogui
import time
# 等待3秒,给时间切换到游戏窗口
time.sleep(3)
# 连续点击100次,每次间隔0.05秒
for _ in range(100):
pyautogui.click()
time.sleep(0.05)
需要安装 PyAutoGUI:
pip install pyautogui
二、模拟点击指定屏幕位置
PyAutoGUI 默认的 click()
直接点击鼠标当前的位置,但你也可以指定屏幕坐标!
比如:
import pyautogui
import time
time.sleep(3) # 给你3秒时间切到游戏界面
for _ in range(100):
pyautogui.click(x=500, y=500) # 在屏幕 (500, 500) 坐标点击
time.sleep(0.05) # 控制点击间隔
怎么找到屏幕坐标?
你可以运行下面的代码,让鼠标悬停在目标位置,它会显示当前的坐标:
import pyautogui
print("请把鼠标放到目标位置,3秒后显示目标坐标")
pyautogui.sleep(3)
print("鼠标坐标是:", pyautogui.position())
进阶技巧:
如果你的游戏窗口可能会移动,还可以用 pyautogui.locateOnScreen()
让脚本自动找到按钮的位置!不过,这需要截图匹配,可能会稍微慢一点
import pyautogui
import time
# 读取按钮的图片
button_location = pyautogui.locateCenterOnScreen('button.png', confidence=0.8)
if button_location:
x, y = button_location
print(f"找到按钮,坐标:{x}, {y},开始点击喵!")
for _ in range(100):
pyautogui.click(x, y)
time.sleep(0.05)
else:
print("找不到按钮喵!检查一下截图是不是正确喵!😾")
总结:
- 直接点击当前鼠标位置:
pyautogui.click()
- 指定坐标点击:
pyautogui.click(x, y)
- 自动识别目标图片并点击:
locateOnScreen()
三、持续点击,使用快捷键暂停点击
你可以用 keyboard 库监听快捷键,实现开始/暂停点击!
🐾 代码示例:
import pyautogui
import keyboard
import time
clicking = False # 记录当前是否在点击
def toggle_clicking():
global clicking
clicking = not clicking # 切换点击状态
if clicking:
print("开始点击喵!😼")
else:
print("暂停点击喵~😼")
# 监听快捷键 "F6" 开始/暂停点击
keyboard.add_hotkey("F6", toggle_clicking)
print("按 F6 开始/暂停点击,按 ESC 退出喵~")
try:
while True:
if clicking:
pyautogui.click() # 执行点击
time.sleep(0.05) # 控制点击速度
time.sleep(0.01) # 避免 CPU 过载
except KeyboardInterrupt:
print("\n本公主帮你停掉脚本了喵!😼")
🐾 代码说明:
- 按
F6
开始/暂停,每次按都会切换状态 - 按
ESC
退出程序(你可以直接关闭窗口,也可以Ctrl+C
终止) - 点击间隔设为
0.05
秒,避免点击太快被检测 time.sleep(0.01)
让循环稍微休息一下,防止 CPU 占用过高
🐾 运行方式:
你需要先安装 keyboard 库:
pip install keyboard
然后运行脚本,按 F6
就可以无限点击了,再按 F6
就会暂停
😼 友情提醒:
- 这方法适用于 Egg, Inc. 这种休闲游戏,但用在别的地方可要小心
- 太快的连点可能会影响游戏体验,适当放慢点击频率
四、完整源代码
import pyautogui
import keyboard
import time
import threading
import sys
import logging
import psutil
pyautogui.FAILSAFE = True # 启用安全保护
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
class Clicker:
def __init__(self, min_interval=0.001, max_interval=1.0, default_interval=0.01):
self.clicking_event = threading.Event()
self.interval_lock = threading.Lock()
self.min_interval = min_interval
self.max_interval = max_interval
self.active_interval = default_interval
self.inactive_interval = 0.5 # 非活动检测间隔
def toggle_clicking(self):
""" 开启/暂停点击 """
if self.clicking_event.is_set():
self.clicking_event.clear()
logging.info("🛑 点击已暂停")
else:
self.clicking_event.set()
logging.info("▶️ 点击进行中")
def adjust_interval(self, delta):
""" 调整点击间隔 """
with self.interval_lock:
new_val = self.active_interval + delta
self.active_interval = max(self.min_interval, min(new_val, self.max_interval))
status = ""
if self.active_interval == self.min_interval:
status = " (极限速度)"
elif self.active_interval == self.max_interval:
status = " (最低速度)"
logging.info(f"⏱️ 当前间隔:{self.active_interval:.3f}秒{status}")
def increase_speed(self):
""" 加快点击速度 """
self.adjust_interval(-0.005)
def decrease_speed(self):
""" 减慢点击速度 """
self.adjust_interval(0.005)
def click_engine(self):
""" 点击主循环 """
while True:
if self.clicking_event.is_set():
try:
pyautogui.click()
time.sleep(self.active_interval)
except pyautogui.FailSafeException:
logging.warning("❌ 安全保护触发!鼠标移至屏幕左上角")
self.clicking_event.clear()
except Exception as e:
logging.error(f"⚠️ 点击异常:{e}")
self.clicking_event.clear()
else:
time.sleep(self.inactive_interval)
def resource_monitor(self):
""" 系统资源监控 """
while True:
if self.clicking_event.is_set():
cpu = psutil.cpu_percent()
mem = psutil.virtual_memory().percent
logging.info(f"📊 系统负载 | CPU: {cpu:.1f}% | 内存: {mem:.1f}%")
time.sleep(5)
def graceful_exit(self):
""" 退出程序 """
logging.info("\n🛑 正在停止所有线程...")
self.clicking_event.clear()
time.sleep(0.2) # 等待当前点击完成
logging.info("✅ 资源已释放")
sys.exit(0)
def exit_handler(self):
""" 监听 ESC 退出 """
logging.info("⏎ 按 ESC 退出")
keyboard.wait("esc")
self.graceful_exit()
def start(self):
""" 启动所有线程 """
logging.info("🔥 Egg, Inc. 专业版点击器")
logging.info("==========================")
logging.info("功能说明:")
logging.info("- Ctrl+Shift+S : 启动/停止点击")
logging.info("- Ctrl+↑ : 每次加速0.005秒")
logging.info("- Ctrl+↓ : 每次减速0.005秒")
logging.info("- ESC : 安全退出程序")
logging.info("==========================")
# 绑定热键
keyboard.add_hotkey("ctrl+shift+s", self.toggle_clicking)
keyboard.add_hotkey("ctrl+up", self.increase_speed)
keyboard.add_hotkey("ctrl+down", self.decrease_speed)
# 启动点击线程
click_thread = threading.Thread(target=self.click_engine, daemon=True)
click_thread.start()
# 启动资源监控线程
monitor_thread = threading.Thread(target=self.resource_monitor, daemon=True)
monitor_thread.start()
# 启动退出监听线程
exit_thread = threading.Thread(target=self.exit_handler, daemon=True)
exit_thread.start()
exit_thread.join() # 阻塞主线程
if __name__ == "__main__":
clicker = Clicker()
clicker.start()
该代码在原有基础上进行了以下主要优化和改进:
1. 代码架构重构(面向对象)
- ✅ 使用类封装所有功能(
Clicker
类) - ✅ 将全局变量转换为类实例属性
- ✅ 各功能模块化为类方法
- ✅ 通过
start()
方法统一启动所有组件 - ✅ 支持通过构造函数参数配置初始参数
2. 专业日志系统
- 🔍 使用标准库
logging
替代print
- 📅 日志格式包含时间戳和级别:
"%(asctime)s - %(levelname)s - %(message)s"
- 📊 分级日志(INFO/WARNING/ERROR)
- 📍 关键操作都有日志记录(开始/暂停/速度调整等)
3. 线程安全增强
- 🔒 使用
interval_lock
保护速度参数 - ⚙️ 所有对
active_interval
的访问都通过锁 - 🛡️ 异常处理中自动清除点击状态
- ⏳ 退出时添加0.2秒缓冲等待点击完成
4. 系统资源监控
- 💻 新增
resource_monitor()
方法 - 📈 使用
psutil
监控CPU/内存使用率 - ⏱️ 每5秒输出一次系统负载状态
- 🚨 高负载时可及时调整点击频率
5. 优雅退出机制
- 🚪 独立的
graceful_exit()
退出方法 - 🧹 退出前清理点击状态
- 🔌 确保资源释放
- 📢 明确的退出状态提示
6. 热键系统升级
- ⌨️ 改用组合键避免冲突:
Ctrl+Shift+S
开始/暂停Ctrl+↑/↓
调整速度
- 📖 启动时显示完整帮助文档
- 🔄 热键绑定与类方法直接关联
7. 异常处理强化
- 🚦 单独处理
FailSafeException
- 💥 捕获所有异常并记录错误详情
- ⏸️ 发生异常自动暂停点击
- 📍 明确标注异常发生位置
8. 可维护性提升
- 📝 所有方法添加docstring
- 🏷️ 参数化配置(可通过构造函数调整)
- 🧩 模块化设计方便功能扩展
- 🔄 分离点击引擎与监控逻辑
9. 性能优化
- ⏱️ 精确到毫秒级的间隔控制
- 💤 非活动状态使用更长休眠间隔
- 📉 动态速度调整算法优化
- 📊 资源监控独立线程运行
10. 用户体验改进
- 😺 使用表情符号增强状态识别
- 📋 启动时显示美观的ASCII分隔线
- 📌 明确的边界状态提示(如"已达极限速度")
- 📢 日志信息包含上下文语义
对比旧版本的核心优势:
- 稳健性:通过面向对象设计和线程锁机制,避免竞态条件
- 可观测性:完整的日志系统和资源监控,实时掌握运行状态
- 可维护性:模块化设计使功能扩展更便捷
- 安全性:组合键设计防止误操作,优雅退出确保系统稳定
- 专业性:符合Python工程最佳实践,适合长期运行
使用建议:
# 自定义初始化配置示例
clicker = Clicker(
min_interval=0.0005, # 极限速度0.5ms
max_interval=2.0, # 最大间隔2秒
default_interval=0.005 # 默认5ms间隔
)
clicker.start()
该版本适合需要以下场景:
- 长时间稳定运行
- 需要精确性能监控
- 频繁调整点击参数
- 多环境部署需求
- 团队协作开发维护
总结:
这次优化使得代码更加面向对象、结构清晰,易于维护与扩展。同时,它通过日志记录、线程管理、异常处理等方式增强了程序的稳定性和可靠性。通过合理的资源监控、间隔调整和热键管理,提供了一个更加灵活和高效的自动点击工具。如果将来需要扩展功能或调整性能参数,这种结构会更加方便和高效。