MetaCubeX

    MetaCubeX/mihomo

    #318 this week

    A simple Python Pydantic model for Honkai: Star Rail parsed data from the Mihomo API.

    api
    honkai-star-rail
    mihomo
    python
    star-rail-api
    Python
    MIT
    33.0K stars
    4.3K forks
    33.0K GitHub watchers
    Updated 8/5/2026
    View on GitHub

    Backblaze Generative Media Hackathon

    Build the next generation of AI media apps with Genblaze, stored on Backblaze B2. $10,000 in prizes.

    Enter the hackathon

    Loading star history...

    Use Cases & Benefits

    • Provides Python Pydantic models to parse and type-check Honkai: Star Rail player data from the Mihomo API.
    • Enables type-safe access and autocompletion for game data, simplifying integration and reducing errors in Python projects.
    • Use for building tools or dashboards that display detailed player and character stats from Honkai: Star Rail.
    • Use for automating data collection and analysis workflows involving player progress and achievements in Honkai: Star Rail.
    • Use for developing custom game companion apps that require up-to-date player profile and character information with asset URLs.

    About mihomo

    mihomo

    A simple python pydantic model (type hint and autocompletion support) for Honkai: Star Rail parsed data from the Mihomo API.

    API url: https://api.mihomo.me/sr_info_parsed/{UID}?lang={LANG}

    Installation

    pip install -U git+https://github.com/KT-Yeh/mihomo.git
    

    Usage

    Basic

    There are two parsed data formats:

    If you don't want to use client.get_icon_url to get the image url everytime, you can use client.fetch_user(800333171, replace_icon_name_with_url=True) to get the parsed data with asset urls.

    Example

    import asyncio
    
    from mihomo import Language, MihomoAPI
    from mihomo.models import StarrailInfoParsed
    from mihomo.models.v1 import StarrailInfoParsedV1
    
    client = MihomoAPI(language=Language.EN)
    
    
    async def v1():
        data: StarrailInfoParsedV1 = await client.fetch_user_v1(800333171)
    
        print(f"Name: {data.player.name}")
        print(f"Level: {data.player.level}")
        print(f"Signature: {data.player.signature}")
        print(f"Achievements: {data.player_details.achievements}")
        print(f"Characters count: {data.player_details.characters}")
        print(f"Profile picture url: {client.get_icon_url(data.player.icon)}")
        for character in data.characters:
            print("-----------")
            print(f"Name: {character.name}")
            print(f"Rarity: {character.rarity}")
            print(f"Level: {character.level}")
            print(f"Avatar url: {client.get_icon_url(character.icon)}")
            print(f"Preview url: {client.get_icon_url(character.preview)}")
            print(f"Portrait url: {client.get_icon_url(character.portrait)}")
    
    
    async def v2():
        data: StarrailInfoParsed = await client.fetch_user(800333171, replace_icon_name_with_url=True)
    
        print(f"Name: {data.player.name}")
        print(f"Level: {data.player.level}")
        print(f"Signature: {data.player.signature}")
        print(f"Profile picture url: {data.player.avatar.icon}")
        for character in data.characters:
            print("-----------")
            print(f"Name: {character.name}")
            print(f"Rarity: {character.rarity}")
            print(f"Portrait url: {character.portrait}")
    
    asyncio.run(v1())
    asyncio.run(v2())
    

    Tools

    from mihomo import tools

    Remove Duplicate Character

        data = await client.fetch_user(800333171)
        data = tools.remove_duplicate_character(data)
    

    Merge Character Data

        old_data = await client.fetch_user(800333171)
    
        # Change characters in game and wait for the API to refresh
        # ...
    
        new_data = await client.fetch_user(800333171)
        data = tools.merge_character_data(new_data, old_data)
    

    Data Persistence

    Take pickle and json as an example

    import pickle
    import zlib
    from mihomo import MihomoAPI, Language, StarrailInfoParsed
    
    client = MihomoAPI(language=Language.EN)
    data = await client.fetch_user(800333171)
    
    # Save
    pickle_data = zlib.compress(pickle.dumps(data))
    print(len(pickle_data))
    json_data = data.json(by_alias=True, ensure_ascii=False)
    print(len(json_data))
    
    # Load
    data_from_pickle = pickle.loads(zlib.decompress(pickle_data))
    data_from_json = StarrailInfoParsed.parse_raw(json_data)
    print(type(data_from_pickle))
    print(type(data_from_json))
    

    Discover Repositories

    Search across tracked repositories by name or description