对于初学者 - 通过构建 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
此函数接受一个参数,即按下的键(我们稍后会传递它),然后访问全局按键数组,并将按下的键添加到该数组中。但目前为止,由于我们尚未调用此函数,因此它尚未运行。因此,我们需要在每次按下键时调用此函数。为此,我们需要从pynput
库中导入几个模块。
在文件的最顶部.py
,添加以下代码:
from pynput.keyboard import Key, Listener
要确保已安装 pynput,请运行以下命令pip install pynput
在文件的最底部,让我们使用导入的 Listener 库,on_press
在每次按下键时调用我们刚刚定义的函数()。
with Listener(on_press = on_press) as listener:
listener.join()
太好了。现在我们的代码如下所示:
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()
运行它,我们什么也看不到,但代码会把日志记录到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)
太棒了。现在这个函数打开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.
看起来我们成功了!
最终代码如下:
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()
太棒了🦄
现在运行这段代码,试着在任何地方输入一些句子,它们会强制关闭代码。
你会看到一个新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)
我们编写的循环读取了log.txt
从之前编写的代码中获得的整个文件,并计算了其中有多少个字符和行,然后将字母添加到数组中。(我们重新做了之前代码中所做的事情😄)。
现在我们要做的是创建一个包含单词但不包含字母的新数组。
方法是将joining
数组中的所有字母合并成一个字符串。然后,每当我们看到 (时,我们split
就将这个字符串转换为一个单词数组。这是 Python 提供的实用方法。让我们看看它们有多么容易使用。)space
split
join
key_string = "".join(letters)
word_string = key_string.replace('\n', " ")
final_keywords_list = word_string.split()
这可能看起来太复杂了,但实际上并非如此。这里的每一行都执行我们之前提到的步骤:
- 将字母连接成一个字符串
- 用适当的空格替换 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
太棒了!到目前为止,我们的代码已经达到了我们的预期。我们创建了一个字典,里面记录了每个输入的单词以及它被重复的次数。
让我们开始可视化吧!
既然我们已经统计了字数,为什么不做一些过滤和数据可视化呢?我们掌握数据的方式让我们可以做很多事情(当然,这段代码运行的时间越长,你捕获的字数就越多,你的分析就越准确)。
为了本教程的目的,我选择制作一个比较重复词汇的条形图。
为此,我们将使用一个名为的库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
在继续为词典中的每个单词绘制条形图之前,我们先进行一些筛选。
如果运行代码一段时间,我们最终会捕获大量的单词。我们不可能为每个单词都绘制一个条形图。因此,让我们创建一个新的词典,其中包含至少重复 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
太棒了,现在我们可以开始画画了🦄
首先我们需要导入我们安装的库:
import matplotlib.pyplot as plt #calling plt just makes it more convenient
现在,在代码的底部,让我们开始绘制单词:
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()
我们花点时间解释一下。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()
现在剩下的就交给你了。只需运行我们编写的第一个键盘记录器。用你的键盘做一些操作。完成后,运行这段代码,看看它显示了什么!
请在下方截图中分享结果(有时候真的很有趣😆)。
另外,你也可以在 GitHub 上克隆这个项目,然后随意操作。
文章来源:https://dev.to/mustafaanas/for-beginners-analysis-your-own-daily-activity-by-building-a-python-keylogger-44kc我毕生致力于尽可能地支持和贡献网络社区的常识。我的一些文章可能听起来有点傻,或者太难,但任何知识都是有用的。如果你喜欢我的文章,请随时给我买杯咖啡,帮助我继续写作😉❤️