逆向10-懂车帝字体


懂车帝二手车

1. python获取请求和响应

image

# 懂车帝
import requests

cookies = {
    'ttwid': '1%7CFk7c7JKUdszfSoAoapCL2P1BJVKIfpCoiwLi4u-UU14%7C1722247037%7Ca8d3d748104b911ee8980f05b42084e3d057ea3bb9bb98fac3a5816b133ad649',
    'tt_webid': '7396994638835615294',
    'tt_web_version': 'new',
    'is_dev': 'false',
    'is_boe': 'false',
    'Hm_lvt_3e79ab9e4da287b5752d8048743b95e6': '1722247038',
    'HMACCOUNT': '73A91BDDAF908DF6',
    's_v_web_id': 'verify_lz6tf3vd_xELGcAi1_ctLq_4sAU_AYnA_xrkgrSZQPEAA',
    '_ga': 'GA1.2.125631049.1722247039',
    '_gid': 'GA1.2.736650754.1722247040',
    'city_name': '%E5%8C%97%E4%BA%AC',
    '_ga_YB3EWSDTGF': 'GS1.1.1722250266.2.0.1722250266.60.0.0',
    'Hm_lpvt_3e79ab9e4da287b5752d8048743b95e6': '1722250267',
}

headers = {
    'accept': '*/*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
    'content-type': 'application/x-www-form-urlencoded',
    # 'cookie': 'ttwid=1%7CFk7c7JKUdszfSoAoapCL2P1BJVKIfpCoiwLi4u-UU14%7C1722247037%7Ca8d3d748104b911ee8980f05b42084e3d057ea3bb9bb98fac3a5816b133ad649; tt_webid=7396994638835615294; tt_web_version=new; is_dev=false; is_boe=false; Hm_lvt_3e79ab9e4da287b5752d8048743b95e6=1722247038; HMACCOUNT=73A91BDDAF908DF6; s_v_web_id=verify_lz6tf3vd_xELGcAi1_ctLq_4sAU_AYnA_xrkgrSZQPEAA; _ga=GA1.2.125631049.1722247039; _gid=GA1.2.736650754.1722247040; city_name=%E5%8C%97%E4%BA%AC; _ga_YB3EWSDTGF=GS1.1.1722250266.2.0.1722250266.60.0.0; Hm_lpvt_3e79ab9e4da287b5752d8048743b95e6=1722250267',
    'origin': 'https://www.dongchedi.com',
    'priority': 'u=1, i',
    'referer': 'https://www.dongchedi.com/usedcar/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'x-forwarded-for': '',
}

params = {
    'aid': '1839',
    'app_name': 'auto_web_pc',
}

data = '&sh_city_name=全国&page=1&limit=20'.encode()

response = requests.post(
    'https://www.dongchedi.com/motor/pc/sh/sh_sku_list',
    params=params,
    cookies=cookies,
    headers=headers,
    data=data,
)
print(response.text)

image

2. 脚本-字体woff做映射表

字体woff做映射表

3. 懂车帝-实例

有两个文件一个是主文件(dcd.py),一个是第二步的映射表文件(util.py)

from fontTools.ttLib import TTFont
import ddddocr
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont


def convert_cmap_to_image(cmap_code, font_path):
    img_size = 1024
    img = Image.new("1", (img_size, img_size), 255)  # 创建一个黑白图像对象
    draw = ImageDraw.Draw(img)  # 创建图对象
    font = ImageFont.truetype(font_path, int(img_size) * 0.6)  # 加载字体文件
    character = chr(cmap_code)  # 将 cmap code转换为字符
    bbox = draw.textbbox((0, 0), character, font=font)  # 获取文本在图像中的边界框,bbox获取的是四个值
    width = bbox[2] - bbox[0]  # 文本宽度
    height = bbox[3] - bbox[1]  # 文本高度
    draw.text(((img_size - width) // 2, (img_size - height) // 7), character, font=font)  # 绘制文本,并中显示
    return img


def extract_text_from_font(font_path):
    font = TTFont(font_path)  # 加载字体文件
    # font.saveXML("font.xml")  # 保存XML文件(可以这么操作,但是这里我们不用)
    ocr = ddddocr.DdddOcr(beta=True, show_ad=False)  # 实例化
    font_map = {}
    for cmap_code, glyph in font['cmap'].getBestCmap().items():
        # 
        image = convert_cmap_to_image(cmap_code, font_path)
        bytes_io = BytesIO()
        image.save(bytes_io, format='PNG')
        # 识别图像
        text = ocr.classification(bytes_io.getvalue()) 
        # 生成对应名字的图片
        # image.save(f'./images/{text}.png', format='PNG')
        # 最后生成映射表----根据每个案例 适当修改
        font_map[hex(cmap_code).replace("0x", "")] = text
    return font_map

util.py

# 懂车帝
import requests
from util import extract_text_from_font

# (1)获取懂车帝数据
def get_dcd():
    cookies = {
        'ttwid': '1%7CFk7c7JKUdszfSoAoapCL2P1BJVKIfpCoiwLi4u-UU14%7C1722247037%7Ca8d3d748104b911ee8980f05b42084e3d057ea3bb9bb98fac3a5816b133ad649',
        'tt_webid': '7396994638835615294',
        'tt_web_version': 'new',
        'is_dev': 'false',
        'is_boe': 'false',
        'Hm_lvt_3e79ab9e4da287b5752d8048743b95e6': '1722247038',
        'HMACCOUNT': '73A91BDDAF908DF6',
        's_v_web_id': 'verify_lz6tf3vd_xELGcAi1_ctLq_4sAU_AYnA_xrkgrSZQPEAA',
        '_ga': 'GA1.2.125631049.1722247039',
        '_gid': 'GA1.2.736650754.1722247040',
        'city_name': '%E5%8C%97%E4%BA%AC',
        '_ga_YB3EWSDTGF': 'GS1.1.1722250266.2.0.1722250266.60.0.0',
        'Hm_lpvt_3e79ab9e4da287b5752d8048743b95e6': '1722250267',
    }

    headers = {
        'accept': '*/*',
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
        'content-type': 'application/x-www-form-urlencoded',
        # 'cookie': 'ttwid=1%7CFk7c7JKUdszfSoAoapCL2P1BJVKIfpCoiwLi4u-UU14%7C1722247037%7Ca8d3d748104b911ee8980f05b42084e3d057ea3bb9bb98fac3a5816b133ad649; tt_webid=7396994638835615294; tt_web_version=new; is_dev=false; is_boe=false; Hm_lvt_3e79ab9e4da287b5752d8048743b95e6=1722247038; HMACCOUNT=73A91BDDAF908DF6; s_v_web_id=verify_lz6tf3vd_xELGcAi1_ctLq_4sAU_AYnA_xrkgrSZQPEAA; _ga=GA1.2.125631049.1722247039; _gid=GA1.2.736650754.1722247040; city_name=%E5%8C%97%E4%BA%AC; _ga_YB3EWSDTGF=GS1.1.1722250266.2.0.1722250266.60.0.0; Hm_lpvt_3e79ab9e4da287b5752d8048743b95e6=1722250267',
        'origin': 'https://www.dongchedi.com',
        'priority': 'u=1, i',
        'referer': 'https://www.dongchedi.com/usedcar/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
        'x-forwarded-for': '',
    }

    params = {
        'aid': '1839',
        'app_name': 'auto_web_pc',
    }

    data = '&sh_city_name=全国&page=1&limit=20'.encode()

    response = requests.post(
        'https://www.dongchedi.com/motor/pc/sh/sh_sku_list',
        params=params,
        cookies=cookies,
        headers=headers,
        data=data,
    )
    # print(response.text)
    return response.json()

#(2)获取字体映射表
def get_font_map():
    font_path_url = 'https://lf6-awef.bytetos.com/obj/awesome-font/c/96fc7b50b772f52-700.woff2'
    response = requests.get(font_path_url)
    with open('./font.woff', 'wb') as f:
        f.write(response.content)
    return extract_text_from_font('./font.woff')

# (3)获取字体映射表与加密数据的替换

# def replace_data(data, font_map):
# """第一种写法:"""
#     s = ""
#     for item in data:
#         if item != ".":
#             item = font_map[repr(item)[3:-1]]     
#         s += item
#     return s
def replace_data(data, font_map):
    """第二种写法:本案例适用official_price和sh_price"""
    s = ""
    for item in data:
        if item != ".":
            if repr(item)[3:-1] in font_map:
                s += font_map[repr(item)[3:-1]]
        else:        
            s += item
    return s
def replace_data_title(title, font_map):
    #  '\ue463\ue439\ue463\ue439\ue525 | \ue49d.\ue463\ue411\ue40a\ue492\ue4a8'
    a,b = title.split("|")
    return replace_data(a, font_map) + " | " + replace_data(b, font_map)


# 获取字体映射表与加密数据的替换
def main():
    #(1)获取懂车帝数据
    json_data = get_dcd()
    #(2)获取字体映射表
    font_map = get_font_map()
    data_list = []
    for item in json_data['data']['search_sh_sku_info_list']:
        data_list.append({
            # (3)获取字体映射表与加密数据的替换
            'sub_title': replace_data_title(item['sub_title'], font_map),
            'official_price': replace_data(item['official_price'], font_map),
            'sh_price': replace_data(item['sh_price'], font_map)
            })
    return data_list

print(main())
posted @ 2024-07-29 19:39  流年中渲染了微笑  阅读(13)  评论(0)    收藏  举报