import streamlit as st import threading import time import schedule import random import datetime from playwright.sync_api import sync_playwright TARGET_URL = "https://streamer1-gvbgwaea2w2qmwgjey7ksg.streamlit.app/" # ── Shared log list (thread-safe for appends in CPython) ── logs = ["πŸš€ System initialized – service starting…"] def add_log(msg): ts = datetime.datetime.now().strftime("%H:%M:%S") entry = f"[{ts}] {msg}" print(entry) logs.append(entry) if len(logs) > 50: logs.pop(0) # ── Keep-alive routine ── def visit_and_scroll(): add_log(f"Opening {TARGET_URL}") try: with sync_playwright() as p: browser = p.chromium.launch( headless=True, args=["--no-sandbox", "--disable-dev-shm-usage", "--disable-gpu"], ) page = browser.new_page( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/120.0.0.0 Safari/537.36" ) page.goto(TARGET_URL, wait_until="networkidle", timeout=60_000) add_log("Page loaded – waiting 10 s for hydration…") time.sleep(10) for i in range(1, 6): y = i * 800 page.evaluate(f"window.scrollTo(0, {y});") add_log(f"Scrolled to {y}px") time.sleep(random.uniform(1.5, 3.0)) page.evaluate("window.scrollTo(0, 0);") browser.close() add_log("Visit completed successfully βœ…") except Exception as e: add_log(f"ERROR: {e}") # ── Background scheduler (one thread, runs forever) ── def _loop(): visit_and_scroll() schedule.every(1).hours.do(visit_and_scroll) while True: schedule.run_pending() time.sleep(60) # Guard: start the thread only once per process import os, sys _STARTED_FLAG = "/tmp/_keepalive_started" if not os.path.exists(_STARTED_FLAG): open(_STARTED_FLAG, "w").close() threading.Thread(target=_loop, daemon=True).start() # ── Streamlit UI ── st.set_page_config(page_title="Keep-Alive Console", page_icon="πŸš€", layout="wide") st.title("πŸ€– Keep-Alive Cloud Console") st.caption(f"Target: **{TARGET_URL}** β€’ Frequency: every 1 hour") st.divider() c1, c2 = st.columns([3, 1]) with c1: st.subheader("Activity Log") st.text_area("Logs (newest first)", "\n".join(reversed(logs)), height=400, disabled=True) with c2: st.subheader("Controls") if st.button("πŸš€ Push Now"): with st.spinner("Visiting…"): visit_and_scroll() st.success("Done!") st.info("Background scheduler is active.") # Auto-refresh every 30 s time.sleep(30) st.rerun()