首先写这个辅助的想法来源于之前微信小游戏“跳一跳”的辅助,使用到了adb来获得手机的截图等,而直播答题碰到不会的题遇到的困难主要就是没时间去打字搜索,如果用同样的方法得到了题目相关的文字信息自动去搜索,成功率不就大大提高了嘛!再有很自然想到的一点就是一道题就3个选项,3台手机不就肯定能保证对一道吗?因此如何快速操作多个手机模拟器也需要考虑。

效果图

Ref

思路

开启多个手机模拟器,题目出现时启动Python程序,截图并进行OCR识别出文字,获得各个选项,接着对问题以及各个选项分别进行搜索,获得前几条搜索结果或者页面数量等进行判断。

手机模拟器

在这里我用的是夜神手机模拟器,需要用到一个分辨率、DPI较高的模拟器用于OCR识别,剩下的配置尽量调低降低硬件开销。

手机模拟器多开

adb

由于需要操作多个模拟器,我们首先需要知道如何连接各个模拟器。下载好adb包之后将其配置到环境变量中,然后adb devices查询在线的模拟器即可。然而有时候模拟器抽风,这个命令不起作用,这个时候需要先adb connect之后adb devices才有用(神设定),查看对应安装目录,Nox\bin\debug.bat发现查找对应模拟器的端口的方法是通过查找配置文件的5555端口实现的,依葫芦画瓢,来到Nox\bin\BignoxVMS查看各个副本的配置文件即可得到端口。这里总结一下用到的adb命令

//输入adb可查看相关命令用法

//存在多个模拟器时需要用-s 指定操作的目标

adb -s 127.0.0.1:62001 shell screencap -p /sdcard/n.png //截屏

adb -s 127.0.0.1:62001 pull /sdcard/n.png ./n.png //传到电脑

//输入adb shell input可查看相关命令用法

adb -s 127.0.0.1:62001 shell input tap x y //点击(x,y)位置 用以点击问题的选项

确定题目与选项位置

经过测试题目选项出现的位置是固定的,所以这里的问题主要是将分辨率较高的模拟器上选项的位置对应到低分辨率模拟器上。

分辨率480X800 DPI 160

分辨率480X800 DPI 60

分辨率240X400 DPI 60

从以上3张图可以得到,分辨率相同的话,题目区域大小与DPI成正比;DPI相同的话,整个题目占用的像素点是相同的,题目区域大小与分辨率成反比。所以假如在480X800 DPI 160的模拟器上位置为(x,y),在240X400 DPI 60的模拟器上位置为(x,y*2*60/160)=(x,0.75y)

相对关系

OCR

从固定位置中裁剪出问题的图像,再OCR识别为文字。这里用到的是tesseract-ocr,同样需要配置环境变量。

系统变量下添加变量TESSDATA_PREFIX值为E:\Tesseract-OCR\tessdata

PATH下添加E:\Tesseract-OCR

还需要下载一个中文的数据包chi_sim.traineddata放到E:\Tesseract-OCR\tessdata

cmd下输入tesseract test.png out.txt -l chi_sim生成的out.txt即为test.png的识别结果。需要注意这个test.png需要裁剪出待识别的区域,否则效果很差。

以上步骤成功后就可以用Python的pytesseract库来返回结果了。

# 保存问题

cropped_img = im[y_start:y_end, x_start:x_end]

cv2.imwrite("total.bmp" , cropped_img)

# 这里直接使用cropped_img不行,需要保存后再用PIL.Image打开

text_result=pytesseract.image_to_string(Image.open("total.bmp"), lang="chi_sim"a

搜索策略

文本拿到就很好做了。预处理一下,然后用jieba获取问题的关键词,再进行搜索就行啦。这里我用的是根据搜索结果的数目来判断的。这里请参考Wikipedia ——Pointwise mutual information

divided=text.replace(" ","").split("\n")

for i in divided:

if (i=="" or i=="\n"):

divided.remove(i)

question=divided[0]

del divided[0]

print("Question: %s"%question)

keywords=jieba.analyse.extract_tags(question,topK=2,withWeight=True)

print("Keywords:")

for i in keywords:

print i

totalweight=0

print ("Options: ")

print("\n".join(divided))

至于说获得搜索结果的数量,用一个Xpath来提取就好啦,相信大家写过爬虫之后很容易搞定的。

def get_search_nums(word):

# url="https://www.baidu.com/s?wd="+unicode(word,"utf-8")

#需要先转为utf8才能进行quote

url="https://www.baidu.com/s?wd="+urllib2.quote(word.encode("utf8"))

myheaders = {

'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"} # 浏览器请求头

request=urllib2.Request(url,headers=myheaders)

response=urllib2.urlopen(request)

source=response.read()

html=etree.HTML(source)

result=html.xpath('''//*[@id="container"]/div[2]/div/div[2]/text()''')

result=result[0]

pattern=re.compile(u".*约([\d,]+)个")

#!!!注意这里编码和网页返回的编码要对应才可以进行查找!!大坑!

num=re.findall(pattern,result)

num=int(num[0].replace(",",""))

return num

结果

嗯…用这种PMI算法得到的结果还是不太靠谱,按照整个问题来搜索AC选项差异不大,按照“电影”这个关键词应该选B……(正确答案是C)所以还是需要把搜索结果的前几条给展示出来的。获得正确答案之后朝着各个模拟器发送一个对应位置的adb shell input去点击选项即可。

答案应该为第七艺术

改进

OCR效果太差导致搜索出错。如上图的“第六艺术”识别为“第大艺术”(啥玩意儿啊)在Ref中的第二篇文章中用到了百度的OCR,不知道效果如何。

搜索多个页面由于网络速度的限制还是比较费时间的。

“跳一跳”中曾出现直接抓包分析并提交结果的方法,不知道在西瓜视频里面能否用上。

使用多个模拟器测试的过程中发现各个问题在模拟器上的出现是有时差的,延后出现对作答是有利的,能否在可接受的范围内加大这个时差?

python 答题辅助_如何在百万英雄直播答题中使用Python辅助?相关推荐

  1. 百万英雄类答题游戏的程序员打开方式

    最近知识答题类的app应用和网站  都很火  所以机器人多了,,百度度秘.搜狗小汪等 Python发挥了很大作用 <百万英雄><冲顶大会><头脑王者><一站到 ...

  2. 如何用python写一个答题程序_如何使用Python写一个百万英雄的答题辅助程序 (0) 简介...

    关于百万英雄 前不久被女票介绍过来这个活动,需要下载西瓜视频APP(现在好像今日头条全系产品都支持了).这个活动是现在很火的答题分钱模式,只要答对12题就能和所有获胜者一起平分奖金. 最开始遇到不会的 ...

  3. 如何将“跳一跳”的Python辅助原理移植到“百万英雄”答题中

    最近什么比较火?跳一跳.支付宝红包.直播平台答题瓜分奖金.这里讲一讲关于跳一跳和答题瓜分奖金游戏.关于跳一跳的外挂,想必大家都有所耳闻,懂点技术的也会自己刷分了. 最开始有两种外挂,一种是直接通过po ...

  4. java游戏英雄_【技巧攻略】教你用JAVA来玩《百万英雄》答题~

    <百万英雄>是一档全民知识互动游戏,在<百万英雄>里每场12道题目全部回答正确的人,将瓜分奖金. 后续更新在我的github上,欢迎大牛前来P.R: lingfengsan/M ...

  5. python手把手入门_新手必看:手把手教你入门 Python

    首先,Python是什么?据它的创始人Guido van Rossum而言, "Python是一种高级编程语言,它的核心设计思想是代码可读性和允许程序员用几行代码来表达观点的语法." ...

  6. python装逼_能够让你装逼的10个Python小技巧

    列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来 ...

  7. 420集的python教程视频_阿里达摩院推的420集的python教程高清版,据说懂中文就能入门...

    阿里达摩院推的400集的python教程高清版,据说懂中文就能入门 小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 为了 ...

  8. python简单编程语言_功能强大而又简单易学的编程语言Python

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言(维基百科).自从上次写那个批量Blast小程序的时候接触了Python,发现这个玩意儿真是好用,后来还用它弄了个动态 ...

  9. python安装成功第三方库但import出问题_为什么会在pyspark在RDD中调用python第三方库失败?...

    问题描述 Hi, 我在公司线上运行pyspark时调用jieba分词, 发现可以成功import, 但是在RDD中调用分词函数时却提示没有 module jieba, 在本地虚拟机时没有这些问题 问题 ...

  10. python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....

    下面是我解决这个问题的工作方案.它使用了上述"无所不能"和"柔印"的建议. 特别是,我们用SWIG director创建一个回调类,然后在Python中从中派生 ...

最新文章

  1. RabbitMQ基本概念
  2. 硬盘和显卡的访问与控制(三)(含多彩的Hello)——《x86汇编语言:从实模式到保护模式》读书笔记03
  3. HTML的br/标签和hr/标签
  4. jms学习-基本概念(一)
  5. 王义成:阿里云Redis服务助力游戏行业发展
  6. java weblogic连接池,Weblogic JNDI 方式连接连接池 (工作中遇到的问题)
  7. 前端文件表单/ajax上传实例代码
  8. jzoj4279-[NOIP2015模拟10.29B组]树上路径【树形dp】
  9. 数据共享如何改变世界_如何改变他人?“我不会去改变这个世界,我们会去改变自己”。...
  10. 多图证明,Java到底是值传递还是引用传递?
  11. 面向手绘图形,涵盖多个主题,CVPR 2022 SketchDL Workshop开始征稿!
  12. 制作透明的图标ICO
  13. 在苹果Mac中如何一键转换繁体与简体中文?
  14. 一个对oi选手的感想
  15. php怎么字符串转成json对象_php如何将字符串转成json_后端开发
  16. Pr入门系列之十三:抠像与合成
  17. 无法启动计算机的杀毒软件,电脑中毒杀毒软件无法启动任务管理器也被禁用怎么办?...
  18. 8通道温度采集器工作特性介绍
  19. Linux rsync命令用法
  20. 解锁Vue百度地图加载的N种姿势

热门文章

  1. 北京邮电大学计算机导论试题,2020年秋季《北京邮电大学网络教育》各种考试题目汇总.docx...
  2. matlab命令窗口是什么,MATLAB命令窗口
  3. 怎么做网站,网站制作步骤有哪些?
  4. 多元统计分析--判别(距离判别、Fisher判别、Bayes判别)
  5. 如何利用抖加实现精准引流?3种玩法,愿你别再花冤枉钱了?(五)
  6. 某互联网大厂亿级大数据服务平台的建设和实践
  7. iOS 【真机调试-免证书-开发者信任问题】
  8. Ubuntu18.04无法安装软件的问题
  9. arm触摸屏的头文件_ARM触屏校准程序
  10. 惠普触控板使用指南_手势操作更简便 笔记本触控板使用简介