逆向10-懂车帝字体
懂车帝二手车
1. python获取请求和响应

# 懂车帝
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)

2. 脚本-字体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())

浙公网安备 33010602011771号