之前写接口自动化时,reportlab+svglib可以将项目的验证码接口返回的svg格式的数据转换为png,再通过第三方接口识别,由于之前使用的python版本为3.8,而后面开发的接口自动化平台的版本为3.10,导致reportlab+svglib版本不兼容出现各种问题。
解决方法:
1. 构建python镜像时,新增如下安装包配置:sox ffmpeg cairo cairo-dev texlive-full
由于使用的是python的alpine版本的镜像,没有apt包管理器,这里使用apk包管理器下载reportlab所需的必要依赖包pycairo,否则无法成功下载依赖包,reportlab库的方法就无法调用。
apk add --no-cache sox ffmpeg cairo cairo-dev texlive-full
2. 上述容器环境安装好以后,需要更新reportlab所需的依赖包环境,执行:强制更新及修复reportlab所需依赖包
pip install --upgrade --force-reinstall reportlab
3. 如上步骤清晰以后,在dockerfile中加入上述步骤,构建镜像:
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk upgrade && \
apk add --no-cache tzdata mariadb-dev gcc libc-dev sox ffmpeg cairo cairo-dev texlive-full && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip && \
pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt && \
pip install --upgrade --force-reinstall reportlab && \
chmod 777 ./entrypoint.sh
4. 容器创建完成以后,进入容器,查看当前python包的环境
pip show pycairo、 pip show rlPyCairo、 pip show reportlab
svglib必须reportlab包环境,reportlab必须rlPyCairo环境,而rlPyCairo的安装又必须pycairo依赖包
至此整个svglib+reportlab的环境以及配置完成。后端将验证码接口返回的svg转png代码如下:
def svg_to_png(data)->str:
with open(os.path.join(plugin_path, 'captcha', 'captcha.svg'),'wb') as f:
f.write(data.encode()) #将字符串编码后写入svg文件
pic = svg2rlg(os.path.join(plugin_path, 'captcha', 'captcha.svg'))
renderPM.drawToFile(pic, os.path.join(plugin_path, 'captcha', 'captcha.png'))
return os.path.join(plugin_path, 'captcha/captcha.png')
参数data就是接口返回的svg格式的字符串:
在后置脚本中使用:查看图鉴网识别的验证码图片:至此,通过接口平台识别项目验证码功能调试完成