keepalive / app.py
datamk's picture
Upload 3 files
502749c verified
raw
history blame
2.82 kB
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()