前言
本片帖子的基础是前几天在论坛上看到了一篇关于这个的帖子:https://www.52pojie.cn/thread-1910333-1-1.html
这里我也at一下帖子作者:@jing99
网站:aHR0cHM6Ly93d3cuemhpaHUuY29tL21hcmtldC9wYWlkX2NvbHVtbi8xNzMwNjA3ODEwMjI2Njg4MDAwL3NlY3Rpb24vMTczMDE4MTE0ODk2ODMyNTEyMA==
我对于英文特别不敏感,代码很多不会写。所以以下的代码中,如果有问题,请见谅~
我可能比大家想象中的还要小白,所以此篇帖子我会站在比我更小白的角度,尽量让大家看得明白
并且我很喜欢互相交流学习,如果需要交流学习,请私信~~~
本篇分析以学习为目的,禁止触犯法律法规。
浏览器:edge
感谢当前的AI浪潮吧,让编程基础又降低了很多门槛。此分析帖子的很多代码都是全靠AI,我自己只是稍微修改了一下~
分析
打开网址,F12。
[color=]发现网页直接跳转了
~
那么,就新建一个标签页,先F12,设置,禁用JS
再次粘贴网址,跳转。对比一下网页的文字和html源代码中的文字。
下一步确认一下文字动态还是静态
按照上面的方法,再次新建一个标签页,重新打开网址,发现是两次源代码的文字是不一样的。确认是动态加载!
并且字体为base64编码,提取出来,保存为TTF文件!
这里推荐一个查字体的网站:https://www.bejson.com/ui/font/
打开网站后,上传字体文件。
分析到这里,大致的思路已经出来了~
读取网页源代码->提取base64编码的字体文件->取出来字体文件中的字符图片以及真实的Unicode字符->识别图片中的文字->按照规则进行文章的文字替换
读取网页源代码
提取base64编码的字体文件
代码来自于AI
取出来字体文件中的字符图片以及真实的Unicode字符
现在的目的达到了,接下来就是识别这个字符的字,然后把文章的"要"替换为"发"
现在软件可以通过uni8981查询到这个字是"要",但是软件是不知道这个字代表的是"发"
所以,我的思路就是使用图像识别
识别图片中的文字
以下非黑色字体为在实现过程中的曲折,没有很细致,可以跳过
既然python是pip调包侠
那么,用哪个包呢?因为之前没有使用过类似的包,只要靠搜索引擎了
初识:Tesseract
这是一个由谷歌开发的文字识别库,好像挺强大的,但是win系统需要安装一个exe程序。安装好之后可能是设置问题,一直没有识别出来。是TM的一个都没有识别出来~
查文档,正如开篇所讲,确实英文不好。所以放弃~~~
初识:easyocr
这个就不介绍了,PIP过程中,下载的包很大。当然,识别库都需要下载,理解;
遇到的问题就是某些可以识别,某些不能识别。当然,对于一个github上一万多个star的库来说,肯定是我的问题。文档还是一如既往的英语~放弃
后来遇到了CnOCR。使用这个的主要原因是因为有中文文档,最主要的是他有一个在线测试的网站,可以把你的图片上传上去测试~就试了一下。
没问题就决定使用这个库了。接下来一顿pip
果然,厉害了我的GUO(其实后面他给的网址没了,其实不是因为V*N的原因)。。。我就知道过程没有那么顺利~
仔细查看官方文档后,发现需要下载检测模型和识别模型。因为网络原因不能下载,那么就需要手动下载后放入本地指定目录。干吧
已经提取出来了。然后就是把识别到的文字和真实的文字放一起,就可以下一步了~
按照规则进行文章的文字替换
然后进行原文章对比校验
不出意外的话,还是出意外了~
这里其实找了以下原因,是因为字符重复替换的问题
这里解释一下
如果原文本是:一二一二一二一二一二一二一二一二
你识别出来的字符是数组是[("一","二"),("二","一")]
那么替换两次,
第一次把一替换为二,这个时候源文本就全是二了
第二次把二替换为一,文本就全是一了。原理差不多就是这么个原理
从断点中也可以看的出来,数组是从00开始替换;
到02的时候把文章的"不"替换为了"用"
到31的时候又把文章的"用"替换了"可"
到04的时候把个替换为了生
到30的时候又把"生"替换为了"和"
为了解决这个问题,我想出来了一个方案。
新建一个空数组,记录已经替换的位置。下次替换的时候如果此位置已经替换,则跳过不替换~(此代码依旧来自于AI)
[Python] 纯文本查看 复制代码replaced_positions = set()
for old, new in result:
for i, char in enumerate(conent):
if i not in replaced_positions and char == old:
conent = conent[:i] + new + conent[i+1:]
replaced_positions.add(i)
elif i in replaced_positions:
continue
with open('正文.txt','w',encoding='utf-8') as f:
f.write(conent)
至此,运行。查看结果。
全部结束~