Загрузка данных


import re
import time
from pathlib import Path
from playwright.sync_api import sync_playwright

FOLDER_URL = "https://disk.yandex.ru/d/XXXXXXXX"   # ссылка на папку
OUT_DIR = Path("photos")
PROFILE_DIR = "browser_profile"                   # тут сохранится вход в аккаунт
OUT_DIR.mkdir(exist_ok=True)

# JS: находит самую большую видимую картинку на странице (это фото в просмотрщике)
FIND_BIG_IMG = """
() => {
  let best = null, bestArea = 0;
  for (const img of document.images) {
    const r = img.getBoundingClientRect();
    const area = r.width * r.height;
    if (r.width > 300 && r.height > 300 && area > bestArea && img.src.startsWith('http')) {
      best = img; bestArea = area;
    }
  }
  return best ? best.src : null;
}
"""

def ext_from_content_type(ct: str) -> str:
    ct = (ct or "").lower()
    if "png" in ct: return ".png"
    if "webp" in ct: return ".webp"
    if "gif" in ct: return ".gif"
    return ".jpg"

with sync_playwright() as p:
    ctx = p.chromium.launch_persistent_context(PROFILE_DIR, headless=False)
    page = ctx.pages[0] if ctx.pages else ctx.new_page()
    page.goto(FOLDER_URL)

    input("Откройте в браузере ПЕРВОЕ фото (кликните по нему), "
          "затем нажмите Enter здесь... ")

    seen = set()
    n = 0
    while True:
        page.wait_for_timeout(1500)            # даём загрузиться картинке
        src = page.evaluate(FIND_BIG_IMG)
        if not src:
            print("Картинка не найдена, останавливаюсь.")
            break
        if src in seen:
            print("Дошли до конца (картинка повторилась).")
            break
        seen.add(src)

        # то же самое, что «Сохранить как», только через сессию браузера
        resp = ctx.request.get(src)
        if resp.ok:
            n += 1
            ext = ext_from_content_type(resp.headers.get("content-type"))
            path = OUT_DIR / f"photo_{n:04d}{ext}"
            path.write_bytes(resp.body())
            print(f"[{n}] сохранено: {path}")
        else:
            print(f"Ошибка {resp.status} для {src}")

        page.keyboard.press("ArrowRight")      # следующее фото
        time.sleep(0.5)

    ctx.close()