|
from base64 import urlsafe_b64encode |
|
from hashlib import blake2b |
|
import argon2 |
|
import requests |
|
|
|
BASE_URL="https://api.novelai.net" |
|
|
|
def argon_hash(email: str, password: str, size: int, domain: str) -> str: |
|
pre_salt = f"{password[:6]}{email}{domain}" |
|
|
|
blake = blake2b(digest_size=16) |
|
blake.update(pre_salt.encode()) |
|
salt = blake.digest() |
|
raw = argon2.low_level.hash_secret_raw( |
|
password.encode(), |
|
salt, |
|
2, |
|
int(2000000 / 1024), |
|
1, |
|
size, |
|
argon2.low_level.Type.ID, |
|
) |
|
hashed = urlsafe_b64encode(raw).decode() |
|
return hashed |
|
|
|
def login(key) -> str: |
|
response = requests.post(f"{BASE_URL}/user/login", json={ "key": key }) |
|
|
|
return response.json()["accessToken"] |
|
|
|
def get_access_key(email: str, password: str) -> str: |
|
return argon_hash(email, password, 64, "novelai_data_access_key")[:64] |