最近和跟着同事一起玩阴阳师,发现这个游戏有太多重复操作了,这完全就是浪费生命啊;所以想到用python写一个自动挂机脚本。

最开始想得很简单,就是一直去找相应得按钮,然后点击就可以了。所以直接用pyautogui的图片定位和点击功能就行了,也确实实现了,代码如下:

importpyautogui,time

pyautogui.FAILSAFE=True'''PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,

PyAutoGUI函数就会产生pyautogui.FailSafeException异常,用于在程序失控时退出'''time.sleep(2)defget_point(picture):'''精确匹配某个按钮的位置;通过传入图片获取图片在屏幕上的定位,一旦获取到值则退出,否则继续尝试'''picture= './img/' +picture

count= 5

while count >0:

point=pyautogui.locateCenterOnScreen(picture)if point is notNone:returnpointelse:

count-= 1

defget_range(picture):'''用模糊匹配得到某个按钮的大概位置,一般是在那种点击屏幕任意位置的情况,或只需要知道某个按钮在不在当前屏幕的情况使用

要动的图片采用模糊匹配,否则精确匹配的话,图片一直在动像素也在变化,就不能定位到了'''picture= './img/' +picture

count= 5

while count >0:

range= pyautogui.locateCenterOnScreen(picture, grayscale=True, confidence=0.5)if range is notNone:returnrangeelse:

count-= 1

def click_button(picture,accurate=True):'''点击按钮的函数,默认精确度为True,即默认为精确点击,如果accurate=False,则为模糊点击,用于动态图形按钮'''

if accurate==True:

action=get_point(picture)else:

action=get_range(picture)if action is notNone:

pyautogui.click(action,duration=0.5)defcycle_fight():'''用户循环重复的战斗场景,如果刷觉醒材料,刷御魂'''

whileTrue:

click_button('tiaozhan.PNG')

click_button('zhunbei.PNG')

click_button('over.PNG')

cycle_fight()

最后发现这样似乎不科学,不仅慢还浪费资源;然后又想到在准备完成和战斗结束这段时间,有很长的空白期,完全可以让程序停止啊,所以又出现了下面的代码:

import pyautogui,time

pyautogui.FAILSAFE = True

'''PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,

PyAutoGUI函数就会产生pyautogui.FailSafeException异常,用于在程序失控时退出'''

time.sleep(2)

def get_point(picture):

'''精确匹配某个按钮的位置;通过传入图片获取图片在屏幕上的定位,一旦获取到值则退出,否则继续尝试'''

picture = './img/' + picture

count = 5

while count > 0:

point = pyautogui.locateCenterOnScreen(picture)

if point is not None:

return point

else:

count -= 1

def get_range(picture):

'''用模糊匹配得到某个按钮的大概位置,一般是在那种点击屏幕任意位置的情况,或只需要知道某个按钮在不在当前屏幕的情况使用

要动的图片采用模糊匹配,否则精确匹配的话,图片一直在动像素也在变化,就不能定位到了'''

picture = './img/' + picture

count = 5

while count > 0:

range = pyautogui.locateCenterOnScreen(picture, grayscale=True, confidence=0.5)

if range is not None:

return range

else:

count -= 1

def click_button(picture,accurate=True):

'''点击按钮的函数,默认精确度为True,即默认为精确点击,如果accurate=False,则为模糊点击,用于动态图形按钮'''

if accurate==True:

action = get_point(picture)

else:

action = get_range(picture)

if action is not None:

pyautogui.click(action,duration=0.5)

return True #点击成功则返回True

else:

return None #通过这个返回值判定有没有点击成功

def on_fight(sec):

'''这个函数用于模拟从【准备】到【战斗结束】这段时间,在这段时间里程序应该是阻塞的,这样就不用一直去找对应的按钮,从而消耗大量的系统资源'''

fight_run = click_button('zhunbei.PNG') #点击准备按钮则战斗开始

if fight_run is not None: #如果成功点击了准备按钮则代表战斗开始,程序进入寻找【战斗结束按钮】的状态

count = 0

while True:

time.sleep(sec) #设定每几秒检测一次战斗是否结束,这个值可以具体情况设置

fight_over = click_button('over.PNG')

if fight_over is not None:

return True

else:

count +=1 #记录循环次数

if count*sec > 600:

'''用循环次数乘以中断时间,大约等于战斗过程的时间,这里的意思是战斗过程大于10分钟,一般这种情况,肯定

是在点击了准备之后,战斗过程中异常中断,这时候程序会一直陷入这个寻找战斗结束的死循环中,但这是没有意义的,

所以直接退出整个程序'''

exit(1)

else:

return None #如果没有点击【准备】按钮,则返回为空,继续进入下一次寻找进入战斗起始按钮的过程

def cycle_fight(sec):

'''用户循环重复的战斗场景,如果刷觉醒材料,刷御魂'''

while True:

click_button('tiaozhan.PNG')

on_fight(sec)

def story_task():

'''用于过废话连篇的剧情'''

while True:

click_button('tiaoguo.PNG')

click_button('dialogue.PNG')

click_button('storyJump.PNG')

def explore_task(sec):

'''用于过探索副本'''

while True:

click_button('fight.PNG',accurate=False)

click_button('masterFight.PNG',accurate=False)

on_fight(sec)

#explore_task()

# cycle_fight(10)

story_task()

这样一来虽然降低了系统资源消耗但代码逻辑变得极为复杂,然后便想到用多线程封装,之后效率确实极大的提升了:

import pyautogui,time

import threading

pyautogui.FAILSAFE = True

'''PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,

PyAutoGUI函数就会产生pyautogui.FailSafeException异常,用于在程序失控时退出'''

time.sleep(2)

class FindButton(threading.Thread):

def __init__(self, picture):

super(FindButton, self).__init__()

self.picture = './img/' + picture

def run(self):

while True:

self.point = pyautogui.locateCenterOnScreen(self.picture, confidence=0.8)

if self.point is not None:

pyautogui.click(self.point, duration=0.5)

challenge = FindButton('tiaozhan.PNG')

prepare = FindButton('zhunbei.PNG')

over = FindButton('over.PNG')

challenge.start()

prepare.start()

over.start()

但是这样一来,系统资源的消耗也成倍的增加了,相当于每多一个点击操作,就要多使用一倍的系统资源。那不如用协程来解决吧,既是单线程,又可以异步进行;

最后证明协程比多线程稍慢(毕竟协程是需要排队的,协程直接的切换也是需要消耗时间的),比单线程则是快了太多了

而且消耗的系统资源也极大的降低了(甚至比单线程的情况还低),并且代码也简单了太多了!

importgeventimportpyautoguidefclick(picture):

picture= './img/' +picturewhileTrue:

point= pyautogui.locateCenterOnScreen(picture, confidence=0.8)if point isNone:

gevent.sleep(1)else:

pyautogui.click(point, duration=0.5)defcycle_fight():'''用于循环重复的战斗场景,如果刷觉醒材料,刷御魂'''gevent.joinall([#利用joinall方法将每一步操作加入协程池中

gevent.spawn(click,'tiaozhan.PNG'), #每一个协程的加入方法是:(函数名,参数)

gevent.spawn(click,'zhunbei.PNG'),

gevent.spawn(click,'over.PNG')

])defstory_task():''''用于过废话连篇的剧情任务'''gevent.joinall([

gevent.spawn(click,'dialogue.PNG'),

gevent.spawn(click,'tiaoguo.PNG'),

gevent.spawn(click,'storyJump.PNG'),

gevent.spawn(click,'fight.PNG'),

gevent.spawn(click,'zhunbei.PNG'),

gevent.spawn(click,'over.PNG')

])defexplore_task():'''用于过探索副本'''gevent.joinall([

gevent.spawn(click,'fight.PNG'),

gevent.spawn(click,'masterFight.PNG'),

gevent.spawn(click,'zhunbei.PNG'),

gevent.spawn(click,'over.PNG')

])

cycle_fight()

python挂机脚本阴阳师_记一次阴阳师挂机脚本开发相关推荐

  1. python运行没有图_运行没有图形的Salome脚本

    我也有类似的愿望,但经过仔细研究,我最终得出结论,我们两个都想做的事情不可能完全实现.在 为了在命令行上运行salome脚本而不使用GUI salome -t python script.py 或者干 ...

  2. python解决租房问题_记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

    为了分析深圳市所有长租.短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题: 爬取代码: import requests from reques ...

  3. python检查https过期_记录用certbot续签HTTPS时,python的pip源出现问题

    起因: 这就很简单了,certbot提供了HTTPS服务,但要每三个月续签一次,在查看证书快过期了,然后赶紧执行命令续签 在服务端肯定是用了定时跑续签的命令,每月跑一次,如果定时跑成功了,也就不会发邮 ...

  4. python 获取网页元素_记一次python提取网页标签元素的坑

    最新在学习Python抓取网页时,遇到一个坑,同一个方法提取两个网页,有一个网页提取不到正确的信息.先贴原始的代码 url = 'https://xxxx.com/' req = request.Re ...

  5. python循环代码优化技巧_记一次优化python循环代码逻辑的过程

    问题描述: 一个含有30W元素的列表A,列表的元素都是字符串,现在要循环10W次,每次都要判断一下B字符串是否存在这个A列表里面,有什么优化策略吗? 问题现状: 如果用普通的逻辑来写, 程序会类似下面 ...

  6. python登录教务系统_记python登陆学校教务系统踩过的坑

    最近开发关于学校服务类小程序,小程序后台需要从学校的系统获取到各同学的信息,所以语言优先选择了python,并用了Django框架.之前也有写过一些爬虫,但都是用其他语言写的.对python并不熟悉, ...

  7. python logging命令注入_整理后的手动注入脚本命令

    1.判断是否有注入;and 1=1 ;and 1=2 2.初步判断是否是mssql ;and user>0 3.注入参数是字符'and [查询条件] and ''=' 4.搜索时没过滤参数的'a ...

  8. python接口自动化测试书籍_蜗牛出版之《接口自动化测试开发实战教程》书籍详解!...

    各位老铁,大家好~ 上周,我们通过一篇分享,给大家详细介绍了蜗牛创想的出版业务. 还不了解的小伙伴请戳:除了培训和研发,我们还有一项90%的人都未曾关注到的业务! 本周开始,我们将对已经出版的< ...

  9. Linux Shell脚本专栏_批量主机远程执行命令脚本_08

    文章目录 1. 安装expect 2. 脚本制作 3. 赋予权限 4. 运行脚本 5. 直接运行脚本 6. vmstat测试 1. 安装expect [root@localhost ~]# yum i ...

最新文章

  1. ubuntu不显示壁纸,桌面右键无反应
  2. MYSQL常用函数以及分组操作
  3. 程序员提高建议之踏踏实实“扎马步”
  4. Spark中的数据本地性
  5. Python os.path() 模块os.path.exists()
  6. 【HTML5CSS3进阶学习01】气泡组件的实现
  7. 在Microsoft Workflow Foundation中晃荡了两天
  8. paip.提升安全性----.net C#源码防止反编译以及源码加密
  9. 全平台视频转GIF软件对比与推荐(iOS/安卓/Windows/Mac)
  10. Java IO(文件流)
  11. matlab geodetic2ecef,卫星轨道问题
  12. 怎么设置计算机语言中文,Windows10 IE11浏览器怎么把默认语言设置为中文
  13. TMOS系统之Trunks
  14. 查找表字段-事务码 AUT10
  15. 高校逐梦元宇宙,是风口还是噱头?
  16. 明明白白lua的协程(coroutine)
  17. python pydicom读取dicom文件信息的几种方式
  18. photoshop CC制作gif动图
  19. 如何通过路由器查看宽带的密码(多图预警)
  20. 云服务器什么是镜像?

热门文章

  1. linux在内核中设置开机logo
  2. 牛客练习赛97 C 哦~唔西迪西小姐~
  3. 江门药检实验室建设知识整理
  4. AI阿凡达降临CES! 三星Neon聊天机器人竟然会学习、能进化、有记忆!
  5. 带上这份说明书,痛痛快快吃一顿日式烧肉!
  6. 返回顶部按钮 js普通函数版/class构造函数版/JQ版
  7. 小米2s中使用sqlite3
  8. 剑指 Offer(C++版本)系列:总目录和一些提高效率的说明
  9. python的excel教程_Python对Excel(*.xls)的操作
  10. 阿里限流神器Sentinel夺命连环 17 问?,nginx请求转发原理