1
0
Fork 0
forked from Fuji/Fuji
Fuji/src/sdk/src/apis/prometheus_web/client.py

108 lines
3.4 KiB
Python

import json
from bs4 import BeautifulSoup
import requests
from sdk.src.apis.common.models import FsLsQuery
from sdk.src.apis.common.utils import parse_fs_ls_response_form
from sdk.src.apis.prometheus_web.constants import (
ENDPOINT_ACCOUNT_QUERY_USER_INFO,
ENDPOINT_API_AP,
ENDPOINT_FS_LS,
ENDPOINT_LOGIN,
HEADERS,
PROMETHEUS_WEB_BASE,
)
from sdk.src.apis.prometheus_web.exceptions import (
NoLoggedInException,
InvalidCredentialsException,
)
class PrometheusWebClient:
def __init__(self, cookies: dict[str, str] | None = None):
self._session = requests.Session()
if cookies:
self._session.cookies.update(cookies)
def is_logged(self):
if not self._session.cookies.get_dict():
return False
home_response = self._session.get(PROMETHEUS_WEB_BASE)
soup = BeautifulSoup(home_response.text, "html.parser")
return bool(soup.select_one("div.user-avatar"))
def get_login_data(self):
login_page = self._session.get(
f"{PROMETHEUS_WEB_BASE}/logowanie",
headers=HEADERS,
).text
return self._parse_login_page(login_page)
def _parse_login_page(self, html: str):
soup = BeautifulSoup(html, "html.parser")
request_verification_token = soup.select_one(
'input[name="__RequestVerificationToken"]'
)["value"]
captcha_text = soup.select_one('label[for="captchaUser"]').text
captcha_images = [img["src"] for img in soup.select(".v-captcha-image")]
return request_verification_token, captcha_text, captcha_images
def query_user_info(self, username: str, request_verification_token: str):
response = self._session.post(
f"{PROMETHEUS_WEB_BASE}/{ENDPOINT_ACCOUNT_QUERY_USER_INFO}",
{
"alias": username,
"__RequestVerificationToken": request_verification_token,
},
)
data = response.json()["data"]
return data["ExtraMessage"], data["ShowCaptcha"]
def login(
self,
username: str,
password: str,
reqest_verification_token: str,
captcha: str | None,
):
login_result = self._session.post(
f"{PROMETHEUS_WEB_BASE}/{ENDPOINT_LOGIN}",
data={
"Alias": username,
"Password": password,
"captchaUser": captcha,
"__RequestVerificationToken": reqest_verification_token,
},
headers=HEADERS,
)
if "Zła nazwa użytkownika lub hasło." in login_result.text:
raise InvalidCredentialsException()
def get_mobile_data(self):
response = self._session.get(
f"{PROMETHEUS_WEB_BASE}/{ENDPOINT_API_AP}", headers=HEADERS
)
if "Logowanie" in response.text:
raise NoLoggedInException()
soup = BeautifulSoup(response.text, "html.parser")
return json.loads(soup.select_one("input#ap")["value"])
def fs_ls(self, query: FsLsQuery):
response = self._session.get(
f"{PROMETHEUS_WEB_BASE}/{ENDPOINT_FS_LS}",
params=dict(query),
)
if "Logowanie" in response.text:
raise NoLoggedInException()
return parse_fs_ls_response_form(response.text)
def get_cookies(self):
return self._session.cookies.get_dict()