这篇博客是我对 hack 进学校教务系统的一个过程总结,详细代码已经放在GitHub上,需要的自取
验证码
打开网站 http://jwxs.hhu.edu.cn/ 直接重定向到了登录页面 http://jwxs.hhu.edu.cn/login
个人觉得这个教务系统界面还是比较好看的,因为大一刚来的时候是旧版的教务,UI还是2000年的风格。
我们面临的第一个问题就是验证码.
全自动区分计算机和人类的公开图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),又称验证码,是一种区分用户是机器或人类的公共全自动程序。
获取验证码图片
打开浏览器的开发者工具,刷新页面,可以发现验证码的路径为
http://jwxs.hhu.edu.cn/img/captcha.jpg
我们先写一小段代码把这张图片下载下来
import requests
prefix = 'http://jwxs.hhu.edu.cn/'
captcha_url = prefix + 'img/captcha.jpg'
src = 'captcha.jpg'
response = requests.get(captcha_url)
file = open(src, 'wb')
file.write(response.content)
file.close()
比如下面这张图片
接下来就是进行文字识别了
识别验证码内容
这里我查阅资料发现需要使用 tesseract
这个OCR引擎,安装半天终于安装好了之后发现识别结果基本不太准,我又找到了一个名字很特殊的python库
ddddocr - 带带弟弟OCR通用验证码识别SDK免费开源版
我抱着玩一玩的心态安装了,并且尝试着识别了几张图片,发现效果还行
import ddddocr
import requests
prefix = 'http://jwxs.hhu.edu.cn/'
captcha_url = prefix + 'img/captcha.jpg'
src = 'captcha.jpg'
response = requests.get(captcha_url)
file = open(src, 'wb')
file.write(response.content)
file.close()
ocr = ddddocr.DdddOcr(show_ad=False)
with open(src, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print('captcha:', res)
>>> captcha: c65a
就它了!
在我尝试了很多张图片后,我发现由于图片中的干扰线,识别成功率其实不是很高,于是我就继续查阅资料,试图图片进行降噪处理。
图片降噪处理
在经历了多次失败之后,我总结了一下原因:
-
网上的解决方案并不一定适合所有种类的验证码,比如说有的验证码只是背景有噪点,或者有很多细线,而我们这个是一条和内容差不多的黑线,按照网上的一些方法降噪很可能连着内容本身也去掉了
-
仔细观察验证码,可以发现都是画面主题是红色,加上黑粗线,那我们只需要将图片中的黑色或者接近黑色的像素块改成白色不就行了?
又是一轮新的尝试,最终发现下面这样处理效果最好
import ddddocr
import requests
from PIL import Image
prefix = 'http://jwxs.hhu.edu.cn/'
captcha_url = prefix + 'img/captcha.jpg'
src = 'captcha.jpg'
dst = 'captcha_p.png'
def process_data(src, dst):
img = Image.open(src)
w, h = img.size
for x in range(w):
for y in range(h):
r, g, b = img.getpixel(