import re from datetime import datetime, timedelta import sqlite3 import requests from bs4 import BeautifulSoup def setup_database() -> None: conn = sqlite3.connect("activity_log.db") cursor = conn.cursor() cursor.execute( """ CREATE TABLE IF NOT EXISTS activity_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp TEXT UNIQUE NOT NULL ) """ ) conn.commit() conn.close() def log_activity(timestamp: str) -> None: conn = sqlite3.connect("activity_log.db") cursor = conn.cursor() cursor.execute( "INSERT OR IGNORE INTO activity_log (timestamp) VALUES (?)", (timestamp,) ) conn.commit() conn.close() def parse_last_seen(text: str) -> datetime | None: now = datetime.now() if "Visto por Ășltima vez" in text: hours_match = re.search(r"(\d+) horas", text) minutes_match = re.search(r"(\d+) minutos", text) if hours_match: hours_ago = int(hours_match.group(1)) return now - timedelta(hours=hours_ago) if minutes_match: minutes_ago = int(minutes_match.group(1)) return now - timedelta(minutes=minutes_ago) elif "online" in text.lower(): return now return None def scrape_and_log(url: str) -> None: response = requests.get(url) if response.status_code != 200: return soup = BeautifulSoup(response.text, "html.parser") details_row = soup.find("div", class_="details-row") if not details_row: return offline_div = details_row.find("div", class_="offline") if not offline_div: return last_seen_text = offline_div.text.strip() last_seen_time = parse_last_seen(last_seen_text) if not last_seen_time: return timestamp = last_seen_time.strftime("%Y-%m-%d %H:%M:%S") log_activity(timestamp) if __name__ == "__main__": url = "https://es.xhamsterporno.mx/users/johnneal911" setup_database() scrape_and_log(url)