Screenshotter
This commit is contained in:
@@ -1 +1,4 @@
|
||||
path: data/odkazy.xlsx
|
||||
|
||||
screenshotter:
|
||||
target_path: data/screenshots/
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
def capture_ticket(url, path, ticket_selector = ".ticket-detail-wrapper"):
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch(headless=True)
|
||||
page = browser.new_page()
|
||||
page.goto(url)
|
||||
page.wait_for_selector(ticket_selector)
|
||||
page.locator(ticket_selector).screenshot(path=path)
|
||||
browser.close()
|
||||
@@ -13,6 +13,7 @@ dependencies = [
|
||||
"pandas==3.0.1",
|
||||
"openpyxl>=3.1.0",
|
||||
"PyYaml==6.0.3",
|
||||
"playwright==1.58.0"
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
|
||||
@@ -1,32 +1,38 @@
|
||||
import argparse
|
||||
|
||||
from datetime import datetime
|
||||
import yaml
|
||||
from pydantic import ValidationError
|
||||
|
||||
from beaky.config import Config
|
||||
from beaky.scanner.scanner import Links
|
||||
from beaky.scanner.scanner import Link
|
||||
from beaky.screenshotter.screenshotter import Screenshotter
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="beaky"
|
||||
)
|
||||
|
||||
parser.add_argument("--config", help="Path to config file.", default="config/application.yml")
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.config) as f:
|
||||
def load_config(path: str) -> Config | None:
|
||||
with open(path) as f:
|
||||
config_dict = yaml.safe_load(f)
|
||||
try:
|
||||
config = Config(**config_dict)
|
||||
return Config(**config_dict)
|
||||
except ValidationError as e:
|
||||
print("Bad arguments")
|
||||
print("Bad config")
|
||||
print(e)
|
||||
return None
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(prog="beaky")
|
||||
parser.add_argument("--config", help="Path to config file.", default="config/application.yml")
|
||||
parser.add_argument("mode", choices=["screenshotter"], help="Mode of operation.")
|
||||
|
||||
args = parser.parse_args()
|
||||
config = load_config(args.config)
|
||||
if config is None:
|
||||
return
|
||||
|
||||
data = Links(config.path)
|
||||
data.ret_links()
|
||||
for link in data:
|
||||
print(link)
|
||||
if args.mode == "screenshotter":
|
||||
screenshotter = Screenshotter(config)
|
||||
screenshotter.capture_tickets([Link("1",
|
||||
"https://applink.ifortuna.cz/ticketdetail?id=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDRkUwUUJNNktDMzQyUjAwIiwicHJmIjoiUFVCTElDIiwiaXNzIjoiYmV0c2xpcC1zZXJ2aWNlIiwiaWF0IjoxNzcyODc2NTk0fQ.QGiBJRINDsSVKQn3WKRa7XDql5wiLDOG8R7QKc2bD-0&source=SB&deeplink=ftncz%3A%2F%2Fbetslip-history%2Fdetail%3Fid%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDRkUwUUJNNktDMzQyUjAwIiwicHJmIjoiUFVCTElDIiwiaXNzIjoiYmV0c2xpcC1zZXJ2aWNlIiwiaWF0IjoxNzcyODc2NTk0fQ.QGiBJRINDsSVKQn3WKRa7XDql5wiLDOG8R7QKc2bD-0%26source%3DSB",
|
||||
datetime.now())])
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
from pydantic.dataclasses import dataclass
|
||||
|
||||
from beaky.screenshotter.config import ScreenshotterConfig
|
||||
|
||||
|
||||
@dataclass
|
||||
class Config:
|
||||
path: str
|
||||
screenshotter: ScreenshotterConfig
|
||||
@@ -77,8 +77,9 @@ class Links:
|
||||
if id_idx is None or url_idx is None:
|
||||
# Required columns missing
|
||||
return []
|
||||
|
||||
print(rows)
|
||||
for row in rows:
|
||||
print(row)
|
||||
try:
|
||||
raw_id = row[id_idx] if id_idx < len(row) else None
|
||||
raw_url = row[url_idx] if url_idx < len(row) else None
|
||||
|
||||
0
src/beaky/screenshotter/__init__.py
Normal file
0
src/beaky/screenshotter/__init__.py
Normal file
5
src/beaky/screenshotter/config.py
Normal file
5
src/beaky/screenshotter/config.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from pydantic.dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class ScreenshotterConfig:
|
||||
target_path: str
|
||||
26
src/beaky/screenshotter/screenshotter.py
Normal file
26
src/beaky/screenshotter/screenshotter.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from pathlib import Path
|
||||
|
||||
from beaky.config import Config
|
||||
from playwright.sync_api import sync_playwright
|
||||
from beaky.scanner.scanner import Link
|
||||
|
||||
class Screenshotter:
|
||||
def __init__(self, config: Config):
|
||||
self.config = config
|
||||
|
||||
|
||||
def capture_tickets(self, links: list[Link]):
|
||||
for link in links:
|
||||
print("capturing link:", link)
|
||||
target_path = Path(self.config.screenshotter.target_path) / f"{link.id}.png"
|
||||
self.capture_ticket(link.url, target_path)
|
||||
|
||||
def capture_ticket(self, url, target_path, ticket_selector=".betslip-history-detail"):
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch(headless=True)
|
||||
page = browser.new_page()
|
||||
page.goto(url, wait_until="domcontentloaded")
|
||||
page.wait_for_selector(ticket_selector)
|
||||
page.wait_for_load_state("networkidle")
|
||||
page.locator(ticket_selector).screenshot(path=target_path)
|
||||
browser.close()
|
||||
Reference in New Issue
Block a user