关于直播答题快速搜索的讨论

关于直播答题快速搜索的讨论


(补在开头的:今天刚刚看到一则新闻,基本所有的直播答题都关了。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里了。

猜你喜欢

转载自blog.csdn.net/q_quanting/article/details/79439430