使用 Python 创建键盘记录器

2025年3月17日 | 阅读13分钟

键盘记录器是一种监控软件,用于记录用户通过键盘输入的按键。它们通常用于监控网络使用情况和排查技术错误。另一方面,许多恶意软件会利用键盘记录器来尝试获取各种网站的用户名和密码。

在本教程中,我们将了解如何使用 Python 编程语言中的 **pynput** 库来创建一个简单的键盘记录器。

那么,让我们开始吧。

了解 Python pynput 库

Python 中的 **pynput** 库允许程序员控制和监控输入设备。该库包含支持的每种输入设备的子包。

  1. mouse: 此子包包含控制和监控鼠标或触控板的类。
  2. keyboard: 此子包包含控制和监控键盘的类。

要安装 Python 库,我们需要 ‘**pip**’,这是一个用于维护所需包的框架,可以从受信任的公共存储库安装模块。一旦我们有了 ‘**pip**’,我们就可以从命令提示符 (CMD) 或终端使用如下所示的命令来安装 **pynput** 库。

语法

前面提到的所有模块都会自动导入到 **pynput** 包中。我们可以通过简单地从主包导入它们来使用任何一个模块。一旦 **pynput** 包安装完成,我们就可以创建一个空的 Python 程序文件并写入一个 **import** 语句来验证它,如下所示。

文件:verify.py

现在,保存上述文件并在终端中使用以下命令执行它:

语法

如果上述 Python 程序文件没有返回任何错误,则表示库已正确安装。但是,如果出现异常,请尝试重新安装该库,并且还建议参考该库的官方文档。

在本教程中,我们将只讨论 **pynput** 库的 **keyboard** 模块,它将用于创建简单的键盘记录器。

但首先,让我们了解一些基础知识。

使用 Python 按下和释放键盘按键

我们将学习的第一件事是借助 Python 来控制键盘,尤其是按下键盘按键的方法。

我们需要关注两种类型的按键:

  1. 常规按键 - 这些按键包括字母、数字和符号。
  2. 特殊按键 - 这些按键包括空格、Shift、Ctrl 等。

要开始控制键盘,我们需要创建一个 **Controller()** 类的对象,该对象将具有 **press()** 和 **release()** 方法。此类会将键盘事件发送到系统。

现在让我们来看一个简单的例子来演示这一点。

示例 1

说明

在上面的代码片段中,我们从 **pynput** 库的 keyboard 模块导入了 **Controller()** 类。然后我们创建了 **Controller()** 类的一个对象。然后我们使用 **press()** 和 **release()** 方法来输入一个字母。结果,上面的代码将在鼠标光标所在的任何位置输入“**x**”。它也被设计为一次按下和释放一个按键。

上述代码片段的输出将如下所示:

输出

$ python example1.py
$ x

此外,我们还可以按下和释放多个按键。让我们看一个演示此操作的简单示例:

示例 2

说明

在上面的代码片段中,我们现在已经按下了和释放了多个按键。结果,我们将看到“**xyz**”作为输出。

上面代码片段的输出如下所示:

输出

$ python example2.py
$ xyz

现在,让我们了解处理特殊按键的方式。假设我们想按下“**x y**”(x,空格,y)。

空格等特殊按键通过 **pynput** 库的 Key 类来调用。

Key 类表示可能不对应字母的各种按钮。此类包含修饰键和功能键。

下表提供了所有特殊按键的完整列表。这些实体的实际值在不同平台之间有所不同。某些平台可能包含额外的按钮;但是,这些保证在所有地方都可用。

序号。描述
1alt = 0这是一个通用的 **Alt** 键。它被视为一个修饰键。
2alt_gr = 0这是 **AltGr** 键。它被视为一个修饰键。
3alt_l = 0这是 **左 Alt** 键。它被视为一个修饰键。
4alt_r = 0这是 **右 Alt** 键。它被视为一个修饰键。
5backspace = 0这是 **退格键**。
6caps_lock = 0这是 **Caps Lock** 键。
7cmd = 0这是一个通用的 **Command** 按钮。在 PC 平台上,此按钮对应于 **Super** 键或 **Windows** 键,而在 Mac 上,它对应于 **Command** 键。它可以被视为一个修饰键。
8cmd_l = 0这是 **左 Command** 按钮。在 PC 平台上,此按钮对应于 **Super** 键或 **Windows** 键,而在 Mac 上,它对应于 **Command** 键。它可以被视为一个修饰键。
9cmd_r = 0这是 **右 Command** 按钮。在 PC 平台上,此按钮对应于 **Super** 键或 **Windows** 键,而在 Mac 上,它对应于 **Command** 键。它可以被视为一个修饰键。
10ctrl = 0这是一个通用的 **Ctrl** 键。它被视为一个修饰键。
11ctrl_l = 0这是 **左 Ctrl** 键。它被视为一个修饰键。
12ctrl_r = 0这是 **右 Ctrl** 键。它被视为一个修饰键。
13delete = 0这是 **Delete** 键。
14down = 0这是一个 **向下箭头** 键。
15end = 0这是 **End** 键。
16enter = 0这是 **Enter** 或 **Return** 键。
17esc = 0这是 **Esc** 键。
18f1 = 0这是一个 **功能** 键。从 **F1** 到 **F20** 的所有键都已定义。
19home = 0这是 **Home** 键。
20insert = 0这是 **Insert** 键。对于某些平台,这可能被视为未定义。
21left = 0这是一个 **向左箭头** 键。
22media_next = 0这是 **下一个音轨** 按钮。
23media_play_pause = 0这是 **播放/暂停切换** 按钮。
24media_previous = 0这是 **上一个音轨** 按钮。
25media_volume_down = 0这是 **降低音量** 按钮。
26media_volume_mute = 0这是 **静音** 按钮。
27media_volume_up = 0这是 **提高音量** 按钮。
28menu = 0这是 **菜单** 键。对于某些平台,这可能被视为未定义。
29num_lock = 0这是 **Num Lock** 键。对于某些平台,这可能被视为未定义。
30page_down = 0这是 **Page Down** 键。
31page_up = 0这是 **Page Up** 键。
32pause = 0这是 **Pause/Break** 键。对于某些平台,这可能被视为未定义。
33print_screen = 0这是 **Print Screen** 键。对于某些平台,这可能被视为未定义。
34right = 0这是一个 **向右箭头** 键。
35scroll_lock = 0这是 **Scroll Lock** 键。对于某些平台,这可能被视为未定义。
36shift = 0这是一个通用的 **Shift** 键。它被视为一个修饰键。
37shift_l = 0这是 **左 Shift** 键。它被视为一个修饰键。
38shift_r = 0这是 **右 Shift** 键。它被视为一个修饰键。
39space = 0这是 **空格键**。
40tab = 0这是 **Tab** 键。
41up = 0这是一个 **向上箭头** 键。

现在让我们看一个演示使用这些特殊按键的示例。

示例 3

输出

$ python example3.py
$ x y

在上面的代码片段中,我们从 **pynput.keyboard** 模块导入了 **Key** 和 **Controller** 类。我们实例化了 **Controller** 类,并使用 **press()** 和 **release()** 方法输入了一些字母。我们还使用 **Key** 类使用了 **space** 键,并在字母 - **x** 和 **y** 之间打印了空格。

上述方法适用于我们按下和释放的特殊按键。例如,空格、回车键等等。但是,我们如何处理我们输入时按下的按键呢?让我们以 **Shift** 键为例,目标是按下“**Xy**”(大写的 X,y)。

要执行此类功能,**Controller()** 类提供了一个名为 **pressed()** 的有用方法。让我们看一个演示此操作的简单示例:

示例 4

输出

$ python example4.py
$ Xy

说明

在上面的代码片段中,我们从 **pynput.keyboard** 模块导入了 **Key** 和 **Controller** 类。我们实例化了 **Controller** 类,并在 **with** 语句中使用 **Key** 类指定的 **pressed()** 方法。我们使用 **press()** 和 **release()** 在此语句内输入字母 ' **x** '。我们再次使用 **press()** 和 **release()** 并按原样输入字母 ' **y** '。

用户可以根据自己的需求尝试不同的按键组合。可以根据需要配置代码;但是,这只是关于按下和释放逻辑如何控制键盘的通用概述。

创建示例日志文件

现在让我们创建一个示例日志文件来存储键盘记录器记录的按键。

我们可以创建一个示例文件并将其集成到键盘记录过程中。

以下代码片段演示了相同的内容:

示例 5

说明

在上面的代码片段中,我们在 **with** 语句中使用了 **open()** 方法创建了一个名为 “**keylog.txt**” 的新文件。然后我们使用 **write()** 方法将一些文本写入此日志文件。

一旦我们执行了上面的代码,我们将得到一个包含文本:**This is a log file** 的 **keylog.txt** 文件。我们希望 Python 能够记录我们按下的按键,并在以下内容中将它们添加到此文件中。

使用 Python 创建简单的键盘记录器

我们知道如何用一些示例文本创建一个日志文件。我们希望 Python 能够写入我们按下的按键并将它们存储到此文件中(而不是在那里保留相同的文本)。

那么,让我们先从理论上考虑我们想做什么?我们需要一个列表来不断追加我们按下的键盘按键。然后,一旦按下某个按键,它就会将此列表写入文件。

让我们借助下面的代码片段来理解上述语句的工作原理。

文件: keylogger.py

说明

在上面的代码片段中,我们从 **pynput** 库的 keyboard 模块导入了 **Key** 类。然后我们创建了一个空列表以存储按下的按键。然后我们定义了一个名为 **functionPerKey()** 的函数,它提供了在按下按键时要执行的说明。我们使用 **append()** 函数将每个按下的按键附加到此函数内的列表中。我们调用了另一个名为 **storeKeysToFile()** 的函数,在按下每个按键后将列表写入文件。但是,此函数仍需要定义。

请记住,我们按下的按键以“**key**”格式出现,为了将其写入文件,我们必须将其转换为字符串。此外,我们需要删除每个按键中的“引号”,因为每个按键都是一个字符串,而我们想将它们连接在一起。

现在让我们来看下面的代码片段,我们将在这里定义另一个函数来将按键写入文件。

文件: keylogger.py

说明

在上面的代码片段中,我们定义了一个名为 **storeKeysToFile()** 的自定义函数,它接受一个按键作为参数。在该函数中,我们使用 **open()** 方法以写入模式创建了 **keylog.txt** 文件。然后我们使用 **for** 循环迭代列表中的每个按键,将它们转换为字符串并删除引号。然后我们使用 **write()** 方法将每个按键写入 **keylog.txt** 文件。

结果,每当按下按键时,Python 都会创建一个 **keylog.txt** 文件,其中包含从脚本开始运行到最后一次按下按键的所有按键列表。

如果我们像这样保留代码,它将一直执行。我们将定义一个包含某个停止按键或按键组合的函数,该函数将停止键盘记录器。让我们将“**Esc**”作为此程序的停止按键。现在我们将着手实现它。

我们已经知道,每当我们按下“**Esc**”时,它都会被添加到 keylog.txt 文件中。因此,我们将定义一个操作,在按下“**Esc**”键后释放它时必须执行。

现在让我们看下面的代码片段,它演示了这样一个函数的实现。

文件: keylogger.py

说明

在上面的代码片段中,我们定义了一个函数来操作每次按键释放。在该函数中,我们使用 **if** 条件语句检查释放的按键是否为“**Esc**”,如果是,则返回 **False**。

作为最后一步,我们需要将所有内容整合起来,让键盘记录器运行起来。

我们需要一个监听对象来运行键盘记录器。该对象将记录键盘事件。我们将使用 **pynput** 库的 keyboard 模块中的 **Listener()** 类来执行此操作。

**Listener()** 类有不同的参数;但是,我们只需要两个。这些参数简要描述如下:

  1. on_press - 当按下按键时,此参数会调用要执行的函数。
  2. on_release - 当释放按键时,此参数会调用要执行的函数。

现在我们将上面自定义的函数分配给 **Listener()** 类的参数,以便我们可以将每个按下的按键连接起来。

现在让我们看下面的代码片段,它演示了上述语句的实现。

文件: keylogger.py

说明

在上面的代码片段中,我们导入了代码片段,并从 **pynput** 库的 **keyboard** 模块导入了 **Listener()** 类。然后我们使用了 **Listener()** 类,并指定了参数 **on_press = functionPerKey** 和 **on_release = onEachKeyRelease**。最后,我们使用 **join()** 方法将这些指定的函数连接起来。

“**Python Keylogger**”程序的编码终于完成了。我们现在可以保存文件并运行程序来看看它是否正常工作。

要运行程序,我们可以在命令行 shell 或终端中键入以下命令

命令

但在我们看到输出之前,这里有一个完整的项目代码。

完整程序代码

以下程序文件是“**Python Keylogger**”程序的完整代码。

文件: keylogger.py

输出

$ python keylogger.py
# type something and press enter to print something on Command prompt
$ This is a simple keylogger program.
# press "Esc" key to stop the keylogger

‘keylog.txt’ 文件中的输出

Creating a Keylogger using Python