import osimport socketimport platformimport subprocessfrom datetime import datetimeimport tkinter as tkfrom tkinter import scrolledtext, messageboximport requestsimport webbrowser# =============================# 基础工具函数# =============================def ping(host): param = "-n" if platform.system().lower() == "windows" else "-c" command = ["ping", param, "2", host] return subprocess.call(command, stdout=subprocess.DEVNULL) == 0def check_dns(domain): try: ip = socket.gethostbyname(domain) return True, ip except: return False, Nonedef get_gateway(): if platform.system().lower() == "windows": result = subprocess.check_output("ipconfig", encoding="gbk", errors="ignore") for line in result.split("\n"): if "默认网关" in line or "Default Gateway" in line: gw = line.split(":")[-1].strip() if gw: return gw return Nonedef get_local_ip(): try: hostname = socket.gethostname() ip = socket.gethostbyname(hostname) return ip except: return "未知"# =============================# 核心检测逻辑(国内优化版)# =============================def run_diagnosis(output_box): output_box.delete(1.0, tk.END) result_log = [] status = { "gateway": False, "internet": False, "dns": False, "http": False } def log(msg): output_box.insert(tk.END, msg + "\n") output_box.see(tk.END) result_log.append(msg) log("===== 网络诊断开始(国内优化版)=====") # 本机信息 local_ip = get_local_ip() log(f"本机IP: {local_ip}") # 1. 网关检测 gateway = get_gateway() if gateway: log(f"网关: {gateway}") if ping(gateway): log("✅ 网关正常") status["gateway"] = True else: log("❌ 网关不通(局域网问题)") generate_report(result_log) return else: log("❌ 未获取到网关") # 2. 外网检测(国内DNS) if ping("223.5.5.5") or ping("119.29.29.29"): log("✅ 外网IP连通正常(阿里/腾讯DNS)") status["internet"] = True else: log("❌ 无法访问外网(出口问题)") generate_report(result_log) return # 3. DNS检测 ok, ip = check_dns("www.baidu.com") if ok: log(f"✅ DNS正常 -> {ip}") status["dns"] = True else: log("❌ DNS解析失败") generate_report(result_log) return # 4. HTTP检测 try: r = requests.get("http://www.baidu.com", timeout=5) if r.status_code == 200: log("✅ HTTP访问正常(百度)") status["http"] = True else: log("⚠️ HTTP状态异常") except: log("❌ HTTP访问失败(网页打不开)") # ============================= # 智能判断(核心亮点🔥) # ============================= log("\n===== 智能诊断结果 =====") if not status["gateway"]: log("👉 问题定位:局域网/网线/交换机故障") elif not status["internet"]: log("👉 问题定位:运营商/出口网络问题") elif not status["dns"]: log("👉 问题定位:DNS配置异常") elif not status["http"]: log("👉 问题定位:浏览器/防火墙/代理问题") else: log("🎉 网络完全正常!") log("===== 诊断完成 =====") generate_report(result_log)# =============================# HTML报告生成# =============================def generate_report(logs): now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") filename = f"network_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html" html = f""" <html> <head> <meta charset="utf-8"> <title>网络检测报告</title> <style> body {{ font-family: Arial; background: #f4f6f8; padding: 20px; }} h1 {{ color: #333; }} .ok {{ color: green; }} .fail {{ color: red; }} .warn {{ color: orange; }} .box {{ background: #fff; padding: 20px; border-radius: 10px; }} </style> </head> <body> <div class="box"> <h1>网络检测报告</h1> <p>时间: {now}</p> <hr> """ for line in logs: if "✅" in line: html += f"<p class='ok'>{line}</p>" elif "❌" in line: html += f"<p class='fail'>{line}</p>" elif "⚠️" in line: html += f"<p class='warn'>{line}</p>" else: html += f"<p>{line}</p>" html += """ </div> </body> </html> """ with open(filename, "w", encoding="utf-8") as f: f.write(html) # 自动打开报告 webbrowser.open(filename) messagebox.showinfo("完成", f"报告已生成:{filename}")# =============================# GUI界面# =============================def create_gui(): window = tk.Tk() window.title("网络一键诊断工具(终极版)") window.geometry("720x520") title = tk.Label(window, text="网络一键诊断工具(国内优化版)", font=("Arial", 16)) title.pack(pady=10) output_box = scrolledtext.ScrolledText(window, width=85, height=22) output_box.pack(padx=10, pady=10) btn = tk.Button(window, text="开始检测", font=("Arial", 12), command=lambda: run_diagnosis(output_box)) btn.pack(pady=10) window.mainloop()# =============================# 主程序# =============================if __name__ == "__main__": create_gui()