对于初学者 - 通过构建 Python 键盘记录器来分析您自己的日常活动👽

2025-06-07

对于初学者 - 通过构建 Python 键盘记录器来分析您自己的日常活动👽

不久前,我很好奇,想了解更多关于我自己的网络活动。我尝试安装浏览器搜索历史记录,并对其进行了一些分析,但考虑到分析如此大数据的难度,结果并不理想。我想尽量简化。于是我想,为什么不先记录我输入的每一个单词,看看能从中得出什么结论呢?

因此,在本教程中,我将向您展示如何在 Python 中构建一个键盘记录器,它将允许我们将输入的单词存储在.txt文件中,然后我们可以了解如何分析/表示这些数据(这应该很有趣😉)。

先说正事🎆。虽然我的活跃度还不算太高,但 Dev 上的粉丝已经接近 1000 人了。所以,我想感谢所有关注我的人(很高兴你们喜欢我的文章),并承诺以后会更加积极地参与😄。

太好了,我们开始吧。

简单的 Python - 保存并写入按下的键🦄

这不会很复杂。我们只需要两个函数:

  • 将按下的每个键存储在数组中。
  • 将数组中存储的键写入.txt文件中。

让我们定义调用它的第一个函数on_press

keys = []
def on_press(e):
    global keys  #access the array keys
    keys.append(e)  #add the key e to the array
Enter fullscreen mode Exit fullscreen mode

此函数接受一个参数,即按下的键(我们稍后会传递它),然后访问全局按键数组,并将按下的键添加到该数组中。但目前为止,由于我们尚未调用此函数,因此它尚未运行。因此,我们需要在每次按下键时调用此函数。为此,我们需要从pynput库中导入几个模块。
在文件的最顶部.py,添加以下代码:

from pynput.keyboard import Key, Listener
Enter fullscreen mode Exit fullscreen mode

要确保已安装 pynput,请运行以下命令pip install pynput

在文件的最底部,让我们使用导入的 Listener 库,on_press在每次按下键时调用我们刚刚定义的函数()。

with Listener(on_press = on_press) as listener:
    listener.join()
Enter fullscreen mode Exit fullscreen mode

太好了。现在我们的代码如下所示:

from pynput.keyboard import Key, Listener

keys = []
def on_press(e):
    global keys  #access the array keys
    keys.append(e)  #add the key e to the array

with Listener(on_press = on_press) as listener:
    listener.join()    
Enter fullscreen mode Exit fullscreen mode

运行它,我们什么也看不到,但代码会把日志记录到keys数组中。
下一步是获取这些键并将其输出到.txt文件中。
让我们定义第二个函数(that takes the keys stored in the array and write them in a.txt file.)。

def write_file(keys):
    with open("log.txt", "a+") as f: #the a+ tells python to create log.txt if it does not exist
        for key in keys:
            k = str(key).replace("'", "")
            if k.find("space") > 0:
                    f.write('  ')
            elif k.find("Key") == -1:
                    f.write(k)
Enter fullscreen mode Exit fullscreen mode

太棒了。现在这个函数打开log.txt文件,传入我们已有的数组,然后将键写入文件(as f)。但是,这里有几个条件。首先,我们移除任意'键;然后,如果按下的键是"space",我们不想写入空格,因此我们将" "在字符串中输入一个实际的空格。否则,我们就直接输入键。

太好了🔥 现在我们已经准备好了函数,但是什么时候调用它呢?
如您所见,该.txt文件有两个步骤。首先将键存储在数组中,其次从数组中获取键并将其输入到文件中。这意味着write_file,只有在将键存储在数组中之后,我们才必须调用该函数。但是,由于该write_file函数逐个遍历数组,因此我们不能在每次向数组中添加键时都调用它,因为它会一次又一次地输入它。因此,我们只在数组中有 10 个键时调用它,调用它之后,我们再次将该数组清空。

因此让我们编辑该on_press函数:

count = 0 # his keeps track of how many items there are in the array
keys = []

def on_press(e):
    global keys, count
    keys.append(e)
    count += 1
    if count >= 10:
        count = 0
        write_file(keys)
        keys = []  # make the array empty after we call the write_file function.
Enter fullscreen mode Exit fullscreen mode

看起来我们成功了!
最终代码如下:

from pynput.keyboard import Key, Listener

count = 0
keys = []

def on_press(e):
    global keys, count
    keys.append(e)
    count += 1
    if count >= 10:
        count = 0
        write_file(keys)
        keys = []

def write_file(keys):
    with open("log.txt", "a+") as f:
        for key in keys:
            k = str(key).replace("'", "")
            if k.find("space") > 0:
                    f.write('  ')
            elif k.find("Key") == -1:
                    f.write(k)

with Listener(on_press = on_press) as listener:
    listener.join()
Enter fullscreen mode Exit fullscreen mode

太棒了🦄
现在运行这段代码,试着在任何地方输入一些句子,它们会强制关闭代码。
你会看到一个新log.txt文件出现在代码所在的目录中。你会看到键值被整齐地格式化为一行单词。
下一步是阅读这些单词并尝试分析它们。

正如我之前所说,我想保持简单。所以我所做的就是计算:

  • 多少个字符
  • 多少行
  • 多少字
  • 每个单词重复了多少次。

为了保持简单易懂且方便初学者,我们将创建一个新的 Python 文件来完成读取/分析工作。因此,让我们readKeys.py在同一个目录中创建一个新文件,然后从那里开始操作。

打开readKeys.py并输入以下内容:

log_file = open("log.txt", "r+") #open file in reading mode (r)

chars = 0
lines = 0
letters = []

for i in log_file.read():
    if i == '\n':  # \n means Enter key which is a new line
        lines += 1
    chars += 1
    letters.append(i)
Enter fullscreen mode Exit fullscreen mode

我们编写的循环读取了log.txt从之前编写的代码中获得的整个文件,并计算了其中有多少个字符和行,然后将字母添加到数组中。(我们重新做了之前代码中所做的事情😄)。

现在我们要做的是创建一个包含单词但不包含字母的新数组。
方法是将joining数组中的所有字母合并成一个字符串。然后,每当我们看到 (时,我们split就将这个字符串转换为一个单词数组。是 Python 提供的实用方法。让我们看看它们有多么容易使用。)space
splitjoin

key_string = "".join(letters)
word_string = key_string.replace('\n', " ")
final_keywords_list = word_string.split()
Enter fullscreen mode Exit fullscreen mode

这可能看起来太复杂了,但实际上并非如此。这里的每一行都执行我们之前提到的步骤:

  • 将字母连接成一个字符串
  • 用适当的空格替换 Enter 空格
  • 将字符串拆分成单词数组

现在,这final_keywords_list是一个单词数组。
现在我们可以进行最后的分析了。让我们统计一下重复的单词!

首先,我们定义一个名为 counted 的空字典。然后,我们遍历单词数组。
对于每个单词,如果该单词存在于字典中,我们就增加它的计数。如果不存在,我们就添加它。

counted = {}

for letter in final_keywords_list:
    letr = str(letter)
    if letr in counted:
        counted[letr] += 1
    else:
        counted[letr] = 1
Enter fullscreen mode Exit fullscreen mode

太棒了!到目前为止,我们的代码已经达到了我们的预期。我们创建了一个字典,里面记录了每个输入的单词以及它被重复的次数。

让我们开始可视化吧!

既然我们已经统计了字数,为什么不做一些过滤和数据可视化呢?我们掌握数据的方式让我们可以做很多事情(当然,这段代码运行的时间越长,你捕获的字数就越多,你的分析就越准确)。

为了本教程的目的,我选择制作一个比较重复词汇的条形图。
为此,我们将使用一个名为的库matplotlib。它是数据科学领域最著名的库。那就开始吧。首先,请确保你安装了它。说明在这里

到目前为止,我们的代码如下所示:

log_file = open("log.txt", "r+")

chars = 0
lines = 0
letters = []
counted = {}

for i in log_file.read():
    if i == '\n':
        lines += 1
    chars += 1
    letters.append(i)

key_string = "".join(letters)
word_string = key_string.replace('\n', " ")
final_keywords_list = word_string.split()

for letter in final_keywords_list:
    letr = str(letter)
    if letr in counted:
        counted[letr] += 1
    else:
        counted[letr] = 1
Enter fullscreen mode Exit fullscreen mode

在继续为词典中的每个单词绘制条形图之前,我们先进行一些筛选。
如果运行代码一段时间,我们最终会捕获大量的单词。我们不可能为每个单词都绘制一个条形图。因此,让我们创建一个新的词典,其中包含至少重复 3 次的单词。

new_dict = {}  #making a new empty dictionary

for item in counted:  #looping through the old one
    if counted[str(item)] >= 3:  #if repeated more than 3 times
        new_dict[str(item)] = counted[str(item)]  #add to the new dictionary
Enter fullscreen mode Exit fullscreen mode

太棒了,现在我们可以开始画画了🦄

首先我们需要导入我们安装的库:

import matplotlib.pyplot as plt  #calling plt just makes it more convenient
Enter fullscreen mode Exit fullscreen mode

现在,在代码的底部,让我们开始绘制单词:

plt.title('KEYLOG ANALYSIS', fontsize = 20)  #choosing a title for the graph
plt.bar(range(len(new_dict)), list(new_dict.values())) 
plt.xticks(range(len(new_dict)), list(new_dict.keys()))

plt.show()
Enter fullscreen mode Exit fullscreen mode

我们花点时间解释一下。
plt.bar()该方法接受许多参数。默认的位置参数是图表的 x 坐标(单词索引)和图表的 y 坐标(实际单词)。

plt.xticks()方法用于标记图形的 x 坐标。因此,将字典的键作为第二个参数,将会把每个单词绘制在其对应的条形下方。

太棒了!现在我们可以开始尝试了!
最终代码如下:

import matplotlib.pyplot as plt

log_file = open("log.txt", "r+")

chars = 0
lines = 0
letters = []
counted = {}
new_dict = {}

for i in log_file.read():
    if i == '\n':
        lines += 1
    chars += 1
    letters.append(i)

key_string = "".join(letters)
word_string = key_string.replace('\n', " ")
final_keywords_list = word_string.split()

for letter in final_keywords_list:
    letr = str(letter)
    if letr in counted:
        counted[letr] += 1
    else:
        counted[letr] = 1

for item in counted:
    if counted[str(item)] >= 3:
        new_dict[str(item)] = counted[str(item)]

print(lines, "Lines", " || ", chars, "Character", " || ", len(final_keywords_list), "Words")
print('\n')

plt.title('KEYLOG ANALYSIS', fontsize = 20)
plt.bar(range(len(new_dict)), list(new_dict.values()))
plt.xticks(range(len(new_dict)), list(new_dict.keys()))

plt.show()
Enter fullscreen mode Exit fullscreen mode

现在剩下的就交给你了。只需运行我们编写的第一个键盘记录器。用你的键盘做一些操作。完成后,运行这段代码,看看它显示了什么!
请在下方截图中分享结果(有时候真的很有趣😆)。
另外,你也可以在 GitHub 上克隆这个项目,然后随意操作。

给我买杯咖啡

我毕生致力于尽可能地支持和贡献网络社区的常识。我的一些文章可能听起来有点傻,或者太难,但任何知识都是有用的。如果你喜欢我的文章,请随时给我买杯咖啡,帮助我继续写作😉❤️

文章来源:https://dev.to/mustafaanas/for-beginners-analysis-your-own-daily-activity-by-building-a-python-keylogger-44kc
PREV
Angular 单元测试 101(含示例)在开始 Angular 自动化测试之前总结
NEXT
如何使用 JavaScript 制作二维码生成器?