欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

快手最新字体反爬

程序员文章站 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')

 

相关标签: 字体反爬