Anekys 发表于 2020-6-30 18:49

[已和谐]学小易PC版(支持以图搜题)

本帖最后由 Anekys 于 2020-10-31 21:52 编辑

最早看到学小易接口抓取的帖子时,就萌生了自己弄个PC版的想法
抓取接口帖子链接:https://www.52pojie.cn/thread-1205193-1-1.html
但是后来看到有人先我一步发出来了之后就没发了.
但是看到之前发布的成品都带上了和谐的标题,我就试了一下我的
目前还没有出现账号异常问题
我看了一下那些贴上和谐的源码,大部分都简化了调用接口时发包的消息头
个人感觉可能是因为这个原因导致的账号异常,因为我为了测试接口专门注册了一个账号
但是直到现在都没有出现异常的问题

https://static.52pojie.cn/static/image/hrline/1.gif
纯小白一个,写法简单,大佬们勿喷.以图搜题是通过调用百度云的文字识别API实现的
因为自己懒,就没有删除百度云的APIkey等等东西,想用的可以直接用,我平常基本上不会去用它干什么.
最后贴上代码:
import requests
import os
from aip import AipOcr
#这里调用了百度云智能大脑的图像识别API,以下三个Key均为调用API需要,可在你自己的百度云管理界面查询到
token=""                            #申明一个全局变量Token
APP_ID='16593668'                           #你的百度云APP_ID
APP_KEY='FhqfbBANUQ9H1Q1pj8tS97QH'          #你的百度云Key
SECRET_KEY='VtPljGlCiXym52xRmiZCoUNX4Z4dsmWT'   #你的百度云Secret_Key(老版本百度云的 Access Key)
client=AipOcr(APP_ID,APP_KEY,SECRET_KEY)
def getanswer(text,token):                #一个简单的post请求获取答案内容
    if (token==False):
      return False
    headers={
      "Host":"app.51xuexiaoyi.com",
      "token":token,
      "device":"Auhqehd3s6Ml6mXky_5dV-Uv4zsdXeUYY7wKFktkH1ag",
      "platform":"android",
      "app-version": "1.0.6",
      "t":"1592904062239",
      "s":"e6a47dea8298225b1e9a9366bead8083",
      "content-type":"application/json;charset=utf-8",
      "accept-encoding":"gzip",
      "user-agent":"okhttp/3.11.0"
    }
    url="https://app.51xuexiaoyi.com/api/v1/searchQuestion?keyword="+text
    # data={"keyword":text}
    res = requests.post(url,headers=headers)
    # r=res.text.replace('%u',r'\\u').encode('utf-8').decode('unicode_escape')      #如果将返回值以文本形式显示本条语句可将usc2转为ansi编码进而正常显示文本内容
    r=res.json()      #返回的内容本身就是json
    if(r['code']==200):   #判断获取到的内容状态码是不是200(200代表着成功)
      #print(type(r['data']))
      return r['data']      #若成功则返回获取到的问题和答案(返回的类型是列表)
    else:
      return r['msg']         #若失败则返回错误信息
def outanswer(li):
    if isinstance(li,list):         #由于获取成功返回的是列表,所以这里先判断是不是列表进而得知是否成功
      for i in li:                #若成功,则可通过迭代的方式遍历列表
            print(" ")
            print('问题:')         #列表中的每个元素都是一个字典,这里通过格式化输出把字典里需要的内容输出
            print(i['q'])
            print(" ")            #输出空行为了看起来更方便
            print('答案:')
            print(i['a'])
            print(" ")
            print('*'*50)
    else:
      print(li)                   #若参数不为列表,则返回的是错误信息,所以这里可以打印错误信息
def login():            #调用API获取账号的token
    username=input("请输入账号:")
    password=input("请输入密码:")
    url="https://app.51xuexiaoyi.com/api/v1/login?username="+username+"&password="+password
    headers={
      "Host":"app.51xuexiaoyi.com",
      "device":"Auhqehd3s6Ml6mXky_5dV-Uv4zsdXeUYY7wKFktkH1ag",
      "platform":"android",
      "app-version":"1.0.6",
      "t":"1593008524987",
      "s":"53029a76022a2f4a52c11f08a84759c0",
      "Content-Type":"application/json; charset=utf-8",
      "Accept-Encoding":"gzip",
      "User-Agent":"okhttp/3.11.0"
    }
    res=requests.post(url,headers=headers).json()
    if (res['code']==200):
      f=open('token.txt','w+')
      f.write(res['data']['api_token'])
      f.close()
      print("登陆成功!")
      return res['data']['api_token']
    else:
      return res['msg']
def OCR(imagename):   #参数为图片文件路径,函数的功能为获取图片数据,并通过百度云的OCR文字识别提取出图片中的文字.
    with open(imagename, 'rb') as fp:
      image=fp.read()
      retlist=client.basicGeneral(image)
      text=""                                     #由于百度云的OCR识别将结果作为一个列表进行返回,所以这里通过for循环将列表迭代为一个文本
      for i in retlist['words_result']:
            text=text+i['words']
      return text
def Ocrmode():                        #OCR文字识别模式,可将题目截图到任意目录,输入图片绝对路径一键进行题目提取及答案获取的操作
    while True:
      print("请输入图片路径:")
      path=input("ocrmode>>>")
      if(os.path.exists(path)):         #检测图片是否存在,若存在,则进行文字识别并查询答案
            text=OCR(path)
            res=getanswer(text,token)
            outanswer(res)
      elif path=="exocr" or "EXOCR":
            return
      else:
            print("图片不存在或没有访问权限!")
def main():
    print('Welcome to "学不易" 输入"exit"或点"x"即可退出')
    print('直接输入题目即可获取答案,也可输入"OCR"进入图片识别模式')
    try:
      f=open('token.txt','r+')
      token=f.read()
      f.close()
      if(token==""):
            token=login()
    except:
      token=login()
    while True:
      questions=input(">>>")
      if len(questions)>=6:
            res = getanswer(questions,token)
            outanswer(res)
      elif questions == 'exit':
            break
      elif questions=="ocr" or "OCR":
            Ocrmode()
      else:
            print("题目必须大于6个字符")
    exit()
if __name__ == "__main__":
   main()

https://static.52pojie.cn/static/image/hrline/1.gif

代码我还贴到了GitHub上,第一次玩儿GitHub,方方面面都是现学现卖的{:301_1008:}

不过还是要厚着脸皮求个Star的
GitHub地址:https://github.com/Finalweapons/Xuexiaoyi


最后的最后,我也不知道别人的和谐了我再发算不算重复贴.....如果算的话管理员就帮忙删了吧



https://static.52pojie.cn/static/image/hrline/1.gif

看到好多人要编译的exe版,就弄了一个上传到抗揍云,方便不玩儿Python的童鞋们使用
蓝蓝的链接:https://niub.lanzouj.com/iJ7uNe9dscb


https://static.52pojie.cn/static/image/hrline/1.gif
已和谐了,忙于工作没时间更新,不过最近用夸克浏览器的搜题还挺好用的,有兴趣的可以去尝试搜一下题


zxm870973 发表于 2020-6-30 20:47

账号可以去在线接码的注册,防止被封自己的号{:1_926:}

Anekys 发表于 2020-7-4 09:39

bags 发表于 2020-7-3 22:41
账号问题,之前偷懒,参数没加全,封了以后我参数加全用其他账号没事,但是用回我自己账号不久用封了(看了 ...

我之前也考虑过自己做一个截图功能然后加个窗口或者通过之前网上的调用微信或者QQdll文件来截图,不过调用dll目前好像不能用了,网上的各个版本也都不生效.自己做截图的话,功能又不如QQ微信那么好,所以后来就放弃了,干脆QQ微信截图,然后直接识别算了

hjt1999 发表于 2020-6-30 19:03

支持!!!!!!!!!!!!!!!!!!!!!!

沐雨红尘 发表于 2020-6-30 19:03

风雨3137 发表于 2020-6-30 19:07

个人觉得百度密钥还是删了再发好

DaRuiDd 发表于 2020-6-30 19:59

你都学了python那些知识哇

ciker_li 发表于 2020-6-30 22:00

学习学习,感谢分享

大雄叫小明 发表于 2020-6-30 22:47

学习了!

泠色调 发表于 2020-7-1 08:29

OTS麒麟 发表于 2020-7-1 11:29

代码能写油猴插件里不,如果可以又是一个神器
页: [1] 2 3 4
查看完整版本: [已和谐]学小易PC版(支持以图搜题)