Spaces:
Running
Running
| 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() | |