背景
电脑的安全是非常重要的,特别是里面的敏感数据,若是被有心之人利用,那后果不堪设想。
所以我们部门定下了一个规矩,谁离开工位要是不锁屏,就可以在部门群发送一个消息:我请大家吃鸡翅。
oh,技术出身怎么可以让这种事情发生。
简介
最新代码我放到了这里:https://github.com/GuoFlight/ListenKey ,欢迎Star与交流。
代码逻辑是,监听到指定的字符串就会「执行动作」。
代码实现
执行环境:Mac+Python3.(Windows也可,但要修改小部分代码)
仓库中我还实现了启停脚本control.sh。这里只介绍主要逻辑。
将以下代码后台执行,当键盘输入"jichi", "qingdajia", "dajia", "weizheng"这些字符串时,Mac就会锁屏。
#!/usr/bin/python3 from pynput.keyboard import Listener import os import time import signal from multiprocessing import Pool ##################################### # 程序作用:监听键盘,若输入了指定的字符串,则执行相应的动作 # 作者:京城郭少 ##################################### class ListenKey: def __init__(self, listenStr="", actionFunc=None): self.listenStr = listenStr self.actionFunc = actionFunc self.index = 0 def on_press(self, key): # print("监听到了",key) # DEBUG if self.listenStr == "" or self.actionFunc == None: return pressKey = None try: pressKey = key.char except AttributeError: pressKey = key if pressKey == self.listenStr[self.index]: # print("本次按键符合条件") # DEBUG if self.index == len(self.listenStr) - 1: self.index = 0 self.actionFunc() now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) print("【%s】执行动作" % (now),flush=True) # DEBUG else: self.index = (self.index + 1) % (len(self.listenStr)) else: self.index = 0 def on_release(self, key): return def start_listen(self): # print("开始监听") #DEBUG with Listener(on_press=self.on_press, on_release=self.on_release) as listener: listener.join() #指定动作 def actionFunc(): #os.system("shutdown -s now") os.system("osascript -e 'tell application "System Events" to key code 12 using {control down,command down}'") #print("hello",flush=True) #处理信号 def handle_exit(sig, stack_frame): print('eixt',flush=True) p.terminate() exit(0) if __name__ == '__main__': keywords = ["jichi", "qingdajia", "dajia", "weizheng"] signal.signal(signal.SIGINT, handle_exit) signal.signal(signal.SIGQUIT, handle_exit) signal.signal(signal.SIGTERM, handle_exit) # signal.signal(signal.SIGKILL, handle_exit) listenKey = [] p = Pool(6) # 最多同时执行6个进程 for i in keywords: listenKey.append(ListenKey(i, actionFunc)) for i in listenKey: p.apply_async(i.start_listen) # 在进程池中添加进程 p.close() p.join() # 等待子进程结束再往下执行
京城郭少