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

不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了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 Noneelse: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 / 870def get_posy(y, window_size):  # 返回y相对坐标return (window_size[3] - window_size[1]) * y / 520topx, 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,反之为0return ''.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 = Falseassert len(hash1) == len(hash2)if sum(ch1 != ch2 for ch1, ch2 in zip(hash1, hash2)) < n:b = Truereturn b

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

def yu_ling(window_size):global is_starttopx, 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)continueimg_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))continueimg_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))continueimg_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()breakcontinue

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

Python实现自动挂机脚本(基础篇)相关推荐

  1. python挂机脚本怎么运行,Python实现自动挂机脚本(基础篇)

    博客原文[不好吃の蛋蛋] 完整代码 不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然很想尝试着写个脚本挂机,话不多说进入正题. 简单的鼠标操作 游戏挂机脚本,无非就是自动移 ...

  2. Python实现自动挂机脚本(GUI 打包)

    博客原文[不好吃の蛋蛋] 完整代码 在Python实现自动挂机脚本(基础篇)中我们实现了简单的挂机脚本,但这样的脚本运行起来比较麻烦,也没有好看的界面.本篇中,我们将使用tkinter设计GUI界面, ...

  3. python日常实用小脚本-Python实现自动挂机脚本 | 沐雨浥尘

    使用Python + win32api实现简单自动鼠标点击 使用tkinter设计GUI界面并用pyinstaller打包 不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然 ...

  4. python如何做脚本_Python实现自动挂机脚本(基础篇)

    不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然很想尝试着写个脚本挂机,话不多说进入正题. 简单的鼠标操作 游戏挂机脚本,无非就是自动移动鼠标,自动点击,进行重复操作,所以 ...

  5. Python详细介绍及使用(基础篇)

    Python详细介绍及使用(基础篇) 第一章 Python基础     Python的由来:1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器.Python来自Guido所 ...

  6. Ansible自动部署(基础篇)

    Ansible自动部署(基础篇) 一.ansible简介 1.ansible介 Ansible这个名字来源于科幻小说,是一种超光速通讯设备.在Linux中,ansible是新出现的自动化运维工具,基于 ...

  7. Python操作lxml库(基础篇)

    ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 目录 学习日记 一.lxml库概述 1.lxml库介绍 2.l ...

  8. python自动操作脚本_Python实现自动挂机脚本 | 沐雨浥尘

    使用Python + win32api实现简单自动鼠标点击 使用tkinter设计GUI界面并用pyinstaller打包 不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然 ...

  9. python面试题库——1Python基础篇

    第一部分 Python基础篇(80题) 为什么学习Python? 语言本身简洁,优美,功能超级强大,跨平台,从桌面应用,web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做 Python和Ja ...

最新文章

  1. svn服务器搭建及使用 二
  2. 支持移动端深度学习的几种开源框架
  3. solr5.3.1 集成IK中文分词器
  4. 设计模式(1)-----简单工厂模式
  5. C语言课后习题(34)
  6. 加密芯片在游戏行业内的应用
  7. window7 64位下Android studio 安装genymotion模拟器
  8. const C++ 用法总结
  9. 探讨下在Delphi里面进程之间的数据共享
  10. 以太坊执行miner.start返回null终极解决方案
  11. easyui省市二级联动
  12. js遍历对象去除空格
  13. 圣多米尼克高中有计算机课吗,院校库_VPEA北美留学院校数据查询中心
  14. 忍者必须死3突然服务器维修,《忍者必须死3》3月12日2:00停服维护公告
  15. 如何判断一个对象是否属于某个类
  16. 词法解析器 | 从零实现一门语言
  17. JavaSE经典编程题
  18. 基于摄像头实现手写输入字符功能(视频手写)
  19. 云计算发展前景好不好 学了后能胜任哪些岗位
  20. 【OpenCV 4】图像卷积操作(Blur)

热门文章

  1. 多模态训练如何平衡不同模态
  2. iOS 设置tableview组头组尾的背景色
  3. 保姆级上云教程:购买百度云BCC服务器以及之后的一些注意事项
  4. 【系统篇 / 配置】❀ 06. 添加桌面图标 ❀ Windows Server 2016
  5. arduino+三引脚蜂鸣器YL-44(3pins)的简单使用
  6. #微软MVP分享# WP手机使用记录
  7. 用lombok插件,驼峰属性第一个是一个字母的,属性没有接收到值,使用@JsonProperty解决(工作遇到的坑)
  8. 微信小程序:高德地图在小程序中的实践(含静态地图)
  9. Shell 千分 逗号隔开
  10. python 执行shell_从python执行Shell脚本与变量