您的位置:首页 > 编程语言 > Python开发

Python起点字体加密破解

2019-01-14 19:22 591 查看

import requests
import re
from lxml import etree
from fontTools.ttLib import TTFont
from io import BytesIO

url = ‘https://book.qidian.com/info/1012932890
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36’,
}
r = requests.get(url=url, headers=headers)

tree = etree.HTML(r.text)
#先拿到span的class名字,它和字体的URL路径中的字体文件名字是对应的,每次刷新两个都会一起改变,所以每次请求都先把classname取出来在下边拼接字体URL使用
classname = tree.xpath(’//div[contains(@class,“book-info”)]/p/em/span/@class’)[0]
#拼接得到字体的url,因为起点网页中的加密字体的几个URL中只有最后 {名字}.ttf 在变化,所以每次请求时把classname抓出来进行拼接使用
font_url = ‘https://qidian.gtimg.com/qd_anti_spider/{}.ttf’.format(classname)

#得到span中你要爬取的内容
pattern = re.compile(r’(.*?)’)
ret = pattern.search(r.text)
string = ret.group(1)
print(string)
#得到如下字符串

𘟍𘟎𘟉𘟇𘟐

#将字体文件下载下来
r_font = requests.get(url=font_url, headers=headers)
filename = font_url.split(’/’)[-1]
with open(filename, ‘wb’) as fp:
fp.write(r_font.content)

#打开这个字体,想要不下载到本地直接在内存中读取字体的话必须得用BytesIO打开字体内容
font = TTFont(BytesIO(r_font.content))
#找到字体文件内的映射关系(字典)
dic = font.getBestCmap()
#关闭这个字体
font.close()

print(dic)
#{100317: ‘three’, 100319: ‘seven’, 100320: ‘four’, 100321: ‘five’, 100322: ‘zero’, 100323: ‘nine’, 100324: ‘eight’,100325: ‘two’, 100326: ‘six’, 100327: ‘period’, 100328: ‘one’}
#因为字体文件中的映射关系对应的是英文,如上;所以自己再设计一个字典,找出html中对应的数字
font_dic = {‘one’: ‘1’, ‘two’: ‘2’, ‘three’: ‘3’, ‘four’: ‘4’, ‘five’: ‘5’, ‘six’: ‘6’, ‘seven’: ‘7’, ‘eight’: ‘8’,‘nine’: ‘9’, ‘zero’: ‘0’, ‘period’: ‘.’}
#将string按照分号进行切割

𘟍𘟎𘟉𘟇𘟐

#因为最后有一个封号所以最后会有一个空的元素,所以切一下片
lt = string.split(’;’)[:-1]
#取出对应数字进行拼接
number = ‘’
for code in lt:
code = code.lstrip(’&#’)
char_code = dic[int(code)]
number_code = font_dic[char_code]
number += number_code
print(number)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: