飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2358|回复: 2

[其他内容] 记一次潇湘书院静态字体反爬

[复制链接]
  • TA的每日心情
    奋斗
    2023-5-13 09:25
  • 签到天数: 89 天

    [LV.6]常住居民II

    发表于 2022-8-3 13:48:12 | 显示全部楼层 |阅读模式
    网站链接:https://www.xxsy.net/chapter/3660424.html
    思路:找到加密字体—>找到加密字体与字体文件的关系—>构建加密字体与原字体的关系—>把网站上加密的字体的数据替换成原数据
    当我删除了网站<link href="//images.xxsy.net/css/pc/website/pagestatic.css?v=20210712" rel="stylesheet">这一行之后字体变了,说明字体反爬关键处在这个文件里 图一.png

    输入https://www.xxsy.net/Content/css/xxsyfont/xxsyfont.css便可直达css文件里面,可以看到里面的代码都是与字体有关的。那便取敌人首级,直接去拿字体文件。
    图二.png
    抓包直接就能拿到字体文件
    图三.png
    文件有了那么我们可以拿这个字体文件去解析字体的对应关系
    图四.png
    接下来就是敲代码了
    说下代码思路吧,先下载字体文件对其解析成我们所能理解的文件
    然后获取字体的映射关系并且写字体字典
    最重要的就是构建加密字体与字体字典的关系。网站源代码加密字体是这样子的—>的,字典文件里面的对应关系却是uniE800—>的
    于是乎,把源代码的&#x替换成uni并把其他字符大写化
    把被替换后的源代码里的uniE***替换成字典里面的uniE***—>*(*是所对应的字符的意思)
    代码如下:
    [AppleScript] 纯文本查看 复制代码
    import re
    import requests
    from fontTools.ttLib import TTFont
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
    }
    #下载字体二进制文件—>微笑面对生活—^^—
    font=requests.get("https://www.xxsy.net/Content/css/xxsyfont/yahei/font.ttf",headers=headers)
    with open("font.ttf",mode="wb")as f:
        f.write(font.content)
    #转换字体文件为我们能看得懂的文件—>微笑面对生活—^^—
    fo = TTFont("font.ttf")
    fo.saveXML('font.xml')
    #获取字体的映射关系—>微笑面对生活—^^—
    font_map = fo['cmap'].getBestCmap()
    #替换字典
    zd = {'uniE800':'的',
          'uniE801':'一',
          'uniE802':'是',
          'uniE803':'了',
          'uniE804': '我',
          'uniE805': '不',
          'uniE806': '人',
          'uniE807': '在',
          'uniE808': '他',
          'uniE809': '有',
          'uniE80A': '这',
          'uniE80B': '个',
          'uniE80C': '上',
          'uniE80D': '们',
          'uniE80E': '来',
          'uniE80F': '到',
          'uniE810': '时',
          'uniE811': '大',
          'uniE812': '地',
          'uniE813': '为',
          'uniE814': '子',
          'uniE815': '中',
          'uniE816': '你',
          'uniE817': '说',
          'uniE818': '生',
          'uniE819': '国',
          'uniE81A': '年',
          'uniE81B': '着',
          'uniE81C': '就',
          'uniE81D': '那',
          'uniE81E': '和',
          'uniE81F': '要',
          'uniE820': '她',
          'uniE821': '出',
          'uniE822': '也',
          'uniE823': '得',
          'uniE824': '里',
          'uniE825': '后',
          'uniE826': '自',
          'uniE827': '以',
          'uniE828': '会',
          'uniE829': '家',
          'uniE82A': '可',
          'uniE82B': '下',
          'uniE82C': '而',
          'uniE82D': '过',
          'uniE82E': '天',
          'uniE82F': '去',
          'uniE830': '能',
          'uniE831': '对',
          'uniE832': '小',
          'uniE833': '多',
          'uniE834': '然',
          'uniE835': '于',
          'uniE836': '心',
          'uniE837': '学',
          'uniE838': '么',
          'uniE839': '之',
          'uniE83A': '都',
          'uniE83B': '好',
          'uniE83C': '看',
          'uniE83D': '起',
          'uniE83E': '发',
          'uniE83F': '当',
          'uniE840': '没',
          'uniE841': '成',
          'uniE842': '只',
          'uniE843': '如',
          'uniE844': '事',
          'uniE845': '把',
          'uniE846': '还',
          'uniE847': '用',
          'uniE848': '第',
          'uniE849': '样',
          'uniE84A': '道',
          'uniE84B': '想',
          'uniE84C': '作',
          'uniE84D': '种',
          'uniE84E': '开',
          'uniE84F': '美',
          'uniE850': '总',
          'uniE851': '从',
          'uniE852': '无',
          'uniE853': '情',
          'uniE854': '已',
          'uniE855': '面',
          'uniE856': '最',
          'uniE857': '女',
          'uniE858': '但',
          'uniE859': '现',
          'uniE85A': '前',
          'uniE85B': '些',
          'uniE85C': '所',
          'uniE85D': '同',
          'uniE85E': '日',
          'uniE85F': '手',
          'uniE860': '又',
          'uniE861': '行',
          'uniE862': '意',
          'uniE863': '动'
          }
    # 获取网页源码—>微笑面对生活—^^—
    html = requests.get("https://www.xxsy.net/chapter/3660424.html")
    html1 = html.text
    # 将网页上的&#x替换成uni,目的是为了后面更好替换字体—>微笑面对生活—^^—
    html1 = html1.replace('&#x','uni')
    # 正则创建—>微笑面对生活—^^—
    re1=re.compile('<d>uni(.*?);</d>',re.I|re.S)
    re1=re1.findall(html1)
    # 将网页上面的&#x后面的字体大写化—>微笑面对生活—^^—
    for i in range(0,1000):
          try:
                html1 = html1.replace(re1, re1.upper(), i)
          except:
                break
    
    # 替换网页上的加密字体—>微笑面对生活—^^—
    for x,y in font_map.items():
          try:
                thq = '<d>' + fo['cmap'].getBestCmap()[x] + ';</d>'
                thh = zd[y]
                html1=html1.replace(thq,thh,i)
          except:
                break
    # 通过正则找到需要爬取的内容(文章标题与文章内容)—>微笑面对生活—^^—
    re3=re.compile('<span class="chapter-section" data-index=".*?">(.*?)</span>',re.I|re.S)
    re3=re3.findall(html1)
    with open(re3[0] + '.txt', mode="w", encoding='utf-8')as f:
          f.writelines(re3)


    注意:文章仅供技术交流使用,如有侵权,联系我删除
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2024-2-3 18:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2023-3-31 23:08:24 | 显示全部楼层
    PYG18周年生日快乐!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 246 天

    [LV.8]以坛为家I

    发表于 2023-6-25 09:12:15 | 显示全部楼层
    给楼主点个赞!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表