快手最新字体反爬
程序员文章站
2024-03-01 09:14:52
...
快手最近更新了字体反爬,经过三天奋战初步解决了快手的字体反爬。
下面截图是一套字体库
这是一套字体库这么多连接可能是为了适应不同浏览器,我看到我司数据库有400多快手主页链接,于是就将这400多主页链接请求了一遍用正则提取了这400多主页中的字体库,去重后发现只有5套不同的,也就可以初步认为快手使用5套字体库每次请求随机发送一套字体库。
于是程序就有了这样一步每次请求先分析用了那套字体库,这很简单自行实现就行。
我们再来看看快手用来替换的字体是类似韩文一样的字符
把字符拿下来然后使用Unicode编码
s = 'ꯎ껾껾뷝'
new_s = (list(map(lambda x:x.encode('unicode_escape'),s)))
print(new_s)
[b'\\uabce', b'\\uaefe', b'\\uaefe', b'\\ubddd']
看到这很多同学应该已经知道怎么回事了,接下来分析字体库,一个有五套我们拿一套来分析。
看到上面的Unicode码和上上图中编码后的码是不是很相似 ,这是需要自己手动写五套映射关系,并且改为“\\uxxxx”的形式,这里我已经改好了
fontscn_h57yip2q = {
'\\uabcf':'4',
'\\uaced':'3',
'\\uaedd':'8',
'\\uaede':'0',
'\\uafcd':'6',
'\\ubdaa':'5',
'\\ubdcd':'1',
'\\ubfad':'9',
'\\uccda':'2',
'\\ucfbe':'7',
}
fontscn_3jqwe90k = {
'\\uaacb':'4',
'\\uabcd':'3',
'\\uacdd':'0',
'\\uaefb':'8',
'\\uafbc':'6',
'\\ubbca':'1',
'\\ubdca':'5',
'\\ubfee':'9',
'\\uccac':'2',
'\\ucfba':'7',
}
fontscn_yuh4hy4p = {
'\\uaabd':'5',
'\\uaadd':'0',
'\\uacde':'9',
'\\uadaa':'2',
'\\uadac':'1',
'\\uadcb':'7',
'\\uaeed':'8',
'\\ubebb':'3',
'\\ucbdc':'6',
'\\ucccf':'4',
}
fontscn_qw2f1m1o = {
'\\uabcb':'4',
'\\uaccd':'3',
'\\uacda':'0',
'\\uaeff':'8',
'\\uafbb':'6',
'\\ubdca':'1',
'\\ubdcc':'5',
'\\ubfef':'9',
'\\uccaa':'2',
'\\ucfba':'7',
}
fontscn_yx77i032 = {
'\\uabce':'4',
'\\uaccd':'6',
'\\uaeda':'8',
'\\uaefe':'0',
'\\uafed':'3',
'\\ubaaa':'5',
'\\ubddd':'1',
'\\ubfad':'2',
'\\ubfae':'9',
'\\uc44f':'7',
}
到这里快手的字体反爬就解决的差不多了,首先是解析网页知道是用那一套字体库,然后拿到的特殊字符转为Unicode码,最后将得到的Unicode跟对应的字体库比较得到正确的数据
li = []
s = 'ꯎ껾껾뷝'
print(s)
new_s = (list(map(lambda x:x.encode('unicode_escape'),s)))
print(new_s)
for i in new_s:
try:
num = fontscn_yx77i032[str(i)[3:-1]]
li.append(num)
except KeyError:
continue
print(li)
ꯎ껾껾뷝
[b'\\uabce', b'\\uaefe', b'\\uaefe', b'\\ubddd']
['4', '0', '0', '1']
def parsingChar(type,data):
fontscn_h57yip2q = {
'\\uabcf':'4',
'\\uaced':'3',
'\\uaedd':'8',
'\\uaede':'0',
'\\uafcd':'6',
'\\ubdaa':'5',
'\\ubdcd':'1',
'\\ubfad':'9',
'\\uccda':'2',
'\\ucfbe':'7',
}
fontscn_3jqwe90k = {
'\\uaacb':'4',
'\\uabcd':'3',
'\\uacdd':'0',
'\\uaefb':'8',
'\\uafbc':'6',
'\\ubbca':'1',
'\\ubdca':'5',
'\\ubfee':'9',
'\\uccac':'2',
'\\ucfba':'7',
}
fontscn_yuh4hy4p = {
'\\uaabd':'5',
'\\uaadd':'0',
'\\uacde':'9',
'\\uadaa':'2',
'\\uadac':'1',
'\\uadcb':'7',
'\\uaeed':'8',
'\\ubebb':'3',
'\\ucbdc':'6',
'\\ucccf':'4',
}
fontscn_qw2f1m1o = {
'\\uabcb':'4',
'\\uaccd':'3',
'\\uacda':'0',
'\\uaeff':'8',
'\\uafbb':'6',
'\\ubdca':'1',
'\\ubdcc':'5',
'\\ubfef':'9',
'\\uccaa':'2',
'\\ucfba':'7',
}
fontscn_yx77i032 = {
'\\uabce':'4',
'\\uaccd':'6',
'\\uaeda':'8',
'\\uaefe':'0',
'\\uafed':'3',
'\\ubaaa':'5',
'\\ubddd':'1',
'\\ubfad':'2',
'\\ubfae':'9',
'\\uc44f':'7',
}
woff_dict = {'h57yip2q':fontscn_h57yip2q,'3jqwe90k':fontscn_3jqwe90k,'yuh4hy4p':fontscn_yuh4hy4p,'qw2f1m1o':fontscn_qw2f1m1o,'yx77i032':fontscn_yx77i032}
li = []
new_data = (list(map(lambda x:x.encode('unicode_escape'),data)))
for i in new_data:
if len(str(i))>5:
num = woff_dict[type][str(i)[3:-1]]
li.append(num)
else:
li.append(str(i)[2:-1])
res = ''.join(li)
print(res)
return res
if __name__ == '__main__':
parsingChar('yx77i032','ꯎ껾껾.뷝w')
上一篇: Java查找算法