目的

破解SVG加密的字符,得到正确的字符

练习平台
http://www.porters.vip/confusion/food.html

思路解析

一、SVG的具体表现
在这里插入图片描述
二、CSS文件
在这里插入图片描述
三、svg
在这里插入图片描述
在这里插入图片描述
四、举例详解
这里选择图一为例:
已知:
类名:vhkjj4
坐标:(-316px -141px)----取正整数则为(316,141)
在这里插入图片描述
在这里插入图片描述
可以自行选择其他类名进行尝试

源码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : jia666
# @Time    : 2020/10/19 15:58
import re
import requests


class SVG_num():
    def __init__(self, name):
        self.class_name = name

        self.main()

    def main(self):
        self.Get_file()  # 获取css与svg文件
        self.init_svg()  # svg解析
        self.svg_parse()  # svg映射

    def Get_file(self):
        svg_link = "http://www.porters.vip/confusion/font/food.svg"  # svg链接
        css_link = "http://www.porters.vip/confusion/css/food.css"  # css链接

        # 获取svg与css文件内容
        self.svg_text = requests.get(svg_link).text
        css_text = requests.get(css_link).text

        self.css_text = css_text.replace('\n', '').replace(' ', '')  # 将换行符与空格清除,方便下一步匹配

    # 定义一个函数用于匹配class属性为xx对应的css参数
    def find_xy(self, in_text, class_value):
        re_sentence = '.%s{background:-(\d+)px-(\d+)px;}' % class_value
        pattern = re.compile(re_sentence)
        res = pattern.findall(in_text)
        return res[0]

    # 寻找出svg文件中定义的字符大小
    def find_font_size(self,in_text):
        fs = re.compile(r'font-size:(\d+)px')
        res = fs.findall(in_text)
        return int(res[0])

    def init_svg(self):
        text = re.findall('y="(.*?)">(.*?)</text>', self.svg_text, re.S)
        self.list_y = []
        self.list_text = []
        for i in range(len(text)):
            self.list_y.append(text[i][0])
            self.list_text.append(text[i][1])

    def svg_parse(self):
        x, y = self.find_xy(self.css_text, self.class_name)  # 找出class=vhkjj4的xy坐标
        real_y = [i for i in self.list_y if y <= i][-1]  # 找出是哪一个 y
        real_text = self.list_text[self.list_y.index(real_y)]  # 找出是那个一 text
        index = int(int(x) / 14)  # 取整数下标

        print('svg类名:' + self.class_name + '\n' +
              '坐标:' + str((x, y)) + '\n' +
              '字体大小:' + str(self.find_font_size(self.svg_text)) + '\n' +
              '映射字符:' + str(real_text[index]))

if __name__ == '__main__':
    name = 'vhkjj4'
    example = SVG_num(name)

在这里插入图片描述

参考博客

作者:jspython
标题:5分钟看懂SVG反爬虫原理
https://blog.csdn.net/jspython/article/details/106071233
特别推荐没有svg基础的可以查看这个博客链接,我从中获益匪浅,有例子,有思路,有解析,源码与思路均来自于此,十分感谢原作者!!
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐