2022-07-13|閱讀時間 ‧ 約 8 分鐘

不間斷 Python 挑戰 Day 35 - 密碼產生器 - 搜尋功能

上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。

以JSON格式儲存密碼

在 save_password() 函數中,當輸入欄位確認就緒後,開始進入儲存密碼的核心程式,主要差異點如下:
  1. 新增的帳密資料以字典取代串列做為儲存的變數。
password_data_list = []
password_data_list.append([name, url, username, password])
修改成
new_password_data = {
  name: {
    "url": url,
    "username": username,
    "password": password
  }
}
2. 以 JSON 格式取代 CSV 格式將帳密資料存入檔案。
with open("password_data.csv", mode="a", newline="") as password_file:
  password_data = writer(password_file)
  password_data.writerows(password_data_list)
修改成
with open("password_manager.json", "r") as password_file:
  password_data = json.load(password_file)

password_data.update(new_password_data)
with open("password_manager.json", "w") as password_file:
  json.dump(password_data, password_file, indent=4)
將帳密資料存入 password_manager.json 檔案,其中 update() 方法將新增的字典鍵值對更新到從 JSON 檔案讀出的字典。
3. 當 password_manager.json 檔案不存在時,例如第一次儲存帳密資料,我們以在異常處理一節中討論過的「try - except - else - finally」框架,對程式做進一步強化。因此,上述 1、2 部分的程式會再改寫如下:
new_password_data = {
  name: {
    "url": url,
    "username": username,
    "password": password
  }
}

try:
  with open("password_manager.json", "r") as password_file:
    password_data = json.load(password_file)
except FileNotFoundError:
  with open("password_manager.json", "w") as password_file:
    json.dump(new_password_data, password_file, indent=4)
else:
  password_data.update(new_password_data)
  with open("password_manager.json", "w") as password_file:
    json.dump(password_data, password_file, indent=4)
finally:
  name_entry.delete(0, END)
  url_entry.delete(0, END)
  username_entry.delete(0, END)
  password_entry.delete(0, END)
到目前為止,執行程式的過程及介面和之前完全相同,惟在點選「儲存密碼」後生成 JSON 檔案,將帳密資料以 JSON 物件的格式儲存。
執行密碼產生器
執行密碼產生器
產生password_manager.json檔案

搜尋密碼

基於以上改寫,這裡便可以利用 JSON 資料的格式來對已儲存的密碼進行搜尋。首先,先在圖形介面上新增一個「搜尋」按鈕,當此按鈕被點選後,觸發一段程式執行搜尋密碼的功能。
search_password_button = Button(text="搜尋", width=12, command=search_password)
search_password_button.grid(row=0, column=6, columnspan=2, sticky=E)
在此,我們將搜尋密碼的功能包裝為 search_password() 方法,此時介面如下:
加入「搜尋」按鈕
當 search_password() 方法被觸發後,先抓取「名稱」欄位內由使用者所輸入的字串,確認字串存在後,同樣套用「try - except - else - finally」框架,嘗試開啟 password_manager.json 檔案,若該檔案不存在即跳出警告,並結束函式流程;若成功開啟,則檢查載入資料的鍵 (key) 是否含有該名稱,並將搜尋結果顯示在對話方塊。
def search_password():
  name = name_entry.get()
  if len(name) == 0:
    messagebox.showwarning(title="警告", message="請確認名稱是否為空白!")
  else:
    try:
      with open("password_manager.json", "r") as password_file:
        password_data = json.load(password_file)
    except FileNotFoundError:
      messagebox.showwarning(title="警告", message="檔案不存在!")
    else:
      if name in password_data.keys():
        url = password_data[name]["url"]
        username = password_data[name]["username"]
        password = password_data[name]["password"]
        messagebox.showinfo(title="搜尋結果", message=f"名稱:{name}\n網址:{url}\n帳號:{username}\n密碼:{password}")
      else:
        messagebox.showinfo(title="搜尋結果", message=f"此名稱資料不存在!")
執行後,由於在前一節中我們已儲存一組名稱為「Google」的帳密資料,執行搜尋後可將剛剛所儲存的內容顯示出來;若搜尋不存在的名稱,例如下方所測試的「Apple」,則跳出警告視窗。
搜尋名稱存在
搜尋名稱不存在

總結

在這篇文章中,我們在密碼產生器原有產生隨機密碼與儲存帳密的功能外,利用 JSON 資料具有字典格式的結構,實作出可自動搜尋帳密的功能,並引入異常處理的流程,讓整體功能更加完備,也有較高的容錯率。

程式範例

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.