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') 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()