偶然想起这款游戏,又去玩了一会,突然想到最近用的selenium driver似乎可以自动化完成这个事情,想来应该可行

思考了一下,用selenium自动登录倒是很好搞定,但是想要确定点击位置就比较麻烦。因为是Flash游戏,不能打代码的主意,倒是可以截图分析图片,最初的想法是保存一个没有圈圈的图片,然后拿有圈圈的图片做对比,找出差异的地方,进行定位,我没有这么做,不知道PIL能不能做这个事情。在搜索的过程中,找到了更好的方法,使用OpenCV的函数可以识别圆。

整体流程如下:

QQ登录

selenium模拟登录很简单,唯一需要注意的就是操作登录框的时候需要切换iframe,当登录完成后返回之前的环境

driver.switch_to.frame(driver.find_element(By.ID,'loginFrame'))

driver.switch_to.default_content()

driver.switch_to.frame(driver.find_element(By.ID,'loginFrame'))

driver.switch_to.default_content()

进入游戏页面后,延时10s等待游戏加载完成,然乎使用selenium获取元素定位

ele=driver.find_element(By.ID,"FlashContainId")

location=ele.location

size=ele.size

ele=driver.find_element(By.ID,"FlashContainId")

location=ele.location

size=ele.size

这个location就是element相对于网页的位置,也就是游戏窗口左上角的位置。size就是element的长宽,查看网页源代码,和它们定义的 640x530大小是一致的。换言之,selenium的位置尺寸单位都是px,更方便接下来的计算

因为开始按钮的位置是固定的,直接在location基础上算出来坐标点击即可

fromselenium.webdriver.common.action_chainsimportActionChains

action_chains=ActionChains(driver)

action_chains.move_to_element_with_offset(ele,250,420).click().perform()

time.sleep(3)

fromselenium.webdriver.common.action_chainsimportActionChains

action_chains=ActionChains(driver)

action_chains.move_to_element_with_offset(ele,250,420).click().perform()

time.sleep(3)

selenium没有 screenshotbyelement功能,只能截展示出来的窗口,不过有了游戏窗口的左上顶点坐标和游戏窗口的长宽,可以使用PIL从整张图片中截取出游戏窗口

name=str(time.time())[:10]

img=tmp_img_dir+name+'.png'

driver.save_screenshot(img)

# PIL打开图片

im=Image.open(img)

# 选区

left=location['x']

top=location['y']-174

right=location['x']+size['width']

bottom=location['y']+size['height']-174

# 裁剪并保存

im=im.crop((left,top,right,bottom))

im.save(img)

name=str(time.time())[:10]

img=tmp_img_dir+name+'.png'

driver.save_screenshot(img)

# PIL打开图片

im=Image.open(img)

# 选区

left=location['x']

top=location['y']-174

right=location['x']+size['width']

bottom=location['y']+size['height']-174

# 裁剪并保存

im=im.crop((left,top,right,bottom))

im.save(img)

因为设置显示器大小为1366x768,这个网站在游戏加载后会有一个向下滚动使得游戏窗口位于屏幕中间的操作,因为游戏窗口相对于浏览器窗口向上移动了,所以截图出来的位置就会包含游戏窗口的下半部分和一百多像素的无关区域, 174根据截图位置进行调整的数值。我没在更大的屏幕上测试,也许不具有通用性。

获取圆坐标

下面这篇文章很棒,详细讲解了使用OpenCV识别图像中圆的坐标。

我在他给的demo的基础上,简单修改下放在函数里,以便循环调用

defgetCirclePos(img_path):

# load the image, clone it for output, and then convert it to grayscale

image=cv2.imread(img_path)

output=image.copy()

gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

# detect circles in the image

circles=cv2.HoughCircles(gray,cv2.cv.CV_HOUGH_GRADIENT,1.2,50)

# ensure at least some circles were found

ifcirclesisnotNone:

# convert the (x, y) coordinates and radius of the circles to integers

circles=np.round(circles[0,:]).astype("int")

# loop over the (x, y) coordinates and radius of the circles

for(x,y,r)incircles:

printx,y,r,img_path.split('/')[-1]

return(x,y)

else:

returnFalse

defgetCirclePos(img_path):

# load the image, clone it for output, and then convert it to grayscale

image=cv2.imread(img_path)

output=image.copy()

gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

# detect circles in the image

circles=cv2.HoughCircles(gray,cv2.cv.CV_HOUGH_GRADIENT,1.2,50)

# ensure at least some circles were found

ifcirclesisnotNone:

# convert the (x, y) coordinates and radius of the circles to integers

circles=np.round(circles[0,:]).astype("int")

# loop over the (x, y) coordinates and radius of the circles

for(x,y,r)incircles:

printx,y,r,img_path.split('/')[-1]

return(x,y)

else:

returnFalse

将以上功能在main中拼接起来,这个辅助工具就能正常工作啦,先登录,然后加载游戏,开始游戏,进入循环(获取截图,解析圆坐标,点击),点击后需要给一个两秒钟的sleep,不然下一个圆还没出现,并且升级后的提示"恭喜你"什么的也是会影响圆出现的时间,如果恰巧截图中没有出现圆,那么需要休息一下,继续截图,解析,点击。这样做的原因除了避免没有截取到圆的情况,也因为有时即使正确的出现圆,解析圆坐标的函数还是不能获取到坐标。这时,需要手动点击一下,毕竟要是让程序自己蒙一个,5次机会可能很快就用完了。不过遗憾的是,识别率不仅到不了100%,随着圆越来越小,识别率回越来越低,也就不能让这个辅助程序全自动,只能半自动化。至此,虽然不完美,有很多瑕疵,不过功能和流程是完善的

完整代码:

最后,贴个玩了几分钟的战绩。

没错,那个历史最佳就是当年蛋疼的玩了一个多小时的成果...

python写网页flash游戏辅助_会玩 | 使用 Python + Selenium制作Flash游戏辅助相关推荐

  1. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?

    原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...

  2. 用python写个程序送给女朋友_如和用python给女朋友做个专属她的软件

    如和用python给女朋友做个专属她的软件 在学习python的路上如果觉得枯燥就可以想我一样做一些有趣的事情就不会无聊了 python是一门及其有趣的语言. 人们都喜欢记住一些重要的日子,比如说跟女 ...

  3. python写对象提供的方法_下面哪些是python读对象提供的“写”方法?

    [简答题]土的物理性指标中六个换算指标是哪些? [判断题]定义毛坯中,常用的形状有多边体.长方体.圆柱体. [单选题]_______ difficult questions they are! I c ...

  4. python控制安卓手机的闹钟_【玩转Python】为女朋友打造一款智能语音闹钟

    在看这篇文章之前,你至少应该是一个会装操作系统的程序猿,懂点 Linux,会些 Python,最主要的是你得有一个女朋友.当然没有也没关系,相信看完这篇文章,你也尝试做了这么一款闹钟,说不定..... ...

  5. python 搜索引擎 实验楼的源码_【如何入门 Python 爬虫?】-看准网

    匿名用户 学会一门语言的捷径只有一个: Getting Started!¶ 起步阶段 任何一种编程语言都包含两个部分:硬知识和软知识,起步阶段的主要任务是掌握硬知识.°1 硬知识 "硬知识& ...

  6. python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  7. python下载网页上的文件_用Python下载一个网页保存为本地的HTML文件实例

    Python打开网页并另存为静态html怎么实现 如何用python把网页上的文本内容保存下来那一世的长情,谱一首长相思,冷了多少凄凉,漫了多少青丝,化作多少烟雨,吹散多少世间情!徒悲,奈何,这一世, ...

  8. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

  9. python写飞机大战什么水平_飞机大战python

    给大家整理的这套python学习路线图,按照此教程来一步步的学习,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  10. python 下载网页文件_『如何用python把网页上的文本内容保存下来』python爬取网页内容教程...

    python爬虫:如何爬网页数据并将其放在文本 用requests库 r=r.requests.get(url) r.concent 保存到文件里就行了 如何用python把网页上的文本内容保存下来 ...

最新文章

  1. Chapter 9:Noise-Estimation Algorithms
  2. Oracle proceduce返回数据集小结
  3. select BUGS
  4. react单选框获取值
  5. 单列模式(懒汉)测试代码
  6. 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码下载)
  7. 网络安全模型_基于数据驱动的网络安全流量分析总结
  8. 语言for循环联程_Lua循环
  9. 拓端tecdat|卡尔曼滤波器:用R语言中的KFAS建模时间序列
  10. 元件封装尺寸_单位换算表
  11. 跨越鸿沟——工业大数据的实践与思考
  12. 【电子元件】稳压(齐纳)管 Zener Diode
  13. 树莓派教程 - 2.1 树莓派USB摄像头 树莓派罗技免驱摄像头 fswebcam常用参数
  14. 数据库 | Redis 缓存雪崩解决方案
  15. Ubuntu16.04 忘记登陆密码 重新设置密码
  16. 信息录入率百分百上海强化施工现场建筑工人实名制管理
  17. 2010世界财富排行榜
  18. AcWing 1017 怪盗基德的滑翔翼
  19. 使用OneNote来构建你自己的知识库
  20. 论文画图——eps格式的图

热门文章

  1. linux安装mysql phpmyadmin_如何在Linux下安装和配置PHPmyadmin?
  2. 第五周-第08章节-Python3.5-内置模块详解之shutil模块
  3. 对数组的操作splice() 和slice() 用法和区别
  4. [转]二维图形的矩阵变换(一)——基本概念
  5. Android 之类库常用包
  6. poj 3683 2-SAT入门
  7. 将文件夹下所有csv文件转换成所有txt
  8. Linux文件夹打包拷贝到window下
  9. spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧...
  10. 课改 计算机 论文,计算机论文 计算机应用课改分析