srgweb/examples.py
2025-06-08 02:05:42 +03:00

123 lines
3.2 KiB
Python

from srgweb.triton import (
triton_session,
list_programs,
get_program,
list_baskets,
get_basket
)
import keyring
# login to triton
sess = triton_session("uskov", keyring.get_password("PLAN_SRG", ""))
# list available programs
programs = list_programs(sess)
# download program SRGA
df = get_program(sess, program="SRGA")s
# list available baskets
baskets = list_baskets(sess)
# download basket ART-XC agns
df_basket = get_basket(sess, basket='ART-XC agns')
# Publications
from srgweb.publications import get_df_from_srg_papers
df = get_df_from_srg_papers()
from srgweb.artsurvey import (
artsurvey_session,
get_artsurvey_cat
)
import keyring
sess = artsurvey_session(
"uskov",
keyring.get_password("SRG_ARTSURVEY", ""),
base_url="http://10.5.2.25/"
)
base_url = sess.base_url
settings_url = f"{base_url.rstrip('/')}/artsurvey"
resp = sess.get(settings_url)
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, "html.parser")
form = soup.find("form")
select = form.find("select", {"id": "id_survey"})
survey_options = {
option.text.strip(): option.get("value")
for option in select.find_all("option")
if option.get("value")
}
# 3. Объединяем параметры
params = {**default_artsurvey_settings(), **{}}
params["survey"] = survey_options['S1-5v12345.12']
# 4. Подготовка payload (фильтры, которые реально присутствуют в форме)
from bs4 import BeautifulSoup, Tag
import requests
def build_payload(form: Tag, overrides: dict[str, str]) -> dict[str, str]:
"""
Собирает payload **из всех** полей формы + перекрывает overrides.
Поведение 1-в-1 как rvest::html_form_set().
"""
payload: dict[str, str] = {}
for el in form.find_all(["input", "select", "textarea"]):
name = el.get("name")
if not name:
continue
tag_type = el.get("type", "").lower()
value: str
# --- SELECT -------------------------------------------------
if el.name == "select":
selected = el.find("option", selected=True)
value = selected.get("value") if selected else el.find("option").get("value", "")
# --- CHECKBOX / RADIO --------------------------------------
elif tag_type in {"checkbox", "radio"}:
# rvest кладёт "" для НЕотмеченных чекбоксов
if el.has_attr("checked"):
value = el.get("value", "on") # если нет value, браузеры шлют "on"
else:
value = ""
# --- TEXT, NUMBER, HIDDEN, и проч. INPUT -------------------
else:
value = el.get("value", "")
payload[name] = value
# Перекрываем пользовательскими значениями
payload.update(overrides)
return payload
payload = build_payload(form, params)
payload
resp = sess.post(
settings_url,
data=payload,
headers={"Referer": "http://10.5.2.25/login"}, # <- критично
)
from urllib.parse import urlencode
print(urlencode(payload, doseq=True))
resp.raise_for_status()