Post
Topic
Board Nigeria (Naija)
Merits 5 from 2 users

Re: Info-thread: Translation of Useful English topics to Pidgin {mix images}
by
Abdulzuruku01
on 24/04/2025, 14:25:41 UTC
⭐ Merited by Abu-Naim (3) ,Halab (2)

Translated Topic in Pidgin Language; SeedClicker - Dey Write di seed phrases witout keyboard [Script Python]
Original Topic: SeedClicker - Writing seed phrases without keyboard [Script Python]
Author: joker_josue



SeedClicker - dey write di seed phrases witout keyboard

I dey do some tests, and I keep dey tink about di fact wey wallet recovery dey requires enter of di seed phrase, whc usually dey need do am manually fo di keyboard, whc fit lead to plenty risks:
  • Keyloggers fit capture keystrokes and hack yur wallet.
  • Screenloggers fit record di screen as u dey type di seed.
  • Human mistake, whr pesin fit dey type di wrong word.
  • fo addition to time and practicality.

Wit dat fo mind, I choose to build my own first Python script, whc I name am Seed Clicker. I build am to remove dis risks to allow people to select dere seed wit jus clicks, witout get to type any letters fo di keyboard.

Dis script aims na to improve di security and privacy of seed recovery fo plenty ways:
  • get di list of all BIP39 words fo proper way, filter wit di first and second letter.
  • Allows you to select di seed by clicking, witout get to type anytin fo di keyboard.
  • mix up di order of di words to take less di predictable patterns.
  • di button to hide di seed, to take protect from screenloggers.
  • Automatically write to di wallet, after type di phrase, di script dey add di seed to di wallet automatically.
  • e dey remove data after use, wit no words bein save.

I see dis script useful as e fit help to protect against keyloggers since no keys dey typed manually. Since di seed no dey show during dis process, e go protects against screenloggers. E dey practical and fast, less dan 1 minute to choose all di seeds, wit di help of filter wey dey to allow you to find words easily. Zero log storage, no files or caches dey save. Furthermore, e dey open source, wit total transparency, witout backdoors or hide functions.


Script Seed Clicker
Code:
import tkinter as tk
import pyautogui
import time
import string
import random

# Load words from file
def load_words():
    words_dict = {letter: {} for letter in string.ascii_lowercase}  # Create groups A-Z
    try:
        with open("words.txt", "r", encoding="utf-8") as f:
            for word in f:
                word = word.strip().lower()
                if word and word[0] in words_dict:
                    second_letter = word[1] if len(word) > 1 else "#"
                    if second_letter not in words_dict[word[0]]:
                        words_dict[word[0]][second_letter] = []
                    words_dict[word[0]][second_letter].append(word)
    except FileNotFoundError:
        print("Error: The file words.txt was not found.")
        exit()
    return words_dict

# Update buttons organized in 10 columns
def update_buttons(letter, second_letter=None):
    for widget in frame_buttons.winfo_children():
        widget.destroy()

    words = []
    if letter in words_dict:
        if second_letter:
            words = sorted(words_dict[letter].get(second_letter, []), key=lambda x: random.random())
        else:
            words = sorted([word for sublist in words_dict[letter].values() for word in sublist], key=lambda x: random.random())
   
    num_columns = 10
    num_rows = (len(words) // num_columns) + (1 if len(words) % num_columns != 0 else 0)

    canvas = tk.Canvas(frame_buttons)
    scrollbar = tk.Scrollbar(frame_buttons, orient="vertical", command=canvas.yview)
    scroll_frame = tk.Frame(canvas)

    scroll_frame.bind(
        "<Configure>",
        lambda e: canvas.configure(
            scrollregion=canvas.bbox("all")
        )
    )

    canvas.create_window((0, 0), window=scroll_frame, anchor="nw")
    canvas.configure(yscrollcommand=scrollbar.set)

    for row in range(num_rows):
        row_frame = tk.Frame(scroll_frame)
        row_frame.pack()
        for col in range(num_columns):
            index = row + (col * num_rows)
            if index < len(words):
                tk.Button(row_frame, text=words[index], width=8, height=1, padx=2, pady=2,
                          command=lambda p=words[index]: select_word(p)).pack(side="left", padx=2, pady=2)

    canvas.pack(side="left", fill="both", expand=True)
    scrollbar.pack(side="right", fill="y")

# Select word and update display
def select_word(word):
    selected_words.append(word)
    update_seed_display()
    update_counter()

# Remove last word and update counter
def delete_last():
    if selected_words:
        selected_words.pop()
        update_seed_display()
        update_counter()

# Update selected words counter
def update_counter():
    label_counter.config(text=f"Selected Words: {len(selected_words)}")

# Toggle seed visibility
def toggle_visibility():
    global show_seed
    show_seed = not show_seed
    update_seed_display()
    button_toggle.config(text="Hide Seed" if show_seed else "Show Seed")

# Update seed display
def update_seed_display():
    seed_text = " ".join(selected_words) if show_seed else " ".join(["*" * len(w) for w in selected_words])
    label_seed.config(text=seed_text)

# Auto-fill in wallet
def fill_wallet():
    if not selected_words:
        return 
    time.sleep(3) 
    pyautogui.typewrite(" ".join(selected_words), interval=0.1) 
    clear_all()

# Clear all words
def clear_all():
    global selected_words
    selected_words.clear()
    update_seed_display()
    update_counter()

# Create main window
root = tk.Tk()
root.title("Seed Clicker")
root.geometry("800x600")

# Load words and initialize variables
words_dict = load_words()
selected_words = []
show_seed = False

# Create seed display area
label_seed = tk.Label(root, text="", font=("Arial", 12), fg="blue", wraplength=600)
label_seed.pack(pady=10)

# Selected words counter
label_counter = tk.Label(root, text="Selected Words: 0", font=("Arial", 12))
label_counter.pack()

# Button to toggle seed visibility
button_toggle = tk.Button(root, text="Show Seed", command=toggle_visibility)
button_toggle.pack()

# Create letter buttons A-Z
frame_letters = tk.Frame(root)
frame_letters.pack()

for letter in string.ascii_lowercase:
    if words_dict[letter]:
        tk.Button(frame_letters, text=letter.upper(), width=2, command=lambda l=letter: [update_buttons(l), update_second_filter(l)]).pack(side="left", padx=2, pady=2)

# Create second filtering
frame_second_letter = tk.Frame(root)
frame_second_letter.pack()

def update_second_filter(letter):
    for widget in frame_second_letter.winfo_children():
        widget.destroy()
   
    if letter in words_dict:
        second_letters = sorted(words_dict[letter].keys())
        for second in second_letters:
            tk.Button(frame_second_letter, text=second, width=2, command=lambda s=second: update_buttons(letter, s)).pack(side="left", padx=2, pady=2)

# Create word selection area (initially empty)
frame_buttons = tk.Frame(root)
frame_buttons.pack(pady=10, fill="both", expand=True)

# Action buttons
tk.Button(root, text="⏪ Delete Last", command=delete_last).pack()
tk.Button(root, text="🛡️ Fill Wallet", command=fill_wallet).pack()
tk.Button(root, text="❌ Close", command=root.quit).pack()

root.mainloop()


How e take dey work?
1. Place am fo di same folder fo di script, a file "words.txt" wit all di words frm BIP39 or others wey you want.
2. Run di script fo Python.
3. Di user dey selects di first letter of di word: di dey only shows words wey start wit dat letter. You fit apply di second filter fo di second letter to make di search easy.
4. Words dey mix up fo di 10-column layout. Anytime wey you click di word, all di words dey shuffle again.
5. Di user selects di words by clicking dem. Dey show fo di field fo up, represent only by "****".
6.di number of select words dey display.
7. Di "Fill in Wallet" button automatically dey enters di seed to di wallet recover field.
8. After execution, di seed dey delete from memory to avoid any trace.



As I talk am, na my first Python script be dis. I believe e go fit be better, I go dey wait fo una idea and opinion.