import time
import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from webdriver_manager.chrome import ChromeDriverManager
# === Configuration ===
ROUTER_IP = '192.168.0.1'
PASSWORD = '********'
CYCLE_INTERVAL_SECONDS = 15 * 60  # 15 minutes
# === Logging Setup ===
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s',
    handlers=[
        logging.FileHandler("router_reconnect.log"),
        logging.StreamHandler()
    ]
)
# === Selenium Setup ===
options = Options()
options.add_argument('--headless')  # Comment this out to see the browser
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
def login():
    logging.info("Attempting login...")
    driver.get(f"http://{ROUTER_IP}")
    time.sleep(2)
    try:
        password_input = driver.find_element(By.ID, 'txtPwd')
        password_input.clear()
        password_input.send_keys(PASSWORD)
        logging.info("Entered password.")
        login_button = driver.find_element(By.ID, 'btnLogin')
        login_button.click()
        logging.info("Clicked login button.")
        time.sleep(5)
        driver.execute_script("""
            function ftb() {
                $(".color_background_blue").css("background-color","#456");
                $(".headcontainer").hide();
                $("body").prepend('<a style="font-weight:bolder;background-color: #448;color:white;padding: 10px;border-radius:10px;" onclick="ltebandselection()">SET</a>');
            }
            ftb();
        """)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//a[text()='SET']"))
        )
        logging.info("Login complete. Band lock UI is ready.")
        set_button = driver.find_element(By.XPATH, "//a[text()='SET']")
        set_button.click()
        logging.info("Band lock function triggered.")
    except (NoSuchElementException, TimeoutException) as e:
        logging.error(f"Login error: {e}")
def execute_band_lock(bands):
    logging.info(f"Executing band lock for bands: {bands}")
    try:
        driver.execute_script(f"""
            function err(e, a, n) {{
                console.log("Band lock error:", e, a, n);
            }}
            var selectedBands = "{bands}";
            var a = selectedBands.split("+"), n = 0;
            for (var l = 0; l < a.length; l++) {{
                n += Math.pow(2, parseInt(a[l]) - 1);
            }}
            var hexBand = "0x" + n.toString(16);
            $.ajax({{
                type: "GET",
                url: "/goform/goform_get_cmd_process",
                data: {{ cmd: "wa_inner_version,cr_version,RD", multi_data: "1" }},
                dataType: "json",
                success: function(e) {{
                    var ad = hex_md5(hex_md5(e.wa_inner_version + e.cr_version) + e.RD);
                    $.ajax({{
                        type: "POST",
                        url: "/goform/goform_set_cmd_process",
                        data: {{
                            isTest: "false",
                            goformId: "SET_LTE_BAND_LOCK",
                            lte_band_lock: hexBand,
                            AD: ad
                        }},
                        success: function() {{
                            console.log("Band lock applied.");
                        }},
                        error: err
                    }});
                }}
            }});
        """)
        logging.info(f"Band lock for {bands} applied.")
    except Exception as e:
        logging.error(f"Error applying band lock for {bands}: {e}")
def main():
    try:
        login()
        execute_band_lock("3")
        logging.info("Band 3 lock applied. Holding for 5 seconds...")
        time.sleep(5)
        execute_band_lock("1+3")
        logging.info("Band 1+3 lock applied. Holding for 895 seconds...")
        time.sleep(895)
    except Exception as e:
        logging.exception(f"Unexpected error in main: {e}")
if __name__ == "__main__":
    while True:
        main()
        logging.info("Cycle complete...")