前言
一、安装
1.安装用到的第三方库
2.安装Everything
二、搜索本地文件
三、模拟键盘输入
总结
前言
前几天公司给每台电脑都装了个监控软件,每3分钟截一张图上传后台,真的是太过分了,
这还让我怎么摸鱼?!那我们反其道而行之,让他们看到我们认真工作的样子。
实现思路:随机读取一个本地文件,创建一个新文件用文本编辑器打开,控制键盘输入文件内容,实现24小时全天候敲代码,工作效率拉满。
先放一张动图.gif
理论存在,实践开始。
一、安装
1.安装用到的第三方库
pip install pyautogui
pip install requests
2.安装Everything
搜索本地文件自己遍历效率太慢,我这里用了everything提供的http服务器
开启http服务器方法:打开一个everything界面→工具→选项,启用HTTP服务器,端口随便填一个没被占用的就好。
这样我们就可以在本地访问到这样的一个网址。
二、搜索本地文件
首先是要搜索到本地文件,everything的http服务器给我们提供了接口
def search(search='', offset=0, count=30, path=1, regex=1, sort='name'):
params = {
'search': search, # 搜索文本
'offset': offset,
'count': count,
'json': '1',
'case': '0', # 数值非零时匹配大小写
'wholeword': '0', # 数值非零时匹配全字
'path': path, # 数值非零时搜索完整路径
'regex': regex, # 数值非零时执行正则搜索
'diacritics': '0', # 数值非零时匹配变音标记
'path_column': '1', # 数值非零时列举结果路径为 json 对象
'size_column': '1', # 数值非零时列举结果大小为 json 对象
'date_modified_column': '1', # 数值非零时列举结果修改日期为 json 对象
'date_created_column': '0', # 数值非零时列举结果创建日期为 json 对象
'attributes_column': '0', # 数值非零时列举结果属性为 json 对象
'sort': sort, # name,path,date_modified,size
'ascending': '0', # 数值非零时升序排列
}
r = requests.get('http://localhost:8888/', params=params, timeout=8)
ret_data = r.json()
total = ret_data['totalResults']
results = ret_data['results']
return results
接口有很多参数,主要用到search(关键词)、count(数量)、regex(开启正则)、json(返回json结果)。
这里放一份官方文档,里面有完整的参数解释:Everything - HTTP
比如我们要搜索D盘下js、css、html文件,取1000个返回结果
search(search='^D:\\\\.*?\.(js|css|html)$',count=1000)
返回结果有我们需要的文件名称、文件路径还有文件大小。
三、模拟键盘输入
python模拟键盘输入的库有好几个,这里用的是pyautogui,下面是几个用到的api
pyautogui.typewrite('Hello world!') # 输入Hello world!字符串
pyautogui.typewrite('Hello world!', interval=0.25) # 每次输入间隔0.25秒,输入Hello world!
pyautogui.press('enter') # 按下并松开(轻敲)回车键
pyautogui.press(['left', 'left', 'left', 'left']) # 按下并松开(轻敲)四下左方向键
pyautogui.keyDown('shift') # 按下`shift`键
pyautogui.keyUp('shift') # 松开`shift`键
pyautogui.hotkey('ctrl', 'v') # 组合按键(Ctrl+V),粘贴功能,按下并松开'ctrl'和'v'按键
# 常用输入
pyautogui.KEYBOARD_KEYS = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.',
'/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@',
'[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback',
'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch',
'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal',
'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22',
'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul',
'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2',
'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9',
'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print',
'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select',
'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command',
'option', 'optionleft', 'optionright']
首先从1000个文件中随机选一个读取,创建一个新文件,并用文本编辑器打开它。
打开文件后获取到文本编辑器的窗口句柄,以便后面切换窗口时暂停输入。
# 读取一个随机文件
def get_random_file(file_list):
random_index = random.randint(0, len(file_list))
random_file = file_list[random_index]
file_path = Path(random_file['path']) / random_file['name']
random_file['file_path'] = file_path
return random_file
# 在autoCode文件夹下创建一个新文件
edit_file_path = Path(f'./autoCode/{file_name}')
code = os.system(f'type nul>{edit_file_path}')
if code != 0:
return False
# 用文本编辑器打开文件
# notepad++ 打开
code = os.system('start notepad++ ' + './autoCode/' + file_name)
# vscode 打开
code = os.system(f'code {edit_file_path}')
if code != 0:
return False
# 获取当前窗口句柄,窗口名
cur_hwnd = win32gui.GetForegroundWindow()
cur_cls_name = win32gui.GetClassName(cur_hwnd)
# 判断当前窗口是否是文本编辑器的方法,把上面获取到的窗口句柄,窗口名传入
def is_pause_or_close(hwnd, class_name):
_hwnd = win32gui.FindWindow(class_name, None)
# 0代表这个没有获取到这个窗口
if _hwnd == 0:
return -1
_cur_hwnd = win32gui.GetForegroundWindow()
if _cur_hwnd != hwnd:
return 1
return 0
接下来就是循环随机文件的内容,模拟键盘输入
for char in content:
# 判断是否切换或关闭窗口
status = is_pause_or_close(cur_hwnd, cur_cls_name)
if status == 1:
time.sleep(2)
continue
elif status == -1:
sys.exit(0)
# 判断是否是中文,pyautogui没办法输入中文
if is_zh(char):
continue
if char == '\n':
enter_begin = True
pyautogui.press('enter')
continue
if enter_begin and char == ' ':
continue
enter_begin = False
pyautogui.press(char)
time.sleep(random_sleep_time())
# 判断是否是中文的方法
unicode_min = int(u'4E00', 16)
unicode_max = int(u'9FFF', 16)
def is_zh(char):
return unicode_min <= ord(char) <= unicode_max
总结
到这里全自动代码机就实现了,快去让你的代码自己动起来吧。