当前位置: 首页 > news >正文

DeepSeek开发IP地址查询小工具

一、开发GUI

以下是用 Python 和 Tkinter 实现的带图形界面:

import requests
import tkinter as tk
from tkinter import ttk, messagebox
import json

class IPLookupApp:
    def __init__(self, root):
        self.root = root
        root.title("IP 地址查询工具")
        root.geometry("500x450")
        
        # 创建界面元素
        self.create_widgets()
        
    def create_widgets(self):
        # 输入区域
        input_frame = ttk.Frame(self.root, padding=10)
        input_frame.pack(fill=tk.X)
        
        self.lbl_ip = ttk.Label(input_frame, text="目标 IP 地址:")
        self.lbl_ip.grid(row=0, column=0, padx=5)
        
        self.entry_ip = ttk.Entry(input_frame, width=25)
        self.entry_ip.grid(row=0, column=1, padx=5)
        
        self.btn_lookup = ttk.Button(input_frame, text="查询", command=self.do_lookup)
        self.btn_lookup.grid(row=0, column=2, padx=5)
        
        # 结果显示区域
        result_frame = ttk.LabelFrame(self.root, text="查询结果", padding=10)
        result_frame.pack(pady=10, fill=tk.BOTH, expand=True)
        
        columns = ("属性", "值")
        self.result_tree = ttk.Treeview(
            result_frame, 
            columns=columns,
            show="headings",
            height=10
        )
        
        self.result_tree.heading("属性", text="属性")
        self.result_tree.heading("值", text="值")
        self.result_tree.column("属性", width=120, anchor=tk.W)
        self.result_tree.column("值", width=300, anchor=tk.W)
        
        vsb = ttk.Scrollbar(result_frame, orient="vertical", command=self.result_tree.yview)
        self.result_tree.configure(yscrollcommand=vsb.set)
        
        self.result_tree.grid(row=0, column=0, sticky=tk.NSEW)
        vsb.grid(row=0, column=1, sticky=tk.NS)
        
        result_frame.grid_rowconfigure(0, weight=1)
        result_frame.grid_columnconfigure(0, weight=1)
        
    def do_lookup(self):
        """执行查询操作"""
        ip = self.entry_ip.get().strip() or None
        self.result_tree.delete(*self.result_tree.get_children())
        
        try:
            data = get_ip_info(ip)
            if data and data.get("status") == "success":
                self.show_results(data)
            else:
                messagebox.showerror("错误", data.get("message", "查询失败"))
        except Exception as e:
            messagebox.showerror("异常", f"发生错误: {str(e)}")
    
    def show_results(self, data):
        """在 Treeview 中展示结果"""
        results = [
            ("IP 地址", data.get("query")),
            ("地理位置", f"{data.get('continent', 'N/A')} - {data.get('country', 'N/A')}"),
            ("地区", f"{data.get('regionName', 'N/A')} {data.get('city', 'N/A')}"),
            ("经纬度", f"[{data.get('lat', 'N/A')}, {data.get('lon', 'N/A')}]"),
            ("时区", data.get("timezone", "N/A")),
            ("ISP", data.get("isp", "N/A")),
            ("AS 编号", data.get("as", "N/A")),
            ("移动网络", str(data.get("mobile", False))),
            ("VPN/代理", str(data.get("proxy", False))),
            ("托管服务", str(data.get("hosting", False))),
        ]
        
        for item in results:
            self.result_tree.insert("", tk.END, values=item)

def get_ip_info(ip_address=None):
    """查询 IP 地址信息(复用原有函数)"""
    url = f'http://ip-api.com/json/{ip_address or ""}'
    params = {'fields': 'status,message,continent,country,regionName,city,lat,lon,timezone,isp,as,mobile,proxy,hosting,query'}
    
    try:
        response = requests.get(url, params=params, headers={'User-Agent': 'python-requests/2.25.1'})
        return response.json()
    except Exception as e:
        raise RuntimeError(f"API 请求失败: {str(e)}")

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

主要内容:
在这里插入图片描述


二、将 Python 程序打包成 EXE 相关资源

在这里插入图片描述


步骤 1:安装打包工具

pip install pyinstaller

步骤 2:创建打包配置文件(可选)

在代码目录新建 build.spec 文件:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['ip_lookup_gui.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='IPLookupTool',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # 不显示控制台窗口
    icon='icon.ico',  # 可选图标文件
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

步骤 3:执行打包命令

pyinstaller --noconsole --onefile ip_lookup_gui.py

或使用配置文件:

pyinstaller build.spec

打包优化技巧

  1. 添加程序图标

    • 准备 icon.ico 图标文件
    • 在命令后追加:--icon=icon.ico
  2. 减小体积

    pyinstaller --noconsole --onefile --clean --upx-dir=/path/to/upx ip_lookup_gui.py
    
  3. 排除无用组件

    --exclude-module matplotlib --exclude-module numpy
    
  4. 最终命令

    pyinstaller --noconsole --onefile --clean --icon=icon.ico --exclude-module matplotlib --exclude-module numpy --upx-dir=./upx ip_lookup_gui.py
    

生成文件说明

dist/
   └── IPLookupTool.exe  # 最终生成的独立可执行文件

使用注意事项

  1. 文件大小

    • 原始大小约 8-15MB(使用 UPX 压缩后)
    • 未压缩版本约 20-30MB
  2. 安全软件警报

    • 首次运行可能触发杀毒软件警告(误报),需手动允许
  3. 网络权限

    • 确保程序有权限访问网络(Windows 防火墙设置)

最终效果

用户将获得一个双击即可运行的 IPLookupTool.exe 文件:

[ 简洁的 GUI 界面 ]
   ↳ 输入框自动支持 IP 格式检测
   ↳ 查询结果表格支持右键复制
   ↳ 网络异常时弹出友好提示

常见问题解决

问题 1:打包时报错 ModuleNotFoundError

  • 解决方案:通过 --hidden-import=模块名 手动添加缺失模块

问题 2:生成的 EXE 闪退

  • 调试方法:
    pyinstaller --debug all ip_lookup_gui.py
    

问题 3:需要兼容旧系统

  • 添加参数:--target-arch=win32

通过这种方式打包的工具可以零依赖运行于 Windows 7/8/10/11 系统,适合非技术用户使用。如果要分发程序,建议使用 Inno Setup 或 NSIS 制作安装包。

相关文章:

  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file
  • springboot2.7.18升级springboot3.3.0遇到的坑
  • 生鲜行业智能化供应链解决方案技术白皮书
  • pyside6学习专栏(八):在PySide6中使用matplotlib库绘制三维图形
  • JAVA入门——IO流
  • idea中或pycharm中编写Markdown文件
  • 小结:计算机网路中的性能指标小结
  • Windows提权之第三方提权(九)
  • I/O多路转接之select:定义、原理及应用场景
  • solidwork智能尺寸怎么对称尺寸
  • 【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架
  • odoo初始化数据库
  • Ubuntu20.04确认cuda和cudnn已经安装成功
  • #渗透测试#批量漏洞挖掘#(0day)某智能终端操作平台前台存在通用SQL注入漏洞(CVE-2022-21047)
  • 3.对象生活的地方—Java环境搭建
  • Spring-全面详解(学习总结)
  • 【AD】3-5 元件在原理图中的基本操作2
  • 从零开始开发纯血鸿蒙应用之语音朗读
  • Gopeed 各种类型的文件资源下载器 v1.6.7 中文版
  • CentOS与Ubuntu操作系统的基本对比介绍
  • 做网站编辑需要看什么书/手机软文广告300字
  • 网站为什么做微云的采集/seo优化师就业前景
  • 网站怎么在百度搜到/注册网站免费注册
  • 郑州品牌网站建设/做营销策划的公司
  • 厦门网站做的比较好/舆情视频
  • 济南自助建站模板/微博推广