Files
janssen/Feasibility/TRASH/sipiq_download_v2.0.py
T
2026-06-19 14:28:54 +02:00

134 lines
5.0 KiB
Python

# =============================================================================
# Název: sipiq_download_v2.0.py
# Verze: 2.0
# Datum: 2026-06-19
# Autor: Claude Code (pro MUDr. Vladimíra Buzalku)
# Popis: Automatické stažení SIPIQ survey reportu (CSV) z Qualtrics přes
# Playwright. Přihlásí se (username/password), otevře Data & Analysis
# studie 77242113UCO3002 (SV_9AdeNaNyohp5fNQ), spustí Export & Import →
# Export Data → CSV → Download a stažený soubor uloží s timestampem do
# U:\Dropbox\!!!Days\Downloads Z230\.
#
# Proč Playwright a ne API: účet NEMÁ povolené API na úrovni účtu;
# interní export běží jen na session cookies + interní fileUrl
# (riptooth.service.consul) nedostupné zvenčí. Playwright se přihlásí
# sám (řeší expiraci session) a stažení nechá na prohlížeči.
#
# Credentials: ROOT .env (QUALTRICS_USER / QUALTRICS_PASS), fallback
# na zabudované hodnoty účtu sipiq.
# Verze 1.0 (čistě requests/API) přesunuta do TRASH — na tomto účtu nefunguje.
# =============================================================================
import os
import sys
from datetime import datetime
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout
try:
from dotenv import load_dotenv
_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
load_dotenv(os.path.join(_ROOT, ".env"))
except Exception:
pass
DC = "janssenfeasibility.co1"
SURVEY = "SV_9AdeNaNyohp5fNQ"
USER = os.environ.get("QUALTRICS_USER", "77242113uco3002_sipiq")
PWD = os.environ.get("QUALTRICS_PASS", "77242113uco3002_sipiq")
LOGIN_URL = "https://login.qualtrics.com/login"
RESP_URL = f"https://{DC}.qualtrics.com/responses/#/surveys/{SURVEY}"
OUT_DIR = r"U:\Dropbox\!!!Days\Downloads Z230"
PROFILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "qualtrics_profile")
HEADLESS = "--headless" in sys.argv
DEBUG_DIR = os.path.dirname(os.path.abspath(__file__))
def dbg(page, name):
try:
page.screenshot(path=os.path.join(DEBUG_DIR, f"_dl_{name}.png"))
except Exception:
pass
def ensure_login(page):
page.goto(LOGIN_URL, timeout=120000)
page.wait_for_load_state("domcontentloaded")
page.wait_for_timeout(3000)
field = page.locator("#UserName, input[name='username'], #username").first
if field.is_visible(timeout=5000):
print("Přihlašuji se…")
field.fill(USER)
page.locator("#UserPassword, input[name='password'], #password").first.fill(PWD)
page.locator("#loginButton, button[type='submit'], #login-button").first.click()
page.wait_for_timeout(8000)
page.wait_for_load_state("domcontentloaded")
else:
print("Session aktivní, přihlášení přeskočeno.")
def open_data_table(page):
page.goto(RESP_URL, timeout=120000)
page.wait_for_load_state("domcontentloaded")
# počkat na tlačítko Export & Import
page.get_by_role("button", name="Export & Import").wait_for(timeout=120000)
page.wait_for_timeout(2000)
print("Data & Analysis načteno.")
def do_export(page):
page.get_by_role("button", name="Export & Import").click()
page.wait_for_timeout(1500)
dbg(page, "01_menu")
# položka Export Data v menu
page.get_by_text("Export Data", exact=False).first.click()
page.wait_for_timeout(3000)
dbg(page, "02_modal")
# CSV tab (bývá default; klikneme pro jistotu)
try:
page.get_by_role("tab", name="CSV").click(timeout=5000)
except PWTimeout:
try:
page.get_by_text("CSV", exact=True).first.click(timeout=5000)
except Exception:
print("CSV tab nenalezen, spoléhám na default.")
page.wait_for_timeout(1500)
dbg(page, "03_csv")
# Download tlačítko + zachycení stahování
print("Spouštím Download…")
with page.expect_download(timeout=180000) as dl_info:
page.get_by_role("button", name="Download").last.click()
download = dl_info.value
return download
def main():
os.makedirs(OUT_DIR, exist_ok=True)
with sync_playwright() as pw:
ctx = pw.chromium.launch_persistent_context(
PROFILE, headless=HEADLESS, accept_downloads=True,
args=["--start-maximized"], no_viewport=not HEADLESS)
page = ctx.pages[0] if ctx.pages else ctx.new_page()
try:
ensure_login(page)
open_data_table(page)
download = do_export(page)
stamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")
suggested = download.suggested_filename or "sipiq_export.csv"
target = os.path.join(OUT_DIR, f"{stamp} {suggested}")
download.save_as(target)
print("HOTOVO. Uloženo:", target)
except Exception as e:
dbg(page, "99_error")
print("CHYBA:", repr(e), file=sys.stderr)
raise
finally:
page.wait_for_timeout(1500)
ctx.close()
if __name__ == "__main__":
main()