关于直播答题快速搜索的讨论
(补在开头的:今天刚刚看到一则新闻,基本所有的直播答题都关了。http://36kr.com/p/5119816.html)
前一段时间,直播答题可谓是好不热闹。各大直播平台“疯狂撒币”,直播平台吸引人气,答题者考考智力(手动滑稽)。如果玩过的朋友肯定都了解游戏规则,没玩过的就不建议去玩了(太浪费时间,而且未必能获得几块钱)。游戏规则大概就是:一共十二个题目,每一题有三个选项,10秒的答题时间,如果答错,除非有复活卡,否则游戏直接结束。
不同的平台题目也是五花八门的,涉及的范围也相对较为广泛。玩家要想真得在答题里拿到几块钱还是不容易的。这个时候找个搜索引擎来搜题,就显得尤为重要,但是手动将题目输入搜索引擎,再获得答案显然是根本来不及的。于是一种快速的搜索方案就显得非常的重要,现在大部分玩家应该是用百度的“简单搜索”。具体用法就不介绍了,该应用是通过语音进行搜索的。简单搜索应用官网:http://secr.baidu.com/
现在在网上有出现了更加方便的搜索方式(具体出处未知)。这种方案是利用ADB工具获取手机的屏幕,然后将通过OCR获取屏幕中的文字,将获取的文字提交给任意的搜索引擎进行搜索,获取搜索页面的html。最后将答案作为关键词,统计关键词在html里的出现次数。
通过我和两个小伙伴的测试发现了该方案存在一定问题。下面做简要的分析:
1.肯定型,通常“以下某某东西是某某的什么”。例如:“肉夹馍是哪个地方的美食?A:江苏;B:陕西;C:湖南”。似这种的肯定的问题,该答题程序能够轻轻松松回答出来。遇到这类问题选择出现频率最高的,基本就是正确答案。见下图:
2.否定型,通常“以下某某东西不是某某的什么”。例如:“以下哪个不是动画片海绵宝宝中的人物?A:蟹老板;B:派大星;C:佩琪”。类似这种的否定的问题,该答题程序也能够进行搜索,但是应该注意的是遇到这类问题选择出现频率最低的,基本就是正确答案。见下图:
3.摸不到头型,通常“没有固定格式”。例如:“随着时间的流逝,不少80后都?A:当上了CEO;B:迎娶了白富美;C:捧起了保温杯”。这种问题基本无解,全靠自己了。见下图:
本来想趁着答题的热潮分享出来的,一直没找到时间去写,趁现在无所事事,赶紧分享一下来自网络的代码(本人稍微修改了部分内容,以下以百万英雄为例)
import subprocess
import requests
from io import BytesIO
from PIL import Image
from aip import AipOcr
def get_screenshot():
"""获取手机截图"""
# 执行abd命令
process = subprocess.Popen('adb shell screencap -p', shell=True, stdout=subprocess.PIPE)
# 获取屏幕二进制内容
screenshot = process.stdout.read()
# 格式转化
screenshot = screenshot.replace(b'\r\r\n', b'\n')
# 写入内存,提高速度
img_fb = BytesIO()
img_fb.write(screenshot)
# 图片处理
img = Image.open(img_fb)
"""百万英雄"""
'''
# 图片分割出题目
title_img = img.crop((80, 240, 640, 450))
# 图片分割出答案
ans_img = img.crop((80, 480, 640, 810))
# 拼接图片
new_img = Image.new('RGBA', (560, 540))
new_img.paste(title_img, (0, 0, 560, 210))
new_img.paste(ans_img, (0, 210, 560, 540))
'''
# 内存对象
new_img_fb = BytesIO()
new_img.save(new_img_fb, 'png')
with open('test1.png', 'wb') as f:
f.write(new_img_fb.getvalue())
return new_img_fb
def get_word_by_img(img):
"""获取图片文字"""
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
res = client.basicGeneral(img)
return res
def baidu(question, answers):
"""调用搜索引擎搜答案"""
url = 'http://www.baidu.com/s'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
}
data = {
'wd': question
}
res = requests.get(url=url, params=data, headers=header)
res.encoding = 'utf-8'
html = res.text
# 统计频数
for i in range(len(answers)):
answers[i] = (html.count(answers[i]), answers[i], i)
answers.sort(reverse=True)
return answers
def main():
"""主函数"""
print('准备答题了啊啊啊')
while True:
# 回车继续
input('请按回车开始答题:')
# 获取手机截图
img = get_screenshot()
# 获取图片的文字
info = get_word_by_img(img.getvalue())
print(info)
if info['words_result_num'] < 4:
continue
answers = [x['words'] for x in info['words_result'][-4:]]
question = ''.join([x['words'] for x in info['words_result'][:-4]])
print(question)
print(answers)
res = baidu(question, answers)
print(res)
if __name__ == '__main__':
main()
由于在使用OCR进行文字识别,借用了百度AI中的文字识别功能,在程序中的def get_word_by_img(img) 函数中的 APP_ID API_KEY SECRET_KEY是我自己创建的百度AI应用的账户和密码,每天只有500次的使用限制。至于具体的ADB工具在该程序中的使用步骤,我简单的介绍以下,具体的可以自己找其他博客,当然也可以留言问我。
* 下载adb工具包
* 放在python目录下
* 运行adb.exe文件
* 手动添加系统环境变量
最后说一句,该程序的运行环境为python3,具体要用到的库全在import里了。