简化代码并添加搜索功能的IP过滤器应用程序

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

简化以下代码,并给代码加入搜索功能,例如:搜索ip,出现资产内容、封禁原因、发现的设备、等情况。支持txt导入历史封禁ip地址,在黑名单或白名单里仅显示ip地址,但搜索时必须出现具体封禁信息,以下是程序代码:import tkinter as tk from tkinter import filedialog, messagebox import datetime import os import json

class IPFilterApp: def init(self, root): self.root = root self.root.title("IP过滤器")

    self.ip_list = []
    self.whitelist = []
    self.blacklist = []
    
    self.load_data()
    self.create_widgets()
    self.display_history()

def create_widgets(self):
    # IP Entry
    self.ip_label = tk.Label(self.root, text="IP地址:")
    self.ip_label.grid(row=0, column=0, padx=5, pady=5)
    
    self.ip_entry = tk.Entry(self.root)
    self.ip_entry.grid(row=0, column=1, padx=5, pady=5)
    
    # Name Entry
    self.name_label = tk.Label(self.root, text="设备名称:")
    self.name_label.grid(row=1, column=0, padx=5, pady=5)
    
    self.name_entry = tk.Entry(self.root)
    
回答:

为了简化代码并添加搜索功能,我们可以重构代码并添加必要的功能。以下是简化后的代码,并且加入了��索功能和txt导入历史封禁IP地址的功能:

import tkinter as tk
from tkinter import filedialog, messagebox
import json
import os

class IPFilterApp:
    def __init__(self, root):
        self.root = root
        self.root.title("IP过滤器")
        
        self.ip_data = {}
        self.whitelist = set()
        self.blacklist = set()
        
        self.load_data()
        self.create_widgets()
        self.display_history()
    
    def create_widgets(self):
        # IP Entry
        tk.Label(self.root, text="IP地址:").grid(row=0, column=0, padx=5, pady=5)
        self.ip_entry = tk.Entry(self.root)
        self.ip_entry.grid(row=0, column=1, padx=5, pady=5)
        
        # Name Entry
        tk.Label(self.root, text="设备名称:").grid(row=1, column=0, padx=5, pady=5)
        self.name_entry = tk.Entry(self.root)
        self.name_entry.grid(row=1, column=1, padx=5, pady=5)
        
        # Add to Blacklist Button
        tk.Button(self.root, text="添加到黑名单", command=self.add_to_blacklist).grid(row=2, column=0, padx=5, pady=5)
        
        # Add to Whitelist Button
        tk.Button(self.root, text="添加到白名单", command=self.add_to_whitelist).grid(row=2, column=1, padx=5, pady=5)
        
        # Search Entry
        tk.Label(self.root, text="搜索IP:").grid(row=3, column=0, padx=5, pady=5)
        self.search_entry = tk.Entry(self.root)
        self.search_entry.grid(row=3, column=1, padx=5, pady=5)
        
        # Search Button
        tk.Button(self.root, text="搜索", command=self.search_ip).grid(row=3, column=2, padx=5, pady=5)
        
        # History Display
        self.history_text = tk.Text(self.root, height=10, width=50)
        self.history_text.grid(row=4, column=0, columnspan=3, padx=5, pady=5)
        
        # Load History Button
        tk.Button(self.root, text="导入历史封禁IP", command=self.load_history).grid(row=5, column=0, columnspan=3, padx=5, pady=5)
    
    def load_data(self):
        if os.path.exists("ip_data.json"):
            with open("ip_data.json", "r") as file:
                self.ip_data = json.load(file)
                self.whitelist = set(self.ip_data.get("whitelist", []))
                self.blacklist = set(self.ip_data.get("blacklist", []))
    
    def save_data(self):
        self.ip_data["whitelist"] = list(self.whitelist)
        self.ip_data["blacklist"] = list(self.blacklist)
        with open("ip_data.json", "w") as file:
            json.dump(self.ip_data, file)
    
    def add_to_blacklist(self):
        ip = self.ip_entry.get()
        name = self.name_entry.get()
        if ip:
            self.blacklist.add(ip)
            self.ip_data[ip] = {"name": name, "list": "blacklist"}
            self.save_data()
            self.display_history()
    
    def add_to_whitelist(self):
        ip = self.ip_entry.get()
        name = self.name_entry.get()
        if ip:
            self.whitelist.add(ip)
            self.ip_data[ip] = {"name": name, "list": "whitelist"}
            self.save_data()
            self.display_history()
    
    def search_ip(self):
        ip = self.search_entry.get()
        if ip in self.ip_data:
            info = self.ip_data[ip]
            messagebox.showinfo("搜索结果", f"IP: {ip}\n设备名称: {info['name']}\n列表: {info['list']}")
        else:
            messagebox.showinfo("搜索结果", "未找到该IP的信息")
    
    def load_history(self):
        file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
        if file_path:
            with open(file_path, "r") as file:
                for line in file:
                    ip = line.strip()
                    if ip:
                        self.blacklist.add(ip)
                        self.ip_data[ip] = {"name": "", "list": "blacklist"}
            self.save_data()
            self.display_history()
    
    def display_history(self):
        self.history_text.delete(1.0, tk.END)
        self.history_text.insert(tk.END, "黑名单:\n")
        for ip in self.blacklist:
            self.history_text.insert(tk.END, f"{ip}\n")
        self.history_text.insert(tk.END, "\n白名单:\n")
        for ip in self.whitelist:
            self.history_text.insert(tk.END, f"{ip}\n")

if __name__ == "__main__":
    root = tk.Tk()
    app = IPFilterApp(root)
    root.mainloop()

主要改动点:

  1. 简化数据结构:使用字典 self.ip_data 存储IP信息,减少冗余。
  2. 简化UI创建:使用 tk.Labeltk.Entry 直接创建UI组件,减少代码重复。
  3. 添加搜索功能:通过 search_ip 方法实现IP搜索功能。
  4. 添加历史导入功能:通过 load_history 方法实现从txt文件导入历史封禁IP地址的功能。
  5. 优化数据保存和加载:使用JSON文件保存和加载IP数据。

这样,代码更加简洁,功能也更加完善。