Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- from bs4 import BeautifulSoup
- import re
- import urllib.parse
- import tkinter as tk
- from tkinter import filedialog, messagebox
- from pathlib import Path
- def get_desktop_path():
- """Return user's Desktop path, including OneDrive versions."""
- possible_paths = [
- Path.home() / "Desktop",
- Path.home() / "OneDrive" / "Desktop",
- Path.home() / "OneDrive - Microsoft" / "Desktop",
- ]
- for p in possible_paths:
- if p.exists():
- return p
- return Path.home() # fallback if none exist
- def run_search():
- base_path = base_path_entry.get().strip()
- keyword = keyword_entry.get().strip()
- folder_filter = folder_filter_entry.get().strip().lower()
- if not base_path or not keyword or not folder_filter:
- messagebox.showwarning("Input Error", "Please fill in all fields.")
- return
- # ✅ Get correct desktop path (OneDrive or local)
- desktop_path = get_desktop_path()
- output_file = desktop_path / f"{keyword}.html"
- print(f"🖥️ Output file will be saved to: {output_file}")
- found_any = False
- # ✅ Read toggle button states
- whole_word = whole_word_var.get()
- case_sensitive = case_sensitive_var.get()
- with open(output_file, "w", encoding="utf-8") as out:
- for root, dirs, files in os.walk(base_path):
- for dir_name in dirs:
- if folder_filter in dir_name.lower(): # user-specified folder (e.g., inbox/sent)
- folder_path = os.path.join(root, dir_name)
- print(f"📁 Searching in: {folder_path}")
- for filename in os.listdir(folder_path):
- if filename.endswith((".html", ".htm", ".txt")):
- file_path = os.path.join(folder_path, filename)
- try:
- with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
- if filename.lower().endswith((".html", ".htm")):
- soup = BeautifulSoup(f, "html.parser")
- text = soup.get_text(separator=" ")
- else:
- text = f.read()
- # ✅ Adjust regex pattern
- if whole_word:
- pattern = rf".{{0,40}}\b{re.escape(keyword)}\b.{{0,40}}"
- else:
- pattern = rf".{{0,40}}{re.escape(keyword)}.{{0,40}}"
- # ✅ Adjust case sensitivity
- flags = 0 if case_sensitive else re.IGNORECASE
- matches = re.findall(pattern, text, flags=flags)
- if matches:
- found_any = True
- encoded_path = urllib.parse.quote(file_path.replace(os.sep, '/'))
- file_link = f"file:///{encoded_path}"
- out.write(f'<p>🔎 Found in: <a href="{file_link}">{filename}</a></p>\n')
- for m in matches:
- out.write(" ..." + m.strip() + "...\n")
- except Exception as e:
- print(f"⚠️ Error reading {file_path}: {e}")
- if found_any:
- messagebox.showinfo("✅ Done", f"Results saved to your Desktop:\n{output_file}")
- print(f"✅ Results saved to {output_file}")
- else:
- os.remove(output_file)
- messagebox.showinfo("🗑️ No Matches", "No matches found. Output file deleted.")
- print(f"🗑️ No matches found — deleted {output_file}")
- def browse_folder():
- folder_selected = filedialog.askdirectory()
- if folder_selected:
- base_path_entry.delete(0, tk.END)
- base_path_entry.insert(0, folder_selected)
- # ---- Tkinter UI ----
- root = tk.Tk()
- root.title("Email Keyword Search")
- # Base path
- tk.Label(root, text="Base Path:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
- base_path_entry = tk.Entry(root, width=60)
- base_path_entry.grid(row=0, column=1, padx=5, pady=5)
- browse_button = tk.Button(root, text="Browse", command=browse_folder)
- browse_button.grid(row=0, column=2, padx=5, pady=5)
- # Keyword
- tk.Label(root, text="Keyword:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
- keyword_entry = tk.Entry(root, width=60)
- keyword_entry.grid(row=1, column=1, padx=5, pady=5)
- # Folder filter (e.g. inbox / sent)
- tk.Label(root, text="Folder Filter (e.g. inbox/sent):").grid(row=2, column=0, padx=5, pady=5, sticky="e")
- folder_filter_entry = tk.Entry(root, width=60)
- folder_filter_entry.insert(0, "inbox")
- folder_filter_entry.grid(row=2, column=1, padx=5, pady=5)
- # ✅ Options: Whole word & Case-sensitive
- whole_word_var = tk.BooleanVar(value=True)
- case_sensitive_var = tk.BooleanVar(value=False)
- whole_word_check = tk.Checkbutton(root, text="Whole Word Only", variable=whole_word_var)
- whole_word_check.grid(row=3, column=1, sticky="w", padx=5)
- case_sensitive_check = tk.Checkbutton(root, text="Case Sensitive", variable=case_sensitive_var)
- case_sensitive_check.grid(row=4, column=1, sticky="w", padx=5)
- # Run button
- run_button = tk.Button(root, text="Run Search", command=run_search, bg="lightblue")
- run_button.grid(row=5, column=1, pady=10)
- root.mainloop()
- ### https://ddosecrets.com/article/ehud-barak-emails
Advertisement
Add Comment
Please, Sign In to add comment