字体反爬之快手
Posted 「已注销」
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字体反爬之快手相关的知识,希望对你有一定的参考价值。
快手的直播列表页面的粉丝数用了字体反爬,之前在字体反爬之猫眼电影中提过这类问题的解决方案。
字体反爬的核心是找出字体之间不变的映射关系。
阅读步骤
- 效果展示
- 项目地址
- 快手字体反爬机制图示
- 不变的关系
- 总结
效果展示
项目地址
快手字体反爬机制图示
不变的关系
每个请求字体文件不同,每个字体文件字体的笔画不同。
通过对比n个字体文件找到一个关系
- 字体的笔画x轴并且on=“1”的关系是固定的,因此我们可以通过这个关系构造一个hash,然后和默认字体进行映射。
def parser_contour(self, font_xml):
for k, v in self.font_map.items():
try:
element = font_xml.xpath('//TTGlyph[@name=""]'.format(k))[0]
_pts = element.xpath('./contour/pt')
pts=[''.join(pt.xpath('./@x'))for pt in _pts if ''.join(pt.xpath('./@on'))=='1' ]
if not pts: continue
contours = [str(e) for e in pts]
self.contour_to_font[md5(json.dumps(contours))]=v
except Exception:
raise Exception('字体改版,请重新更新settings中的配置,key:,val:'.format(self.path,k,v))
def parser_map(self, font_xml):
for element in font_xml.xpath('//TTGlyph'):
try:
name = ''.join(element.xpath('@name')[0])
_pts = element.xpath('./contour/pt')
pts = [''.join(pt.xpath('./@x')) for pt in _pts if ''.join(pt.xpath('./@on')) == '1']
if not pts: continue
contours = [str(e) for e in pts ]
self.uni_to_contour[name.upper()] = md5(json.dumps(contours))
except Exception as e:
raise Exception('字体改版,请重新更新settings中的配置,error:'.format(self.path, e))
总结
- 字体反爬的关键是找到唯一不变的映射关系
以上是关于字体反爬之快手的主要内容,如果未能解决你的问题,请参考以下文章