Tutorial

enka.py allows you to fetch genshin user data easily.

Note: ALL operation is async

Fetching genshin user data

For now, enka.network has only one public API, which fetches all data via genshin uid.

Note: all data are same as what you see in game.

Example:

from enkapy import Enka
import asyncio
client = Enka()

async def main():
    await client.load_lang()
    user = await client.fetch_user(104267816)
    print(user)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

User data object

What you get in previous step are enkapy.model.EnkaData object

It contains all information about the specific player.

There are 2 main data fields in this object:

  • characters: ALL characters data the player choose to shown in game

  • player: Basic information about this player

Loading language data

So you might already noticed, why await client.load_lang?

Because name related data aren’t in the data returned from enka.network, we need to parse the name from some integer.

The process is roughly looking up int value in genshin related json file, and somehow grab a name hash and look it up in genshin TextMap json file.

We automated this process, just pass the correct language value(default ‘en’) and call enkapy.client.Enka.load_lang()

New in 1.1.0: Now load_lang has cache! check ``force_cache`` and ``force_update`` parameters!

Note: if you don’t load language data, all name field in returned object will be empty string

Player basic info

Example:

await client.load_lang()
user = await client.fetch_user(104267816)
print(f"Nickname: {user.player.nickname}")
print(f"Level: {user.player.level}")
print(f'Signature: {user.player.signature}')
print(f'World level:{user.player.worldLevel}')
print(f'Abyss: {user.player.towerFloorIndex}-{user.player.towerLevelIndex}')

Result:

Nickname: Player nickname
Level: 60
Signature: Player's signature
World level:8
Abyss: 12-3

Character info

Note: you might not able to fetch this info if player choose not to share

Basically there are 5 parts of character info:

  • character basic info(name/friendship/ascension…etc)

  • character weapon info

  • character constellations info

  • character artifact info

  • character skill info

Character basic info:

character = user.characters[0]
print(f'Name: {character.name}')
print(f'Ascension: {character.ascension}')
print(f'Level: {character.level}')
print(f'Exp: {character.experience}')

Character weapon info:

print('Weapon:')
weapon = character.weapon
print(f'\tName: {weapon.name}')
print(f'\tLevel: {weapon.level}')
print(f'\tRefine: {weapon.refine}')
print(f'\tStar level: {weapon.rank}')

Character constellations info:

print('Constellations:')
for constellation in character.constellations:
    if constellation.activated:
        print(f'\t{constellation.name} Activated')

Character artifact info:

print('Artifacts:')
for artifact in character.artifacts:
    print(f'\t{artifact.set_name} {artifact.name}:')
    print(f'\t{artifact.main_stat.prop}:{artifact.main_stat.value}')
    for sub_stats in artifact.sub_stats:
        print(f'\t\t{sub_stats.prop}:{sub_stats.value}')

Character skill info:

print('Skills:')
for skill in character.skills:
    if skill.type == 0:
        print(f'\tNormal skill {skill.name}, level:{skill.level}')
    elif skill.type == 1:
        print(f'\tElemental skill {skill.name}, level:{skill.level}')
    elif skill.type == 2:
        print(f'\tElemental burst {skill.name}, level:{skill.level}')