专业搜题,家长好帮手

很早之前曾经做过一个图片识别的项目,当时有一项功能是整题识别,即传入数学题的截图,可通过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()
    

    其中启动按钮btn_sure的绑定事件search_question_files()来根据题目照片搜题,并在完成后打开结果存储路径:

    def search_question_files():question.start_ocr()os.system('start '+question.result_path)
    
  2. QuestionClass.py

    这里主要配合UI的逻辑,调用搜题方法。

    首先定义一个类Question:

    class Question():def __init__(self,file_paths,result_path):   self.file_paths=file_paths     # 题目照片存储路径self.result_path=result_path # 结果路径
    

    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)
    

    从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=0for answers in questions:i=i+1subject="科目:"+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'])
    
  3. 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'] = qdata['signType'] = 'v2'curtime = str(int(time.time()))data['curtime'] = curtimesalt = str(uuid.uuid1())signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRETsign = encrypt(signStr)data['appKey'] = APP_KEYdata['salt'] = saltdata['sign'] = signresponse = do_request(data)result=response.content.decode('utf-8')print(result)return result
    
    API响应结果示例
    {"data":{"questions":[{"score":0.9875,"answer":"D","subject":"历史","id":"a9db8f1252778836c99204e5cf9d7738","analysis":"","type":"","content":"xxx","knowledge":""}],"text":"xxx"},"errorCode":"0"
    }
    

    响应结果是以json形式输出,包含字段如下表所示:

字段 含义
errorCode 识别结果错误码,一定存在。 详细信息可参见 错误代码列表
data 数据
-text 图片题目OCR结果
-questions 相关题目
–id 答案
–content 题目内容
–answer 答案
–analysis 解析
–knowledge 知识点

效果展示

demo操作演示

来看看结果吧:

数学题搜索结果展示:

总结

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

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

哈哈,我用Python开发了一个搜题神奇相关推荐

  1. 记录python开发第一个app,实现word转html的桌面应用

    记录python开发第一个app word转HTML功能 Pyqt5图像化UI 打包app 1.安装py2app 2.创建setup.py文件 3.解决报错py2applet:command not ...

  2. python交互式程序设计导论第二周_沧州学堂云Python 交互式程序设计导论搜题公众号...

    关注公众号[帅搜]即可免费查询 网站:xuanxiu365(网址速记:选修365) 支持:大学网课,智慧树,知到,超星,,,选修课,,外语类,财会类,建筑类,职业资格,考试,类,外贸类,计算机类等考试 ...

  3. chatgpt赋能python:Python用什么软件搜题?推荐4款具有高效与准确性的题库搜索工具

    Python用什么软件搜题?推荐4款具有高效与准确性的题库搜索工具 Python是一种高级编程语言,基于其简洁的语法和强大的扩展能力,Python在越来越多的领域中得到广泛应用.其中,Python在教 ...

  4. 推荐一个搜题小程序,一起搜题小程序,搜题找答案不用注册也没次数限制

    给大家推荐一个搜题小程序,上网课的时候用来搜课后习题,章节测试非常好用.还可以搜会计.教师.建筑.公务员等科目的考试题目. 用微信扫下面二维码或者在微信里面搜索小程序"一起搜题"就 ...

  5. java实战开发小工具-------搜题软件,导出jar包变成exe软件!可运行没有安装java jdk电脑中 快速用来巩javase知识

    javase做一个小工具,做一个搜题软件.可以倒出jar包再经过exej4变成exe软件 用 eclispse进行做出来的,就是简简单单实现了面板功能和一个post和get请求.post和get请求用 ...

  6. 如何用python做一个会聊天的女朋友_戏精程序员,用python开发了一个女朋友,天天秀恩爱...

    很多人都知道,程序员大部分都是单身狗,然而,无奈Python实在太强大,居然可以用来开发一个女朋友出来. 其实,这个女朋友类似很多视频中,那些假装自己有女朋友或男朋友的人一样,也是在假装哦,但是程序员 ...

  7. 用Python开发了一个进销存管理的小软件

    研究生毕业之后,就进入国企工作,工作内容偏产品和售前,几乎没写过代码了,有个朋友是开游泳馆的,也会有少量商品的售卖,问我能不能给她开发一个小软件,记录商品的入库出库,统计下金额,恰好工作中今年也用到了 ...

  8. 大学生怎么高效的免费搜题?怎么获取题库API接口快速开发自己的搜题产品?

    题库的优势 一个多亿的题库不仅免费搜题而且提供开放接口,便于用户快速开发对接搜题产品 API接口开放对接 许多在校生特别是IT专业的学生很多都想制作一款受欢迎的产品,而搜题产品正好符合广大学生的需求, ...

  9. python自动答题免费_直播答题?Python助你自动搜题之新手篇!

    承接前文关于Python自动搜题的介绍https://zhuanlan.zhihu.com/p/32828411,此篇面向新手小白进行解析,助你成功运行自动搜题的python程序. A部分是介绍思路, ...

  10. python自动答题软件_直播答题?Python助你自动搜题之新手篇!

    承接前文关于Python自动搜题的介绍 https:// zhuanlan.zhihu.com/p/32 828411 ,此篇面向新手小白进行解析,助你成功运行自动搜题的python程序. A部分是介 ...

最新文章

  1. HashMap.values().addAll()异常
  2. mysql城市联动表怎么建_MVC4.0搭建的省市县三联动,包含数据库
  3. single-number-ii
  4. flask框架----蓝图
  5. 第三次作业:“我去图书馆”公众号用户体验分析
  6. linux 自动发邮件脚本,科学网—用linux脚本自动发送和收取邮件 - 周宇的博文
  7. [转载]高性能托管应用程序设计入门
  8. 那些一心想要离开 BAT 的人,后来怎么样了?
  9. 如何在Eclipse配置Tomcat
  10. java 操作linux_java程序里调用linux命令
  11. 一图看懂阿里云原生发布
  12. Spring源码解析
  13. chrome中验证码图片不显示的解决办法
  14. hans wouters_Hans教学丨十大进阶长板平花招式
  15. 惠云转债上市价格预测
  16. 如何提高网站在百度搜索的排名
  17. 自动化部署工具瓦力(walle)的安装
  18. 艾莫基IMG老板李洪波欠销售提成不给,反而颠倒黑白,抹黑对方
  19. 选择什么样的Linux操作系统好?
  20. directx修复工具win7_win10下安装win7双系统的惨痛教训!

热门文章

  1. 《工业设计史》第七章:艺术变革与现代设计
  2. 串口通讯 电脑和dsp_Sci 使用DSP2812的SCIA模块和PC机进行串口通信,用FIFO功能实现数据的发送和接受。 DSP program 261万源代码下载- www.pudn.com...
  3. ie11加载项启用不了 java,IE11网页加载项和控件不能运行怎么办
  4. 计算机硬件软件基础知识(小白)
  5. Access入门之基本操作和认识
  6. 计算机网络生活应用,浅谈计算机网络在生活中的应用
  7. crackme005
  8. 数据结构视频教程 -《[北大张铭 精品课程版]数据结构与算法(C++)》
  9. Google技巧:crack web sites
  10. 秒赞机器人好友_qq空间秒赞机器人好友 qq空间说说秒赞神器