案例需求:
- 解决**同城二手车价格字体加密
-
查找字体加密位置:
我们发现在这段代码中,base64后面就是加密的字体样式
代码实现:
- 导入库
import base64
from io import BytesIO
- 将base64编码字体解码成二进制编码,并保存为woff文件
def make_font_file(base64_string: str):
# 将base64编码的字体字符串解码成二进制编码
bin_data = base64.decodebytes(base64_string.encode())
with open('textwoff.woff', 'wb') as f:
f.write(bin_data)
return bin_data
- 将解码字体保存为xml
def convert_font_to_xml(bin_data):
# ByteIO把一个二进制内存块当成文件来操作,
font = TTFont(BytesIO(bin_data))
# 将解码字体保存为xml
font.saveXML("text.xml")
- 查看繁体字编码
- 打开xml文件找到cmap标签,发现code的后四位和我们解码后的繁体字编码后四位可以对应上,再把其中name最后面的数字减一,就是解码后的价格
def run_font(string, fanti):
price = []
s = make_font_file(base64_string=string)
convert_font_to_xml(s)
# 打开xml文件
with open('text.xml', 'r', encoding='utf-8') as f:
xml_data = f.read()
code_num = re.findall('<map code="(.*?)" name="glyph000(.*?)"/>', xml_data)
for f in fanti:
for code, num in code_num:
if code[-4:] == f.encode('unicode-escape')[-4:].decode('utf-8'):
n = int(num)-1
price.append(str(n))
break
if f.encode('unicode-escape')[-4:].decode('utf-8') == '.':
price.append('.')
break
p = ''.join(price)
return p```
# 实现效果:

