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