Files
gz/test.py
T

599 lines
25 KiB
Python

import time
import threading
import queue
import tkinter as tk
from tkinter import ttk, scrolledtext
import os
import tempfile
import ssl
import urllib3
import requests
requests.packages.urllib3.disable_warnings()
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
OFF = "OFF"
driver = None
def add_log(log_text, message):
timestamp = time.strftime("%H:%M:%S", time.localtime())
log_text.insert(tk.END, f"[{timestamp}] {message}\n")
log_text.see(tk.END)
log_text.update()
def login(driver, username, password, q, device_type=None):
try:
q.put("正在打开网关登录页面...")
driver.get("http://192.168.1.1")
time.sleep(2)
q.put(f"正在输入用户名: {username}")
login_username = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div/table/tbody/tr[1]/td/input")
login_username.clear()
login_username.send_keys(username)
q.put("正在输入密码...")
login_password = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div/table/tbody/tr[2]/td/input")
login_password.clear()
login_password.send_keys(password)
q.put("正在点击登录按钮...")
login_input = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div/table/tbody/tr[4]/td/input[1]")
login_input.click()
time.sleep(3)
q.put("登录成功!")
return True
except Exception as e:
q.put(f"登录失败: {str(e)}")
return False
def get_pon_info(driver, q):
try:
q.put("正在获取PON信息...")
zt_wlc = driver.find_element(By.XPATH, "/html/body/div/div[1]/div[2]/div[2]/div[3]/table/tbody/tr/td/span[2]/a")
zt_wlc.click()
time.sleep(1)
zt_wlc_pon = driver.find_element(By.XPATH, "/html/body/div/div[3]/div[1]/p[3]/a")
zt_wlc_pon.click()
time.sleep(1)
driver.get("http://192.168.1.1/html/amp/opticinfo/e8ceponlink_user.asp")
time.sleep(2)
zt_wlc_pon_jsggl = driver.find_element(By.XPATH, '//*[@id="ReceivePower"]')
jsggl = zt_wlc_pon_jsggl.text
q.put(f"接收光功率原始值: [{jsggl}]")
if "未连接光纤状态" in jsggl:
q.put("警告:未连接光纤状态")
else:
q.put(f"接收光功率: {jsggl}")
q.put("光纤状态正常")
return True
except Exception as e:
q.put(f"获取PON信息失败: {str(e)}")
return False
def set_reboot(driver, q):
try:
q.put("正在设置自动重启...")
driver.get("http://192.168.1.1/html/ssmp/scheduledrestart/Scheduledrestart.asp")
time.sleep(2)
reboot_element = driver.find_element(By.XPATH, '//*[@id="rebootChEnable"]')
reboot_state = reboot_element.is_selected()
if not reboot_state:
reboot_element.click()
q.put("已启用定时重启")
time.sleep(1)
reboot_days = ['repeat_day1', 'repeat_day2', 'repeat_day3', 'repeat_day4', 'repeat_day5', 'repeat_day6', 'repeat_day7']
for i, day_id in enumerate(reboot_days):
day_element = driver.find_element(By.XPATH, f'//*[@id="{day_id}"]')
if i == 0:
if not day_element.is_selected():
day_element.click()
q.put(f"已选择周一")
else:
if day_element.is_selected():
day_element.click()
q.put(f"已取消选择周{i+1}")
reboot_save = driver.find_element(By.XPATH, '//*[@id="applyButton"]')
reboot_save.click()
time.sleep(2)
q.put("自动重启设置完成")
return True
except Exception as e:
q.put(f"设置自动重启失败: {str(e)}")
return False
def get_device_type(driver, q):
try:
# 识别设备类型
# 根据登录页面锁定设备的大致类型
q.put("正在识别设备类型...")
# 暂时模拟
return None
except NoSuchElementException:
return None
except Exception as e:
return e
def register_loid(driver, code, q):
try:
q.put("正在进行LOID注册...")
driver.get("http://192.168.1.1/loidreg.asp")
time.sleep(2)
code_element = driver.find_element(By.XPATH, '//*[@id="PwdValue"]')
code_element.clear()
code_element.send_keys(code)
q.put(f"已输入注册码: {code}")
enter_code = driver.find_element(By.XPATH, '//*[@id="setReg"]')
enter_code.click()
time.sleep(2)
q.put("注册提交成功,等待系统处理...")
return True
except Exception as e:
q.put(f"注册失败: {str(e)}")
return False
def set_wifi_name_and_password(driver, q, wifi_name, wifi_password, update_name=True, update_password=True):
try:
q.put("正在设置WIFI...")
driver.get("http://192.168.1.1/html/amp/wlanbasic/e8cWlanBasic.asp?2G")
time.sleep(2)
if update_name:
wifi_name_element = driver.find_element(By.XPATH, '//*[@id="WlanSsid_text"]')
wifi_name_element.clear()
wifi_name_element.send_keys("CMCC-%s" % wifi_name)
q.put(f"已设置2.4G WiFi名称: CMCC-{wifi_name}")
else:
q.put("跳过2.4G WiFi名称修改")
if update_password:
wifi_password_element = driver.find_element(By.XPATH, '//*[@id="WlanPassword_password"]')
wifi_password_element.clear()
wifi_password_element.send_keys(wifi_password)
q.put("已设置2.4G WiFi密码")
else:
q.put("跳过2.4G WiFi密码修改")
save_2g_wifi_element = driver.find_element(By.XPATH, '//*[@id="Save_button"]')
save_2g_wifi_element.click()
time.sleep(2)
driver.get("http://192.168.1.1/html/amp/wlanbasic/e8cWlanBasic.asp?5G")
time.sleep(2)
if update_name:
wifi_name_element = driver.find_element(By.XPATH, '//*[@id="WlanSsid_text"]')
wifi_name_element.clear()
wifi_name_element.send_keys("CMCC-%s-5G" % wifi_name)
q.put(f"已设置5G WiFi名称: CMCC-{wifi_name}-5G")
else:
q.put("跳过5G WiFi名称修改")
if update_password:
wifi_password_element = driver.find_element(By.XPATH, '//*[@id="WlanPassword_password"]')
wifi_password_element.clear()
wifi_password_element.send_keys(wifi_password)
q.put("已设置5G WiFi密码")
else:
q.put("跳过5G WiFi密码修改")
save_5g_wifi_element = driver.find_element(By.XPATH, '//*[@id="Save_button"]')
save_5g_wifi_element.click()
time.sleep(2)
q.put("WIFI设置完成")
return True
except Exception as e:
q.put(f"设置WIFI失败: {str(e)}")
return False
def set_wifi_state(driver, q, wifi_state):
try:
action = "启用" if wifi_state else "关闭"
q.put(f"正在{action}无线网...")
driver.get("http://192.168.1.1/html/amp/wlanbasic/cmccWlanSwitch.asp")
time.sleep(2)
wifi_state_element = driver.find_element(By.XPATH, '//*[@id="WlanEnable_checkbox"]')
wifi_is_selected = wifi_state_element.is_selected()
if wifi_state != wifi_is_selected:
wifi_state_element.click()
q.put(f"已{action}无线网")
time.sleep(1)
else:
q.put("当前设置正确无需修改!")
return True
except Exception as e:
q.put(f"设置WiFi状态失败: {str(e)}")
return False
def run_automation(username, password, code, wifi_state, wifi_name, wifi_password, update_wifi_name, update_wifi_password, browser_choice, log_text, status_label, start_button):
global driver
q = queue.Queue()
def worker():
global driver
try:
q.put(f"正在启动浏览器 ({browser_choice})...")
try:
q.put(f"正在检查{browser_choice}浏览器驱动...")
ssl._create_default_https_context = ssl._create_unverified_context
os.environ['WDM_LOCAL'] = '1'
os.environ['WDM_SSL_VERIFY'] = '0'
wdm_cache_dir = os.path.join(tempfile.gettempdir(), "router_tool_wdm")
os.environ['WDM_CACHE_DIR'] = wdm_cache_dir
os.makedirs(wdm_cache_dir, exist_ok=True)
q.put(f"驱动缓存目录: {wdm_cache_dir}")
import shutil
for item in os.listdir(wdm_cache_dir):
item_path = os.path.join(wdm_cache_dir, item)
if os.path.isdir(item_path) and ('html' in item.lower() or 'DOCTYPE' in item or len(item) > 100):
shutil.rmtree(item_path)
q.put(f"清理无效缓存目录: {item}")
if browser_choice == "Chrome":
driver_path = ChromeDriverManager().install()
q.put(f"Chrome驱动已安装: {driver_path}")
driver = webdriver.Chrome()
elif browser_choice == "Firefox":
driver_path = GeckoDriverManager().install()
q.put(f"Firefox驱动已安装: {driver_path}")
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
firefox_binaries = [
r"C:\Program Files\Mozilla Firefox\firefox.exe",
r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe",
]
for fb in firefox_binaries:
if os.path.isfile(fb):
options.binary_location = fb
q.put(f"使用Firefox浏览器: {fb}")
break
service = FirefoxService(executable_path=driver_path)
driver = webdriver.Firefox(service=service, options=options)
else:
driver_path = EdgeChromiumDriverManager().install()
q.put(f"Edge驱动已安装: {driver_path}")
driver = webdriver.Edge()
q.put("浏览器启动成功")
except Exception as e:
q.put(f"驱动安装失败,尝试手动查找驱动: {str(e)}")
try:
if browser_choice == "Chrome":
import glob as _glob
chrome_driver_paths = [
r"C:\Program Files\Google\Chrome\Application\chromedriver.exe",
r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",
os.path.join(os.path.expanduser("~"), ".wdm", "drivers", "chromedriver", "win64"),
os.path.join(tempfile.gettempdir(), "router_tool_wdm"),
]
found = None
for p in chrome_driver_paths:
if os.path.isdir(p):
for f in os.listdir(p):
if "chromedriver" in f.lower() and f.endswith(".exe"):
found = os.path.join(p, f)
break
if found: break
elif os.path.isfile(p):
found = p; break
if found:
q.put(f"找到Chrome驱动: {found}")
driver = webdriver.Chrome(found)
else:
driver = webdriver.Chrome()
elif browser_choice == "Firefox":
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
firefox_binaries = [
r"C:\Program Files\Mozilla Firefox\firefox.exe",
r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe",
]
for fb in firefox_binaries:
if os.path.isfile(fb):
options.binary_location = fb
q.put(f"使用Firefox浏览器: {fb}")
break
gecko_paths = [
os.path.join(os.path.expanduser("~"), ".wdm", "drivers", "geckodriver", "win64"),
os.path.join(tempfile.gettempdir(), "router_tool_wdm"),
]
gecko_found = None
for p in gecko_paths:
if os.path.isdir(p):
for f in os.listdir(p):
if "geckodriver" in f.lower() and f.endswith(".exe"):
gecko_found = os.path.join(p, f)
break
if gecko_found: break
if gecko_found:
q.put(f"找到Firefox驱动: {gecko_found}")
service = FirefoxService(executable_path=gecko_found)
driver = webdriver.Firefox(service=service, options=options)
else:
driver = webdriver.Firefox(options=options)
else:
edge_driver_paths = [
r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe",
r"C:\Program Files\Microsoft\Edge\Application\msedgedriver.exe",
os.path.join(os.path.expanduser("~"), ".wdm", "drivers", "edgedriver", "win64"),
os.path.join(tempfile.gettempdir(), "router_tool_wdm"),
]
found = None
for p in edge_driver_paths:
if os.path.isdir(p):
for f in os.listdir(p):
if f.endswith("msedgedriver.exe"):
found = os.path.join(p, f)
break
if found: break
elif os.path.isfile(p):
found = p; break
if found:
q.put(f"找到Edge驱动: {found}")
driver = webdriver.Edge(found)
else:
driver = webdriver.Edge()
q.put("浏览器启动成功")
except Exception as e2:
q.put(f"所有方式均失败: {str(e2)}")
raise
driver.implicitly_wait(10)
q.put("隐式等待已设置")
q.put("正在识别设备类型")
device_type = get_device_type(driver, q)
q.put("识别完成.")
q.put("准备登录...")
login(driver, username, password, q, device_type)
q.put("登录操作完成")
q.put("准备获取PON信息...")
get_pon_info(driver, q)
q.put("获取PON信息完成")
q.put("设置wifi启用状态")
set_wifi_state(driver, q, wifi_state)
q.put("设置wifi启用状态完毕")
q.put("准备设置WIFI名称和密码...")
set_wifi_name_and_password(driver, q, wifi_name, wifi_password, update_wifi_name, update_wifi_password)
q.put("设置WIFI名称密码成功")
q.put("准备设置自动重启...")
set_reboot(driver, q)
q.put("设置自动重启完成")
q.put("准备注册LOID...")
register_loid(driver, code, q)
q.put("注册LOID完成")
q.put("所有操作完成!")
except Exception as e:
import traceback
q.put(f"运行异常: {str(e)}")
q.put(f"异常详情: {traceback.format_exc()}")
finally:
q.put("浏览器将在一分钟后关闭...")
time.sleep(60)
if driver:
driver.quit()
driver = None
q.put("浏览器已关闭")
def update_ui():
nonlocal start_button
try:
while True:
message = q.get_nowait()
add_log(log_text, message)
if "登录成功" in message:
status_label.config(text="状态: 登录成功", foreground="green")
elif "失败" in message:
status_label.config(text="状态: 操作失败", foreground="red")
elif "浏览器已关闭" in message:
status_label.config(text="状态: 全部完成", foreground="blue")
start_button.config(state=tk.NORMAL)
return
except queue.Empty:
pass
log_text.after(100, update_ui)
start_button.config(state=tk.DISABLED)
status_label.config(text="状态: 运行中", foreground="orange")
thread = threading.Thread(target=worker)
thread.daemon = True
thread.start()
update_ui()
def on_closing(root, log_text):
global driver
add_log(log_text, "正在关闭程序...")
if driver:
add_log(log_text, "正在关闭浏览器...")
driver.quit()
driver = None
root.destroy()
def main():
root = tk.Tk()
root.title("路由器管理工具")
root.geometry("700x600")
root.resizable(True, True)
main_frame = ttk.Frame(root, padding="20")
main_frame.pack(fill=tk.BOTH, expand=True)
main_frame.grid_columnconfigure(1, weight=1)
main_frame.grid_rowconfigure(13, weight=1)
ttk.Label(main_frame, text="账号:", font=("微软雅黑", 12)).grid(row=0, column=0, sticky=tk.W, pady=10)
username_var = tk.StringVar(value="")
username_entry = ttk.Entry(main_frame, textvariable=username_var, font=("微软雅黑", 12))
username_entry.grid(row=0, column=1, pady=10, sticky=tk.EW)
ttk.Label(main_frame, text="密码:", font=("微软雅黑", 12)).grid(row=1, column=0, sticky=tk.W, pady=10)
password_var = tk.StringVar(value="")
password_entry = ttk.Entry(main_frame, textvariable=password_var, font=("微软雅黑", 12), show="*")
password_entry.grid(row=1, column=1, pady=10, sticky=tk.EW)
is_admin_mode = tk.BooleanVar(value=False)
def toggle_admin_mode():
if is_admin_mode.get():
username_var.set("")
password_var.set("")
username_entry.config(state=tk.NORMAL)
password_entry.config(state=tk.NORMAL)
admin_button.config(text="选择超级管理员账号")
is_admin_mode.set(False)
else:
username_var.set("CMCCAdmin")
password_var.set("aDm8H%MdA")
username_entry.config(state=tk.DISABLED)
password_entry.config(state=tk.DISABLED)
admin_button.config(text="切换为普通账号")
is_admin_mode.set(True)
admin_button = ttk.Button(main_frame, text="选择超级管理员账号", command=toggle_admin_mode)
admin_button.grid(row=0, column=2, pady=10, padx=5)
def toggle_password():
if password_entry.cget("show") == "*":
password_entry.config(show="")
password_toggle.config(text="隐藏")
else:
password_entry.config(show="*")
password_toggle.config(text="显示")
password_toggle = ttk.Button(main_frame, text="显示", command=toggle_password)
password_toggle.grid(row=1, column=2, pady=10, padx=5)
ttk.Label(main_frame, text="LOID码:", font=("微软雅黑", 12)).grid(row=2, column=0, sticky=tk.W, pady=10)
code_var = tk.StringVar(value="11111111")
code_entry = ttk.Entry(main_frame, textvariable=code_var, font=("微软雅黑", 12))
code_entry.grid(row=2, column=1, pady=10, sticky=tk.EW)
update_wifi_name_var = tk.BooleanVar(value=False)
def on_update_wifi_name_change(*args):
if update_wifi_name_var.get():
wifi_name_entry.config(state=tk.NORMAL)
else:
wifi_name_entry.config(state=tk.DISABLED)
update_wifi_name_checkbox = ttk.Checkbutton(main_frame, text="修改WiFi名称", variable=update_wifi_name_var, command=on_update_wifi_name_change)
update_wifi_name_checkbox.grid(row=3, column=0, columnspan=2, pady=5, sticky=tk.W)
ttk.Label(main_frame, text="WiFi名称:", font=("微软雅黑", 12)).grid(row=4, column=0, sticky=tk.W, pady=10)
wifi_name_var = tk.StringVar(value="")
wifi_name_entry = ttk.Entry(main_frame, textvariable=wifi_name_var, font=("微软雅黑", 12), state=tk.DISABLED)
wifi_name_entry.grid(row=4, column=1, pady=10, sticky=tk.EW)
update_wifi_password_var = tk.BooleanVar(value=False)
def on_update_wifi_password_change(*args):
if update_wifi_password_var.get():
wifi_password_entry.config(state=tk.NORMAL)
wifi_password_toggle.config(state=tk.NORMAL)
else:
wifi_password_entry.config(state=tk.DISABLED)
wifi_password_toggle.config(state=tk.DISABLED)
update_wifi_password_checkbox = ttk.Checkbutton(main_frame, text="修改WiFi密码", variable=update_wifi_password_var, command=on_update_wifi_password_change)
update_wifi_password_checkbox.grid(row=5, column=0, columnspan=2, pady=5, sticky=tk.W)
ttk.Label(main_frame, text="WiFi密码:", font=("微软雅黑", 12)).grid(row=6, column=0, sticky=tk.W, pady=10)
wifi_password_var = tk.StringVar(value="")
wifi_password_entry = ttk.Entry(main_frame, textvariable=wifi_password_var, font=("微软雅黑", 12), show="*", state=tk.DISABLED)
wifi_password_entry.grid(row=6, column=1, pady=10, sticky=tk.EW)
def toggle_wifi_password():
if wifi_password_entry.cget("show") == "*":
wifi_password_entry.config(show="")
wifi_password_toggle.config(text="隐藏")
else:
wifi_password_entry.config(show="*")
wifi_password_toggle.config(text="显示")
wifi_password_toggle = ttk.Button(main_frame, text="显示", command=toggle_wifi_password, state=tk.DISABLED)
wifi_password_toggle.grid(row=6, column=2, pady=10, padx=5)
wifi_state_var = tk.BooleanVar(value=True)
wifi_state_checkbox = ttk.Checkbutton(main_frame, text="启用WiFi", variable=wifi_state_var)
wifi_state_checkbox.grid(row=7, column=0, columnspan=2, pady=10, sticky=tk.W)
ttk.Label(main_frame, text="浏览器:", font=("微软雅黑", 12)).grid(row=9, column=0, sticky=tk.W, pady=10)
browser_var = tk.StringVar(value="Edge")
browser_frame = ttk.Frame(main_frame)
browser_frame.grid(row=9, column=1, pady=10, sticky=tk.W)
ttk.Radiobutton(browser_frame, text="Edge", variable=browser_var, value="Edge").pack(side=tk.LEFT, padx=(0, 15))
ttk.Radiobutton(browser_frame, text="Chrome", variable=browser_var, value="Chrome").pack(side=tk.LEFT, padx=(0, 15))
ttk.Radiobutton(browser_frame, text="Firefox", variable=browser_var, value="Firefox").pack(side=tk.LEFT)
status_label = ttk.Label(main_frame, text="状态: 就绪", font=("微软雅黑", 10), foreground="green")
status_label.grid(row=10, column=0, columnspan=2, pady=5)
start_button = ttk.Button(main_frame, text="开始执行", command=lambda: run_automation(
username_var.get(),
password_var.get(),
code_var.get(),
wifi_state_var.get(),
wifi_name_var.get(),
wifi_password_var.get(),
update_wifi_name_var.get(),
update_wifi_password_var.get(),
browser_var.get(),
log_text,
status_label,
start_button
))
start_button.grid(row=11, column=0, columnspan=2, pady=10)
ttk.Label(main_frame, text="实时日志:", font=("微软雅黑", 10)).grid(row=12, column=0, columnspan=3, sticky=tk.W)
log_text = scrolledtext.ScrolledText(main_frame, font=("Consolas", 10))
log_text.grid(row=13, column=0, columnspan=3, pady=5, sticky=tk.NSEW)
root.protocol("WM_DELETE_WINDOW", lambda: on_closing(root, log_text))
root.mainloop()
if __name__ == '__main__':
main()