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

手撕代码八百里 2021-04-08 13:23:11
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()
    

    其中启动按钮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=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'])
    
  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'] = 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
    
    API响应结果示例
    {
    
    "data":{
    
    "questions":[
    {
    
    "score":0.9875,
    "answer":"D",
    "subject":"历史",
    "id":"a9db8f1252778836c99204e5cf9d7738",
    "analysis":"",
    "type":"",
    "content":"学者们认为,五四运动标志着中国民族意识极大觉醒,表现在<br />A.近代民族民主思想开始传播 B .揭开了反帝反封建斗争的序幕<br />C.开启了近代中国的思想启蒙 D .各阶层民众的广泛动员和参与",
    "knowledge":""
    },
    {
    
    "score":0.9875,
    "answer":"D <br>注意题干“中国民族意识极大觉醒”,结合所学可知,在五四运动过程中,学生、工人、商人都投入到之中,即各阶层民众的广泛动员和参与,符合题意,故D项正确. <br>在戊戌变法前后,中国民族民主思想就已经开始传播,故A项错误. <br>五四运动是一次反帝反封的爱国运动,但不是反帝反封斗争的开始,在这时期还没有明确提出反帝反封的革命纲领,故B项错误. <br>中国近代是在新文化运动期间传播民主思想,进行了思想的启蒙,故C项错误. <br>故选D.",
    "subject":"历史",
    "id":"2f8b9c814f064131cc7b2bead54f15da",
    "analysis":"本题考查五四运动.考查五四运动的意义.考查学生对基础知识的识记、运用能力.",
    "type":"选择题",
    "content":"学者们认为,五四运动标志着中国民族意识极大觉醒,表现在( ) <p class="question_option">A.近代民族民主思想开始传播<br/>B.揭开了反帝反封建斗争的序幕<br/>C.开启了近代中国的思想启蒙<br/>D.各阶层民众的广泛动员和参与 </p>",
    "knowledge":"/人类政治文明发展史/近代中国反侵略、求民主的潮流/五四运动"
    },
    {
    
    "score":0.9875,
    "answer":"D <br>【答案】 <p>D</p> <p></p>",
    "subject":"历史",
    "id":"48a28969d882f20b04ffec15c8f1b94c",
    "analysis":"<p>题目问的五四运动,在戊戌变法前后,中国民族民主思想就已经开始传播,所以A不正确。五四运动是一次反帝反封的爱国运动,但不是反帝反封斗争的开始,在这时期还没有明确提出反帝反封的革命纲领,所以B不正确。中国近代是在新文化运动期间传播民主思想,进行了思想的启蒙,所以C不正确。在五四运动 过程中,学生、工人、商人都投入到之中,所以D正确。</p> <p> </p>",
    "type":"选择题",
    "content":"<p>学者们认为,五四运动标志着中国民族意识极大觉醒,表现在</p> <p></p> <p class="question_option">A.近代民族民主思想开始传播<br/>B.揭开了反帝反封建斗争的序幕<br/>C.开启了近代中国的思想启蒙<br/>D.各阶层民众的广泛动员和参与 </p>",
    "knowledge":"/人类政治文明发展史/近代中国反侵略、求民主的潮流/中国共产党第一次全国代表大会"
    }
    ],
    "text":"学者们认为,五四运动标志着中国民族意识极大觉醒,表现在 A,近代民族民主思想开始传播B揭开了反帝反封建斗争的序幕 C,开启了近代中国的思想启蒙D。 各阶层民众的广泛动员和参与"
    },
    "errorCode":"0"
    }
    

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

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

效果展示

demo操作演示

在这里插入图片描述

来看看结果吧:

数学题搜索结果展示:

在这里插入图片描述

历史题搜题结果

在这里插入图片描述

总结

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

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

版权声明
本文为[手撕代码八百里]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_17623363/article/details/111830479

  1. Python spatial analysis | 01 using Python to calculate global Moran's index
  2. python入门教程13-05 (python语法入门之数据备份、pymysql模块)
  3. Introduction to Python 13-05 (data backup and pymysql module of introduction to Python syntax)
  4. pandas如何操作Excel?还不会的,看此一篇足矣
  5. How does panda operate excel? Not yet. This is enough
  6. 用python连接数据库模拟用户登录
  7. Using Python to connect database to simulate user login
  8. python入门教程13-04 (语法入门之记录相关操作)
  9. Introduction to Python 13-04
  10. python入门教程13-03 (python语法入门之表相关操作)
  11. Introduction to Python 13-03
  12. python的多线程的网络爬虫,待改进
  13. Python multithreaded web crawler, to be improved
  14. 常见加密算法的Python实现:
  15. Python implementation of common encryption algorithms:
  16. python刷题-核桃的数量
  17. Number of walnuts
  18. Python爬虫知乎文章,采集新闻60秒
  19. Python crawler knows articles and collects news for 60 seconds
  20. Python爬虫知乎文章,采集新闻60秒
  21. Python crawler knows articles and collects news for 60 seconds
  22. bbox_overlaps python
  23. bbox_ overlaps python
  24. 7-43 jmu-python-字符串异常处理 (20 分)
  25. 7-43 JMU Python string exception handling (20 points)
  26. n行Python代码系列:两行代码实现视频文件转成系列图片输出
  27. N-line Python code series: two lines of code to achieve video files into a series of pictures output
  28. python-阶乘计算
  29. Python factorial calculation
  30. Python实现定时发送微信消息
  31. python爬取英雄联盟所有英雄皮肤海报
  32. Sending wechat messages regularly with Python
  33. Python crawls all hero skin posters of hero League
  34. 上手Pandas,带你玩转数据(4)-- 数据清洗
  35. Hands on pandas, take you to play with data (4) -- data cleaning
  36. Python继续霸榜,上古语言Cobol重获关注,IEEE 2020编程语言榜单揭晓
  37. 教你用 Python 下载手机小视频
  38. Python continues to dominate the list, ancient language COBOL regains attention, IEEE 2020 programming language list announced
  39. How to download small video of mobile phone with Python
  40. 如何用 Python 在京东上抢口罩
  41. How to use Python to grab masks in Jingdong
  42. arcgis10.2自带的python安装第三方库
  43. 学习Python,你看这篇就够了 | 【详细】Python基础(二)
  44. ArcGIS 10.2 comes with a third-party library for installing Python
  45. Learn python, you see this is enough | [detailed] Python Foundation (2)
  46. 盘点 Django 展示可视化图表的多种方式(建议收藏)
  47. 第123天: Web 开发 Django 管理工具
  48. 盘点 Django 展示可视化图表的多种方式(建议收藏)
  49. python utc时间转北京时间
  50. 想在Python中将Excel文件转换为PDF?来看看这份Aspose.Cells指南
  51. [practice] Python nn.Transformer Mask understanding of
  52. anchors_plane python
  53. python逗号bug
  54. 第115天:Python 到底是值传递还是引用传递
  55. 第118天:Python 之对象的比较与拷贝
  56. 第119天:Python 爬取豆瓣电影 top 250
  57. 从 0 学习 Python 0 - 120 大合集总结
  58. 第124天: Web 开发 Django 模板
  59. Check various ways of displaying visual charts in Django
  60. Python自动化运维工具-Fabric部署及使用总结