first commit

+ add OtpViewer.py
+ add requirements.txt
+ updated Readme
This commit is contained in:
Vincent Hanewinkel 2025-11-12 15:08:20 +01:00
parent 3711d88883
commit 88110c68f0
3 changed files with 108 additions and 0 deletions

105
OtpViewer.py Normal file
View File

@ -0,0 +1,105 @@
import pyotp, time
import tkinter as tk
from tkinter import simpledialog, messagebox
from dotenv import load_dotenv
import os
load_dotenv()
email = os.getenv("ACCOUND")
seed = os.getenv("OTP_SEED")
def set_env_value(key, value, path=".env"):
lines = []
found = False
try:
with open(path, "r") as f:
for line in f:
if line.startswith(f"{key}="):
lines.append(f"{key}={value}\n")
found = True
else:
lines.append(line)
except FileNotFoundError:
pass # Falls Datei noch nicht existiert
if not found:
lines.append(f"{key}={value}\n")
with open(path, "w") as f:
f.writelines(lines)
otp = pyotp.TOTP(seed)
INTERVAL = otp.interval # Standard = 30s
def seconds_left():
# Differenz bis zum nächsten 30-Sekunden-Zyklus
return INTERVAL - int(time.time()) % INTERVAL
root = tk.Tk()
root.title("OTP-Code")
label_email = tk.Label(
root,
text=f"Account: {email}",
font=("Arial", 20, "bold"),
fg='Black', # Textfarbe
)
label_email.pack(padx=20, pady=20)
label = tk.Label(
root,
text=f"Lade ...",
font=("Arial", 20, "bold"),
fg='Black', # Textfarbe
)
label.pack(padx=20, pady=20)
def update():
remaining = seconds_left()
global seed
if seed == 'Standard':
label.config(text=f"Gibt deinen Otp Seed ein",fg='black',)
root.after(250, update)
else:
if remaining > 10:
color = 'green'
elif remaining > 5:
color = "#e9ab00"
else:
color = 'red'
label.config(text=f"Code: {otp.now()} - Läuft ab in: {remaining:02d}s",fg=color,)
root.after(250, update)
def set_seed():
global email, seed, otp
new_account = simpledialog.askstring("Accountname eingeben", "Gib deinen Accountnamen ein:")
new_seed = simpledialog.askstring("Seed eingeben", "Gib den neuen OTP-Seed ein:")
if new_seed and new_account:
try:
otp = pyotp.TOTP(new_seed)
seed = new_seed
set_env_value("OTP_SEED", new_seed)
set_env_value("ACCOUND", new_account)
email = new_account
label_email.config(text=f"Account: {email}")
messagebox.showinfo("Erfolg", "Seed wurde erfolgreich geändert!")
except Exception as e:
messagebox.showerror("Fehler", f"Ungültiger Seed:\n{e}")
menubar = tk.Menu(root)
root.config(menu=menubar)
otp_menu = tk.Menu(menubar, tearoff=0)
otp_menu.add_command(label="Seed ändern", command=set_seed)
otp_menu.add_separator()
otp_menu.add_command(label="Beenden", command=root.destroy)
menubar.add_cascade(label="Optionen", menu=otp_menu)
update()
root.mainloop()

View File

@ -1,2 +1,3 @@
# OTP-Viewer
Software die für ein OPT-Token die Code Generiert

2
requirments.txt Normal file
View File

@ -0,0 +1,2 @@
pyotp
python-dotenv