【猿人学】web第一届 第7题 动态字体,随风漂移

Python代码:

python 复制代码
import requests
from fontTools.ttLib import TTFont  # pip install fontTools
from base64 import b64decode
from parsel import Selector  # pip install parsel

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
}

cookies = {
    "sessionid": "bse1j3p3uluqpc3jod0t5zrjs84ht1hc",
}


def send_match6(page):
    url = "https://match.yuanrenxue.cn/api/match/7"
    params = {
        "page": f"{page}"
    }
    response = requests.get(url, headers=headers, cookies=cookies, params=params)
    return {
        'woff': response.json()['woff'],
        'data': response.json()['data']
    }



def demo(data):
    """data为接口返回的内容"""

    with open('7.ttf', mode='wb') as file:
        file.write(b64decode(data['woff']))  # 将 woff 字段 b64解码后写入到文件

    font = TTFont('7.ttf')  # 加载字体文件
    font.saveXML('7.xml')  # 保存为xml文件
    # 读取 xml 文件
    with open('7.xml', mode='r', encoding='utf-8') as f:
        xml_data = f.read()

    select = Selector(xml_data)
    glyf = select.css('glyf > TTGlyph')  # 获取 glyf 下所有的 TTglyph 标签
    for TTGlyph in glyf[1:]:  # 第 0 个标签的值是不需要的,所以从 第 1 个元素开始遍历
        name = TTGlyph.css('::attr(name)').get().replace('uni', '')  # 获取 TTGlyph 标签里对应的 name 属性,并将 uni 替换为空

        pt_tag = TTGlyph.css('pt')  # 获取 TTGlyph 下所有的 pt 标签
        on_list = []
        for pt in pt_tag:  # 遍历 pt 标签
            on = pt.css('::attr(on)').get()  # 获取 pt 标签里对应的 on 属性
            on_list.append(on)  # 将解析的到 on 属性值添加到列表中
        print(f"'{''.join(on_list)}': '{name}',")  # 打印出字典形式的字符串
        # ''.join(on_list) 对应字典键
        # name 对应字典值


def save_font(font_data):
    on_map = {
        '1001101111': '1',
        '101010101101010001010101101010101010010010010101001000010': '8',
        '10101010100001010111010101101010010101000': '6',
        '10100100100101010010010010': '0',
        '1110101001001010110101010100101011111': '5',
        '10010101001110101011010101010101000100100': '9',
        '100110101001010101011110101000': '2',
        '111111111111111': '4',
        '1111111': '7',
        '10101100101000111100010101011010100101010100': '3',
    }

    with open('7.ttf', mode='wb') as f:
        f.write(b64decode(font_data['woff']))  # 保存字体文件

    font = TTFont('7.ttf')  # 加载字体文件
    font.saveXML('7.xml')  # 保存为xml文件

    # 读取 xml 文件
    with open('7.xml', mode='r', encoding='utf-8') as f:
        xml_data = f.read()

    select = Selector(xml_data)
    # 获取 <glyf> --> 所有 TTGlyph 标签
    TTGlyph = select.css('glyf > TTGlyph')[1:]  # 第 0 个标签的信息不需要,从第 1 个标签开始获取
    rep_dist = {}
    for tt in TTGlyph:
        name = tt.css('::attr(name)').get().replace('uni', '')  # TTGlyph标签 --> name 值
        pt = tt.css('pt')  # 获取 Glyph标签 --> TTGlyph标签 --> pt标签对应的 on 值
        on_list = []
        for pt_tag in pt:
            on_list.append(pt_tag.css('::attr(on)').get())
        rep_dist[name] = on_map[''.join(on_list)]  # 根据映射将 on 值替换成正确的数字

    result_dict = []
    for data in font_data['data']:
        num_list = []
        for nums in data['value'].replace('&#x', '').split(' ')[0:-1]:
            num_list.append(rep_dist[nums])
        result_dict.append(int(''.join(num_list)))
        #     print(rep_dist[nums], end='')
        # print()
    return result_dict


if __name__ == '__main__':

    hero_array = [
        '爷灬霸气傀儡', '梦战苍穹', '傲世哥', 'мaη肆風聲', '一刀メ隔世', '横刀メ绝杀', 'Q不死你R死你', '魔帝殤邪',
        '封刀不再战', '倾城孤狼',
        '戎马江湖', '狂得像风', '影之哀伤', '謸氕づ独尊', '傲视狂杀', '追风之梦', '枭雄在世', '傲视之巅', '黑夜刺客',
        '占你心为王',
        '爷来取你狗命', '御风踏血', '凫矢暮城', '孤影メ残刀', '野区霸王', '噬血啸月', '风逝无迹', '帅的睡不着',
        '血色杀戮者', '冷视天下',
        '帅出新高度', '風狆瑬蒗', '灵魂禁锢', 'ヤ地狱篮枫ゞ', '溅血メ破天', '剑尊メ杀戮', '塞外う飛龍', '哥'K纯帅',
        '逆風祈雨', '恣意踏江山',
        '望断、天涯路', '地獄惡灵', '疯狂メ孽杀', '寂月灭影', '骚年霸称帝王', '狂杀メ无赦', '死灵的哀伤', '撩妹界扛把子',
        '霸刀☆藐视天下', '潇洒又能打'
    ]  # 正确的英雄排序列表
    hero_nums = []  # 声明一个列表,用于存储所有的数值
    for page in range(1, 6):
        math6_data = send_match6(page)
        nums_list = save_font(math6_data)
        print(page, nums_list)  # 打印请求的页数,对应的列表(数值)
        for num in nums_list:  # 遍历每页得到的列表
            hero_nums.append(num)  # 将列表数值添加到 hreo_nums 列表中
    print(hero_nums)  # 打印所有页面的数值

    max_num = 0  # 定义一个变量,用于存储最大的数值
    for num in hero_nums:
        # 将 hero_nums 中的每一个数值与 max_num 作比较
        if num > max_num:  # 如果改数值比 max_num 大
            max_num = num  # max_num 就等于改数值

    hero_index = hero_nums.index(max_num)  # 获取列表中最大数值的索引
    print(hero_array[hero_index])  # 获取对应英雄列表的英雄名

结果:

相关推荐
MThinker16 小时前
k230 按键拍照后,将摄像头拍照的1920*1080分辨率的图片以jpg文件格式,保存到板载TF存储卡的指定文件夹目录中
python·嵌入式硬件·智能硬件·micropython·canmv·k230
Tipriest_17 小时前
求一个整数x的平方根到指定精度[C++][Python]
开发语言·c++·python
蓝倾97618 小时前
淘宝/天猫店铺商品搜索API(taobao.item_search_shop)返回值详解
android·大数据·开发语言·python·开放api接口·淘宝开放平台
跟橙姐学代码18 小时前
配置文件这么多格式,Python到底该怎么选?一文带你梳理七种常见用法
前端·python·ipython
进阶的小菜菜19 小时前
LeetCode100-240搜索二维矩阵Ⅱ
python·矩阵
BatyTao20 小时前
Selenium自动化测试快速入门指南
python·selenium·测试工具
Source.Liu21 小时前
【学Python自动化】 1. Python 安装与配置完全指南 (Windows)
windows·python·自动化
蒋星熠21 小时前
Python API接口实战指南:从入门到精通
开发语言·分布式·python·设计模式·云原生·性能优化·云计算
还梦呦21 小时前
2025年09月计算机二级Java选择题每日一练——第十一期
java·开发语言·python·计算机二级
测试-鹏哥21 小时前
轻舟已过万重山 - ITP V2.1.0版本成功发布
运维·人工智能·python·测试工具·docker·django