《用Python“破解”某度文库等文库复制的限制》
tips:当个标题党真刺激啊
开发背景
临近期末,CYooQ要写许多作业。迫不得已寻找度娘解决问题,找到之后,CYooQ习惯性地ctrl+c,当ctrl+v时发现,emmm!?没有啊!仔细一看,网页限制了复制。月末生活费告急的CYooQ,不得不寻求Python的帮助。于是CYooQ快马加鞭完成了。可是!可是!可是!午夜的月光触发了作业截至的丧钟!。。。。
前提准备
- Python3.7(目测2.7版本也ok)
- baidu-aip(百度OCR Python SDK)
- 依赖库 pillow(Python的图像处理标准库)
- 还有 keyboard(此项可选,监控键盘,设置快捷键,增强用户体验)
- 一台电脑
- 百度AI开放平台账号(获取到API调用权限)
百度AI开放平台API使用移步到(这)*
也可自行百度
需求分析
- 能够对图片进行处理
- 能够显示出处理后的文字结果
- 能够有较好的用户操作界面(日后优化)
功能实现
- 本地(磁盘中)图片处理功能(初步)
直接读取文件,或者按照用户的输入文件路径进行处理。
使用的函数open()
。建议这样写
with open(img_name,'rb') as File:Img = File.read()
优点是,它会自动关毕文件,不让你的内存变红啊啊啊啊
- 截图(内存中)图片处理功能(初步)
将内存中的数据取出并且保存下来
使用ImageGrab.grabclipboard()
来获取图片(因为目前主流的截图都是会放入剪贴板中的,所以可以直接获取到) 这里会返回一个二进制数据。依赖的库是pillow
,在一开始我们就导入
from PIL import ImageGrab
然后我们要用个东西接住二进制数据Image = ImageGrab.grabclipboard()
再然后我们保存它Image.save(img_name)
这样我们的问题就从内存中转到磁盘中的解决方法了。这样可以保证图片处理模块复用性高!
- 真正的图片处理功能(敲黑板)
我们需要使用百度AI开发平台的Api,稍后会简单介绍一下,或者移步这篇博客百度AI开放平台—简单步骤介绍(多图警告)看具体的操作。
我们在开头就导入
from aip import AipOcr
我们需要写在前面的是,配置信息
""" 你的 APPID AK SK """APP_ID = '这里填你的APP_ID'API_KEY = '同理这里是API_KEY'SECRET_KEY = '同理这里是SECRET_KEY'client = AipOcr(APP_ID, API_KEY, SECRET_KEY)"""结束"""
我们通过第一个功能,open() 文件之后,获取到的Img传入到这client里面。用个Result接住
Result = client.basicAccurate(Img)
-
处理结果显示
1. 直接在黑框框中显示,简单明了。(个人觉得这样简约,有B格)
使用函数的话print()
不香吗》?
2. 日后添加自动存入到剪贴板中的功能。(贴合用户使用)
使用的依赖库pyperclip
(剪切板操作) -
可视化操作界面
日后优化,日后优化,日后优化。哈哈哈 -
截图功能
(可以借用下已有常用软件的模块,系统截图,QQ截图,输入法截图) 基本上能够在指定区域截图的软件都OK。如果以后有机会,跟新个截图的实现方法。还得不断学习学习学习 -
图片保存功能
上面以及说了,请看 截图(内存中)图片处理功能(初步)这个步骤 -
图片一键删除功能
我们可以获取程序当前目录下的所有图片文件,这可难到我了,图片文件辣么多。怎么删?那我们就偷下懒(不写正则),两种方法。
①将全部图片放到一个文件夹里面,直接删除文件夹。os.removedirs(file_name)
②在把内存中图片放到本地时,按照顺序来命名!1.jpg->2.jpg->3.jpg
这样我们可以简单有效的处理,用个for循环,不断try删除,except就退出。
try:for num in range(1,999):i_name = str(num)+r'.jpg'os.remove(i_name)except:print("Done!")
不偷懒写法(写正则)
①先用files = [d for d in os.listdir('.')]
生成器获取到当前目录下的所有文件。写个正则,匹配一下所有已知图片文件的后缀。筛选后再直接for循环用os.remove(img_name)
进行删除!不贴代码了
- (功能快捷键设置)
这是个黑科技!我们先导入
import keyboard
然后再这样
keyboard.add_hotkey('f7',function_1)
OK啦,就这么简单,所以我们可以按f7执行function_1函数啦。真香~
具体代码实现(截图版本):
可以稍微修改下变成,本地版本,直接阉割掉前部分功能,直接读取就ok了。
日后会持续跟新,优化功能,可以关注一下!
from PIL import ImageGrab
from aip import AipOcr
import keyboard,os,time""" 你的 APPID AK SK """
APP_ID = '这里填你的APP_ID'
API_KEY = '同理这里是API_KEY'
SECRET_KEY = '同理这里是SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
"""结束"""
global Count
Count = 1
def Solve():global Count #这是按顺序命名的全局变量try:Image = ImageGrab.grabclipboard() #获取截图图片Name = str(Count)+r'.jpg' Image.save(Name) #保存图片time.sleep(1) #睡觉等待Count = Count + 1with open(Name,'rb') as File:Img = File.read()Result = client.basicAccurate(Img)Num = Result['words_result_num']if (Num==0):print("Your Image Has Not Strings") #你的图片里面没有字哦else:for x in Result['words_result']:print(x['words'])except:print("No Image") #你内存没有图片哦def Clear(): #try a try global Counttry:for x in range(1,999):#目测正常人应该最多用999个吧Name = str(x)+r'.jpg'os.remove(Name)except:print("Done")Count = 1 #我香了,别忘记别人还得接住用,把序号再变为1def main():keyboard.add_hotkey('f7',Solve) #f7处理图片keyboard.add_hotkey('f9',Clear) #f9删除图片keyboard.wait('esc') #按退出键结束程序if __name__ == '__main__':main()
软件测试贴图
日后会持续跟新,优化功能,可以关注一下!
本人软工萌新一枚,程序难免会有些缺现,为了不断完善,还望大家能在评论区或者私信相互交流,互相学习。我尽力及时回复的啦!哈哈哈