这个板块主要记录一些我在影刀工作中遇到的问题及解决方案
天猫字体解码
比影刀官方的好用 # 使用提醒: # 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能 # 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能 # 3. 当此模块作为流程独立运行时执行main函数 # 4. 可视化流程中可以通过"调用模块"的指令使用此模块 import xbot from xbot import print, sleep from .import package from .package import variables as glv from xbot.web.browser import WebBrowser import re import unicodedata import requests import io from fontTools.ttLib import TTFont class TmallFontDecoder: def __init__(self, web_page: WebBrowser): self.base_dict = { 'period': '.', 'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4', 'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9', } self.font_cmap = self._get_font_cmap(web_page) def _get_font_cmap(self, web_page: WebBrowser): font_face_js = web_page.find_by_xpath('//style[contains(text(), "AlibabaSans102CustomFont")]').get_text() pattern = f"url\('(https:\/\/[^']+\.woff)'\)" font_url = re.search(pattern, font_face_js).group(1) try: response = requests.get(font_url) response.raise_for_status() font = TTFont(io.BytesIO(response.content)) font_cmap = font['cmap'].getBestCmap() return font_cmap except Exception as e: raise Exception(f'获取字体映射出错: {e}') def decode(self, content: str): unicode_codes = [ord(c) for c in content] decoded_text = ''.join([self.base_dict[self.font_cmap[_]] for _ in unicode_codes]) return decoded_text def get_TmallFontDecoder(web_page: WebBrowser): return TmallFontDecoder(web_page) def decode(decoder: TmallFontDecoder, content: str): return decoder.decode(content)