iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
Software Development

軟體開發養成計畫:以小程式實作深化開發能力系列 第 25

[ Day25 ] 小小短碼,大大學習:用 Python 打造屬於自己的短網址工具

  • 分享至 

  • xImage
  •  

開場

我之所以選擇這個主題,是因為在日常做報告或工作時,常常需要擷取與分享網址。然而市面上雖然有許多線上平台能將長網址轉換成短網址,但往往充斥著廣告,甚至還存在資安上的疑慮。也因此,我萌生了自己動手開發小程式的想法,把它放在電腦上就能像 APP 一樣使用,不僅安全,也大幅提升效率。
接下來,就讓我們一起來看看如何打造專屬的** URL 短網址工具**吧!

1.需求分析

我希望的小程式功能:

設計重點:

  • 如何把長網址轉換成短碼?
  • 短碼如何避免重複?
  • 是否需要資料庫 / 檔案儲存?

2.URL 短網址工具程式碼

接下來是程式碼重點解說時間,一共會分六個項目解釋:

(1)匯入模組與設定檔案

我們會用到 tkinter(GUI)、webbrowser(開啟網址)、json(儲存資料),並且設定好 JSON 檔案,讓程式可以下次開啟時自動載入。

import tkinter as tk
from tkinter import messagebox, simpledialog
import webbrowser
import json
import os

DATA_FILE = "short_urls.json"
  • **tkinter **:GUI 建立主力。
  • webbrowser :開啟網址。
  • **json + os **:儲存/讀取短網址資料。

(2)資料儲存與載入

短網址與原始網址的對應關係存到 url_map,並且用 JSON 檔保存。

def load_data():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    return {}

def save_data():
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(url_map, f, ensure_ascii=False, indent=4)

url_map = load_data()
  • load_data():程式啟動時,先讀 JSON 檔,把之前的短網址記錄載入。
  • save_data():每次新增、刪除都會自動更新 JSON 檔。
  • url_map:主要用來存放 {短碼: {"url": 原始網址, "count": 點擊次數}}。

(3)新增短網址功能

可以輸入網址並自動產生短碼,儲存後更新到 Listbox。

def add_url():
    url = entry_url.get().strip()
    if not url:
        messagebox.showwarning("警告", "請輸入網址!")
        return

    short_code = f"url{len(url_map)+1}"
    url_map[short_code] = {"url": url, "count": 0}
    listbox.insert(tk.END, f"{short_code} -> {url}")
    save_data()
    entry_url.delete(0, tk.END)
  • 使用者輸入網址後,自動產生短碼(例如 url1, url2)。
  • 儲存在 url_map,同時寫入 JSON 檔。
  • Listbox 會即時更新顯示。

(4)開啟短網址功能(計算點擊次數)

從 Listbox 選取短碼,打開對應網址,並且點擊次數 +1。

def open_url():
    selection = listbox.curselection()
    if not selection:
        messagebox.showwarning("警告", "請選擇一個短網址!")
        return

    short_code = listbox.get(selection[0]).split(" -> ")[0]
    url_map[short_code]["count"] += 1
    save_data()
    webbrowser.open(url_map[short_code]["url"])
  • 從 Listbox 選到的短碼,找到對應原網址。
  • 點擊次數會累加並保存。
  • 用 webbrowser.open() 開啟網址。

(5)刪除短網址功能

選中 Listbox 的項目後,可以刪掉該短碼紀錄。

def delete_url():
    selection = listbox.curselection()
    if not selection:
        messagebox.showwarning("警告", "請選擇要刪除的短網址!")
        return

    short_code = listbox.get(selection[0]).split(" -> ")[0]
    del url_map[short_code]
    listbox.delete(selection[0])
    save_data()

會同步刪掉 url_map 內的紀錄,Listbox 也會清除該行。

(6)GUI 介面設計

背景顏色 + 底部按鈕排版,讓整體比較像一個小 app。

root = tk.Tk()
root.title("短網址產生器")
root.geometry("500x500")
root.configure(bg="#f0f4f7")  

# 輸入框
entry_url = tk.Entry(root, width=40)
entry_url.pack(pady=10)

# Listbox
listbox = tk.Listbox(root, width=50, height=15)
listbox.pack(pady=10)

# 底部按鈕
frame_buttons = tk.Frame(root, bg="#f0f4f7")
frame_buttons.pack(side=tk.BOTTOM, pady=15)

btn_add = tk.Button(frame_buttons, text="新增", command=add_url, width=10, bg="#4CAF50", fg="white")
btn_add.grid(row=0, column=0, padx=5)

btn_open = tk.Button(frame_buttons, text="開啟", command=open_url, width=10, bg="#2196F3", fg="white")
btn_open.grid(row=0, column=1, padx=5)

btn_delete = tk.Button(frame_buttons, text="刪除", command=delete_url, width=10, bg="#f44336", fg="white")
btn_delete.grid(row=0, column=2, padx=5)

root.mainloop()
  • root.configure(bg="#f0f4f7"):設定背景色。
  • frame_buttons.pack(side=tk.BOTTOM):把按鈕放在最底部。
  • 各按鈕用不同顏色,提升可讀性與美觀度。

3.URL 短網址工具成果展示

(1)生成短連結

輸入長連結,並點選生成短連結即可生成。
https://ithelp.ithome.com.tw/upload/images/20251001/20178527gHrdTcOHcJ.jpg

(2)開啟短連結確認頁面

選擇我們剛剛生成的短連結,按下打開短網址鍵即開啟網頁介面。
https://ithelp.ithome.com.tw/upload/images/20251001/20178527Dyg6lr1ReR.jpg
開啟的網路介面樣式:
https://ithelp.ithome.com.tw/upload/images/20251001/20178527yU9R35VXnU.jpg

(3)刪除短網址

選擇想要在歷史紀錄中刪除的短網址,並點下刪除短網址即可刪除。
https://ithelp.ithome.com.tw/upload/images/20251001/20178527Qamc6c7XyD.jpg

(4)搜尋短網址

若想要搜尋曾經生成過的短網址,直接在搜尋列打下名稱便可以透過歷史紀錄中找到。
https://ithelp.ithome.com.tw/upload/images/20251001/20178527ZlTLA9gsgv.jpg

4.心得

這次動手做了一個 URL 短網址小工具,過程中讓我覺得很有趣也很實用。一開始的構想只是單純能把長網址轉換成短碼,但在實作完成後,發現若只停留在最基本的功能,使用上會有些不足。於是,我又加上了「歷史紀錄欄位」和「刪除鍵」,讓使用者可以管理和清理短網址,整體操作上更接近一個小型應用程式。
原本我還想挑戰加入「自訂短碼」的功能,讓使用者能輸入自己喜歡的名稱,例如 chatgpt123,不過在測試的過程中,才發現這樣的功能其實需要搭配像 Flask 或 FastAPI 去架設一個本地 Web 伺服器,才能讓瀏覽器直接透過 "http://localhost:5000/xxx" 來存取。由於目前查到的一些完整解決方案需要額外的伺服器環境或費用,所以暫時就先擱置這個進階功能。
總結這次的實作不僅讓我更熟悉了 tkinter 的 GUI 設計,也學到了如何利用 JSON 儲存資料,讓程式下次開啟時仍能保留使用紀錄。雖然還有一些功能沒有完成,但這樣一步步嘗試與改進的過程,讓我更有動力繼續把它發展得更完整,期待下一次,能帶來更加完整、實用的版本!


上一篇
[Day24]程式開發必備技能:Git & GitHub 的基礎應用
系列文
軟體開發養成計畫:以小程式實作深化開發能力25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言