博客原文【不好吃の蛋蛋】

完整代码

不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了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文件

python挂机脚本怎么运行,Python实现自动挂机脚本(基础篇)相关推荐

  1. shell脚本配置运行python程序,小技巧之 Linux 软连接的使用

    shell脚本配置运行python程序,小技巧之 Linux 软连接的使用 实验室的多位博士会在同一台机器上跑python程序,主流的跑程序的方法有两种 使用sh脚本配置路径和程序 直接激活conda ...

  2. python如何在没有环境的电脑上执行_没安装python的电脑可以运行python写的程序吗 python语言编写的程...

    py2exe 能够把 Python script 转换成可以在windows上独立执行的(即不需安装Python)的exe程序(加上其它必需的运行时函数库). -- 摘自百度知道 py2exe能够把P ...

  3. win服务器自动发邮件,windows关机前执行脚本设置与关机blat自动发送邮件脚本模板...

    windows关机前执行脚本设置与关机blat自动发送邮件脚本模板 发布时间:2020-07-25 02:21:24 来源:51CTO 阅读:3093 作者:nn1183 价值:实时掌握开关机记录: ...

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

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

  5. linux系统如何创建python文件_linux如何运行python脚本

    1.使用python的IDLE运行python 如果你的Linux安装了python,按Ctrl+Alt+T键打开Terminal,输入指令:python.会出现>>>,这个时候就可 ...

  6. python项目打包部署到ios_Python iOS 自动打包脚本(包含上传到fir)

    Python iOS自动打包脚本 使用说明 1.1 使用python3编写,没有python3 环境的需要下载python3 python官网下载 1.2 通过Homebrew安装Python3 1. ...

  7. python php linux-linux怎么运行python?

    linux下有多种方式运行python: 1. 命令行执行: 建立一个*.py文档,在其中书写python代码.之后,在命令行执行:$ python *.py 注意事项:1. 需要指明文件的绝对路径: ...

  8. python打完代码怎么运行-Python的代码是如何去进行运行的?

    近年来,Python语言迅速崛起,其简洁.免费.易学习.兼容性好等特点以及其面向对象.函数式编程.过程编程.面向方面编程,受到众人的喜爱.与其他编程程序的语言基本相同,Python也是需要在相应的程序 ...

  9. linux下能运行python,(转)Linux下运行python

    原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...

最新文章

  1. shell快速将同一名称的不同类型文件自动划分到一个文件中
  2. 京东千万并发 API 网关实践之路!
  3. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
  4. 要承认我们换电脑频繁的效率并不是很高
  5. python爬取考研成绩什么时候出来_用Python爬取了考研吧1000条帖子,原来他们都在讨论这些!...
  6. ccs加载out文件_类加载流程、类加载机制及自定义类加载器详解
  7. 不等式约束的序列二次规划(SQP)
  8. 解码(二):音视频解码上下文创建配置和打开avcodec_open2打开演示
  9. DHCP协议++ClientServer架构
  10. c# datagridview列形式为Combobox,每行下拉选项不一样
  11. 【数学建模】基于matlab GUI干线交通控制方法【含Matlab源码 1259期】
  12. java布尔类型 向上转型_JAVA_多态性演示a____自动向上转型、向下转型、检查对象是否为某个类型(instanceof)...
  13. html页面导出pdf截断问题,vue页面生成pdf且避免分页截断处理
  14. ARCGIS之土地报备坐标(报盘数据)txt批量导出工具简介
  15. mysql获取姓名拼音首字母_C# 汉字获取拼音首字母,给数据库中的姓名添加首字母...
  16. 【WordPress】视频有声音无图像
  17. 匹兹堡大学约翰斯敦计算机学院,英语翻译翻译Every human being,no matter what he is doing,gives off...
  18. 10个常见的Android 新手误区
  19. Android整合网上资源以及个人对GreenDao数据库框架的理解与使用(android-studio开发)
  20. 黄金连分数(斐波那契数列、大数运算)正确解法

热门文章

  1. 给screen的会话改名字
  2. 程序员在互联网创业公司工作五年是一种怎样的体验?
  3. linux查找模糊文件位置,linux模糊查找文件用什么命令比较好
  4. 多线程——线程与进程
  5. python画圆形螺旋线_Python写的弹球小游戏
  6. Windows XP 上使用pyqt5 + pyinstaller
  7. LaTeX的学习--字体
  8. python简易猜数字答案
  9. Visual Studio(VS)2013使用教程
  10. 关于Android中使用WebView播放网络视频不能全屏的问题