init auth and main function

This commit is contained in:
Yuriy Yuriev
2026-05-14 16:15:58 +07:00
commit 27c53e897e
47 changed files with 5750 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
"""Service for scheduled page visits."""
import asyncio
import random
import logging
from typing import Optional, Callable, Awaitable
from config.settings import settings
from services.browser_service import BrowserService
logger = logging.getLogger(__name__)
class VisitScheduler:
"""
Scheduler for periodic page visits.
Features:
- Schedule periodic visits
- Configurable delays and reading times
- Progress tracking
"""
def __init__(
self,
browser_service: BrowserService,
url: str,
min_delay: int = None,
max_delay: int = None,
min_reading: int = None,
max_reading: int = None,
max_visits: Optional[int] = None,
on_visit_complete: Optional[Callable] = None,
on_progress: Optional[Callable] = None
):
self.browser_service = browser_service
self.url = url
self.min_delay = min_delay or settings.DEFAULT_MIN_DELAY
self.max_delay = max_delay or settings.DEFAULT_MAX_DELAY
self.min_reading = min_reading or settings.DEFAULT_MIN_READING
self.max_reading = max_reading or settings.DEFAULT_MAX_READING
self.max_visits = max_visits
self.on_visit_complete = on_visit_complete
self.on_progress = on_progress
self.visit_count = 0
self.successful = 0
self.failed = 0
async def run(self) -> dict:
"""
Run scheduled visits.
Returns:
Statistics dict
"""
total_reading_time = 0
try:
while True:
if self.max_visits and self.visit_count >= self.max_visits:
logger.info(f"Visit limit reached: {self.max_visits}")
break
# Randomize parameters
current_reading = random.randint(self.min_reading, self.max_reading)
current_delay = random.randint(self.min_delay, self.max_delay)
self.visit_count += 1
logger.info(
f"Visit {self.visit_count}/{'' if not self.max_visits else self.max_visits}: "
f"reading={current_reading}s"
)
# Visit page
result = await self.browser_service.visit_page(
self.url, current_reading
)
if result.success:
self.successful += 1
total_reading_time += current_reading
else:
self.failed += 1
# Notify about visit completion
if self.on_visit_complete:
await self.on_visit_complete(
self.visit_count, result, current_delay, current_reading
)
if self.max_visits and self.visit_count >= self.max_visits:
break
# Wait before next visit
if self.on_progress:
await self.on_progress(self.visit_count, current_delay)
await asyncio.sleep(current_delay)
except asyncio.CancelledError:
logger.info("Visit scheduler cancelled")
raise
return {
"total_visits": self.visit_count,
"successful": self.successful,
"failed": self.failed,
"avg_reading_time": total_reading_time / self.successful if self.successful else 0
}