哈哈,我用Python开发了一个搜题神奇

简介: 哈哈,我用Python开发了一个搜题神奇

专业搜题,家长好帮手

很早之前曾经做过一个图片识别的项目,当时有一项功能是整题识别,即传入数学题的截图,可通过ocr技术识别出图片内容,但当时只限于识别文字,并未作更深一步的处理,现在想来实用性并不强,毕竟大家更需要的是解题思路,而不是让AI读出题干(题干的文字,我都认识,连起来我就不知道怎么下手去做了 = = ),最近刚好有时间,于是尝试来为有娃的朋友做一个搜题神器。

鉴于之前整题识别的开发使用有道智云的良好体验,我再次打开其官方文档,果然找到了拍照搜题服务的开放API,轻车熟路地做了一个简单的批量搜题demo, 下面分享一下开发过程。

调用API接口的准备工作

首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的id和密钥。具体个人注册的过程和应用创建过程详见文章

开发过程详细介绍

下面介绍具体的代码开发过程。

API接收的参数较为简单:

字段名 类型 含义 必填 备注
q text 要识别的图片,需要Base64编码 True 必须是Base64编码(baes64前边不要加上data:image/png;base64)
appKey text 应用ID True 可在应用管理查看
salt text UUID True uuid
curtime text 当前UTC时间戳(秒) true TimeStamp
sign text 签名 sha256(应用ID+input+salt+curtime+应用密钥);input的生成规则见表下的备注 True sha256(应用ID+input+salt+curtime+应用密钥)
signType text 签名类型 true v2
type text 上传类型, 仅支持base64上传,请填写固定值1 True 1
searchType text 搜索类型,img为图片搜题,text为文本搜题 false img

签名sign生成方法如下:

signType=v2;

sign=sha256(应用ID+input+salt+curtime+应用密钥)。

其中,input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20)。

需要注意的是,API对题目图片有如下要求:

规则 描述
传输方式 HTTPS
请求方式 POST
字符编码 统一使用UTF-8编码
请求格式 表单
响应格式 JSON
图片格式 jpg/png/bmp
图片大小 1MB以下
文字长度 50个字符以下
Demo开发:

这个demo使用python3开发,包括maindow.py,QuestionClass.py,OcrQuestion.py 三个文件,分别为demo的界面、界面逻辑处理和ocr搜题方法的封装。

  1. 界面部分:
    UI 部分较简单,主要功能为选择待题目图片、选择批改结果存储路径。其布局代码如下:
root=tk.Tk()
root.title(" youdao ocr question test")
frm = tk.Frame(root)
frm.grid(padx='50', pady='50')
# 选题和结果保存按钮
btn_get_file = tk.Button(frm, text='选择题目图片', command=get_files)
btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20')
text1 = tk.Text(frm, width='40', height='10')
text1.grid(row=0, column=1)
btn_get_result_path=tk.Button(frm,text='选择搜索结果路径',command=set_result_path)
btn_get_result_path.grid(row=1,column=0)
text2=tk.Text(frm,width='40', height='2')
text2.grid(row=1,column=1)
# 搜题按钮
btn_sure=tk.Button(frm,text="搜题",command=search_question_files)
btn_sure.grid(row=4,column=1)
root.mainloop()
  1. 其中启动按钮btn_sure的绑定事件search_question_files()来根据题目照片搜题,并在完成后打开结果存储路径:
def search_question_files():
    question.start_ocr()
    os.system('start '+question.result_path)
  1. QuestionClass.py
    这里主要配合UI的逻辑,调用搜题方法。
    首先定义一个类Question:
class Question():
    def __init__(self,file_paths,result_path):  
        self.file_paths=file_paths    # 题目照片存储路径
        self.result_path=result_path  # 结果路径
  1. start_ocr()方法调用connect()方法依次搜题并保存结果。
def start_ocr(self):
    for file_path in self.file_paths:
        result=connect(file_path)
        print(file_path)
       self.save_result_format(file_path,result)
  1. 从OcrQuestion.py的connect方法获取的结果是json格式,save_result_format()方法,解析从接口取得的接口,格式整理,保存结果到html:
def save_result_format(self,file_path,result):
        result_file_name=os.path.basename(file_path).split('.')[0]+'_result.html'
        f=open(self.result_path+'/'+result_file_name,'w',encoding='utf-8')
        result_json= json.loads(result)
        if result_json['errorCode'] == '0':
            data=result_json['data']
            questions=data["questions"]
            text=data["text"]
            f.write("题目识别:<br/>"+text)
            i=0
            for answers in questions:
                i=i+1
                subject="科目:"+answers["subject"]+"<br>"
                answer="答案:" +answers["answer"]+"<br>"
                analysis="分析:"+answers["analysis"]+"<br>"
                knowledge="知识点:"+answers["knowledge"]+"<br>"
                print(subject+answer+analysis+knowledge)
                result_each="<h3>搜题结果"+str(i)+"<br></h3>"
                result_each=result_each+subject+answer+analysis+knowledge+"<br>=================这是一条分隔符============<br>"
                f.write(result_each)
        else:
            f.write("result error code:"+result_json['errorCode'])
  1. OcrQuestion.py
    OcrQuestion.py 中封装请求ocr搜题API的方法,其中最主要的方法是connect():
def connect(pic_path):
    f = open(pic_path, 'rb')  # 二进制方式打开图文件
    q = base64.b64encode(f.read()).decode('utf-8')  # 读取文件内容,转换为base64编码
    f.close()
    data = {}
    data['q'] = q
    data['signType'] = 'v2'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['salt'] = salt
    data['sign'] = sign
    response = do_request(data)
    result=response.content.decode('utf-8')
    print(result)
    return result
  1. API响应结果示例
{
    "data":{
        "questions":[
            {
                "score":0.9875,
                "answer":"D",
                "subject":"历史",
                "id":"a9db8f1252778836c99204e5cf9d7738",
                "analysis":"",
                "type":"",
                "content":"xxx",
                "knowledge":""
            }
        ],
        "text":"xxx"
    },
    "errorCode":"0"
}
  1. 响应结果是以json形式输出,包含字段如下表所示:
字段 含义
errorCode 识别结果错误码,一定存在。 详细信息可参见 错误代码列表
data 数据
-text 图片题目OCR结果
-questions 相关题目
–id 答案
–content 题目内容
–answer 答案
–analysis 解析
–knowledge 知识点
效果展示
demo操作演示

来看看结果吧:

数学题搜索结果展示:

总结

有道智云的整体搜索API文档清晰,题目范围极广而且可以自动判断学科,搜索结果可谓“举一反三”,会返回几个可能的相近题目,很具有参考价值,值得推荐!数学解答题会返回相关图片、公式等,用在web项目中效果灰常不错。

项目地址:https://github.com/LemonQH/OcrQuestion

目录
相关文章
|
9天前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
|
2月前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
114 15
|
19天前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
30天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
203 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
19天前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
2月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
234 45
|
1月前
|
存储 API 数据库
使用Python开发获取商品销量详情API接口
本文介绍了使用Python开发获取商品销量详情的API接口方法,涵盖API接口概述、技术选型(Flask与FastAPI)、环境准备、API接口创建及调用淘宝开放平台API等内容。通过示例代码,详细说明了如何构建和调用API,以及开发过程中需要注意的事项,如数据库连接、API权限、错误处理、安全性和性能优化等。
118 5
|
2月前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
363 3
如何使用Python开发API接口?
|
2月前
|
机器学习/深度学习 人工智能 关系型数据库
Python开发
Python开发
50 7
|
2月前
|
前端开发 安全 数据库
使用Python开发独立站的全面指南
本文详细介绍了如何使用Python及其Web框架Django和Flask快速搭建功能完善、易于管理的独立站。从Python和Web开发基础讲起,逐步覆盖环境搭建、项目创建、数据库设计、视图与URL路由、模板创建、表单处理、测试调试、部署优化及安全维护等内容,旨在帮助开发者高效构建稳定的Web应用。
106 1