Advertisement
egor230

help_write_text_for_linux.py

Oct 16th, 2023 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.68 KB | None | 0 0
  1. from datetime import datetime
  2. from PIL import ImageGrab
  3. from pynput.keyboard import Key, Controller
  4. from pynput import *
  5. import time, json, os, copy, subprocess, pyautogui, re, threading
  6. import keyboard as keybo
  7. from tkinter import *
  8. import tkinter as tk
  9.  
  10. def check_current_active_window(user):# Получаем идентификатор активного окна
  11. get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
  12. active_window_id=$(xdotool getactivewindow 2>/dev/null)
  13. if [ -n "$active_window_id" ]; then
  14. process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
  15. echo "$process_id_active"
  16. else
  17. echo "0" # Или любое значение по умолчанию, если нет активного окна
  18. fi
  19. exit '''
  20. try:
  21. process_id = int(subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip())
  22. a = []
  23. result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout) # # print(result)
  24. lines = result.split('\n')
  25. a = [line for line in lines if user in line] # Убираем 'root' из условия
  26. pattern = [r"(.*.exe)",r"(.*.EXE)"]
  27. for i in a:
  28. for p in pattern: # print(i)
  29. dir_process_name = i.split(maxsplit=10)[10].replace('\\', '/') # Извлекаем нужную часть строки
  30. match = re.search(p, dir_process_name)
  31. if match:
  32. file_path = match.group(1) # Получаем полный путь
  33. pid_id = int(i.split()[1]) # id потока
  34. if ".exe" in file_path or ".EXE" in file_path and "WINWORD.EXE" not in file_path:
  35. if process_id == pid_id:# нашли pid активного окна
  36. # print(file_path)
  37. return True# активного окна
  38. return False
  39. except:
  40. return False
  41.  
  42. def screenshot(left, top, width, height): # print(left, top, width, height, end=' ')
  43. time.sleep(0.3)
  44. # Делаем скриншот с заданными размерами и координатами
  45. screenshot = ImageGrab.grab(bbox=(left, top, left + width, top + height))
  46. now = datetime.now()
  47. current_date = now.strftime("%Y-%m-%d")
  48. current_time = now.strftime("%H-%M-%S")
  49. file_name_path = format("{}screenshot-{}-{}.png".format(
  50. "/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/Screenshots/",
  51. current_time,
  52. current_date))
  53. screenshot.save(file_name_path, format="PNG") # Сохраняем изображение в файл
  54. time.sleep(0.1)
  55. # Копируем изображение в буфер обмена с помощью xclip
  56. subprocess.run(['xclip', '-selection', 'clipboard', '-t', 'image/png', '-i', file_name_path])
  57.  
  58. def calculate_coordinates(begin_point, end_point):
  59. left = min(begin_point.x(), end_point.x())
  60. top = min(begin_point.y(), end_point.y())
  61. width = abs(end_point.x() - begin_point.x())
  62. height = abs(end_point.y() - begin_point.y())
  63. return left, top, width, height # Рассчитываем координаты top-left угла и размеры для скриншота
  64.  
  65. def load_coordinates_from_json():
  66. json_file_path = 'settings for screenshot.json' # Путь к JSON файлу
  67.  
  68. if os.path.exists(json_file_path): # Проверяем существует ли файл
  69. with open(json_file_path, 'r') as json_file:
  70. coords = json.load(json_file)
  71. # Присваиваем значения из словаря переменным
  72. left = int(coords['left'])
  73. top = int(coords['top'])
  74. width = int(coords['width'])
  75. height = int(coords['height'])
  76. screenshot(left, top, width, height) # Вызываем функцию скриншота с расчитанными параметрами
  77. else: # Задаем размеры скриншота если нет файла настроек.
  78. top = int(130)
  79. left = int(110)
  80. width = 1530
  81. height = 910
  82. screenshot(left, top, width, height)
  83. def clean_label(root):
  84. root.overrideredirect(False)
  85. root.withdraw() # свернуть панель подсказок.
  86. root.overrideredirect(True)
  87. k.clean()
  88. for i in range(len(l)):
  89. l[i].config(text="") # thread1 = threading.Thread(target=(b, user,))
  90. # thread1.daemon = True # Установка атрибута daemon в значение True # thread1.start() #
  91. class save_key:
  92. def __init__(self):
  93. self.key = ""
  94. self.text = ""
  95. self.swith=False
  96. self.count=0
  97. self.res=[]
  98. self.flag=True
  99. self.replace=True
  100. self.flag_thread=False
  101. self.flag_screenshot=False
  102. self.lock = threading.Lock()
  103.  
  104. def get_flag_screenshot(self):
  105. return self.flag_screenshot
  106.  
  107. def set_flag_screenshot(self, value1):
  108. self.flag_screenshot = value1
  109.  
  110. def get_replace(self):
  111. return self.replace
  112.  
  113. def set_replace(self, value):
  114. self.replace = value
  115. def get_flag(self):
  116. return self.flag
  117.  
  118. def set_flag(self, value):
  119. self.flag=value
  120.  
  121. def save(self, key):# сохранить вводное слово.
  122. self.key =key
  123. return self.key
  124. def clean(self):# обнулить вводное слово.
  125. self.key ="" # self.replace=False
  126. self.res.clear()
  127. def update(self, key1):
  128. self.key =str(self.key)+str(key1).replace("'","")
  129.  
  130. def backspace(self, root):
  131. if len(self.key)==1:
  132. clean_label(root)
  133. self.res.clear()
  134. root.withdraw() # свернуть панель подсказок.
  135. self.key=""
  136. else:
  137. self.key = str(self.key[:-1]) # print(self.key)
  138. return self.key
  139. def return_key(self):
  140. return self.key
  141.  
  142. def get_swith(self):
  143. return self.swith
  144.  
  145. def set_swith(self, value):
  146. self.swith = value
  147. def save_len(self, count):
  148. self.count = count
  149. def get_len(self):
  150. return self.count
  151.  
  152. def save_list(self,res1):
  153. self.res.clear()
  154. for i in range(len(res1)):
  155. res1[i]=str(res1[i]).replace(" ","")
  156. self.res=res1
  157. def get_list(self):
  158. return self.res
  159.  
  160. def save_text(self, text):
  161. self.text = text
  162. def get_text(self):
  163. return self.text
  164.  
  165. timestamp = time.time()
  166. script = f'''#!/bin/bash
  167. current_user=$(whoami);
  168. echo $current_user
  169. exit;# Завершаем выполнение скрипта
  170. '''
  171. # Вызываем скрипт
  172. user = subprocess.run(['bash'], input=script, stdout=subprocess.PIPE, text=True).stdout.strip() # он возвращает имя пользователя (user)
  173. k=save_key()
  174. with open("/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/words.txt", encoding="cp1251") as r:
  175. k.save_text(r.read())
  176. # print(k.get_text())
  177.  
  178. root = Tk()
  179. global arg
  180. arg = [StringVar() for _ in range(7)]
  181. global l
  182. l=[]
  183. key1=""
  184. def f(word, text):
  185. find_liter = r'\b{}\w+\s'.format(word)
  186. Find_liter = r'\b{}\w+\s'.format(word.capitalize()) # find_liter = r'\b{}+[ ^.!?]+[.!?]+'.format(word) # Find_liter = r'\b{}+[ ^.!?]+[.!?]+'.format(word.title())
  187. res = re.findall(find_liter, text)
  188. res1 = re.findall(Find_liter, text)
  189. res = res + res1
  190. for i in range(len(res)):
  191. res[i]= str(res[i]).replace("\n","").replace(" ","") # [res1.append(word.lower()) for word in res]
  192.  
  193. a = sorted(list(set(res)), key=len) # res = lensort(res)
  194. return a
  195. def dela(root):
  196. clean_label(root) # удалить подсказки.
  197. k.backspace(root)# откл блок обработчика
  198. swit1=0
  199. def get_new_key(key, text): # получить новое слово
  200. res=[]
  201. k.update(str(key))
  202. key1= k.return_key()
  203. res = f(key1, text) # Найти список слов.
  204. k.save_list(res) # Сохранить этот список слов.
  205. return res
  206.  
  207. def typing_text( char): # Печатает это слово по буквам.
  208. char = str(char) # print(char)
  209. delay = 0.9 # Задайте здесь нужную задержку в секундах
  210. script = f'''#!/bin/bash
  211. word="{char}" # Задайте здесь нужное слово
  212. delay={delay} # Задайте здесь нужную задержку в секундах
  213. if [[ -z "$word" ]]; then
  214. xte "key space"
  215. else
  216. if [[ $word == [:upper:]* ]]; then
  217. xdotool key Caps_Lock
  218. sleep $delay # Пауза в секундах
  219. xdotool type "$word"
  220. xdotool key Caps_Lock
  221. else
  222. xdotool type "$word"
  223. sleep $delay # Пауза в секундах
  224. fi
  225. fi
  226. '''
  227. subprocess.call(['bash', '-c', script, '_'])
  228. def update_word(key):# обновить слово
  229. k.update(str(key))
  230. key1 = k.return_key() # Вернуть обновлённое слово.
  231. return key1
  232.  
  233. Backspace = f'''#!/bin/bash
  234. xte 'keydown BackSpace' 'keyup BackSpace'
  235. '''
  236. def replacing_words(old_word, new_word, root):
  237. k.set_flag(False)
  238. clean_label(root) #
  239. root.withdraw() # свернуть панель подсказок.
  240.  
  241. len_word=len(old_word)+1 # длинна написаного слово для удаления. print(len_word)
  242. for i in range(len_word):
  243. subprocess.call(['bash', '-c', Backspace, '_'])
  244. time.sleep(0.09) # typing_text(new_word)
  245.  
  246. dela(root)
  247. t2 = threading.Thread(target=typing_text, args=(new_word,))
  248. t2.start()
  249. t2.join()
  250. k.set_flag(True)
  251. return True # input()
  252.  
  253. def filling_in_hints(key1, root):
  254. text=k.get_text() # key = from_ghbdtn(key) # print(key)
  255. res = f(key1, text) # print(key1) # # print(res)
  256. k.save_list(res)
  257. for i in range(len(l)):
  258. l[i].config(text="")
  259. sum_len=[]
  260. if len(res)>0:
  261. for i in range(len(res)):
  262. if i<len(l):
  263. l[i].config(text=res[i])
  264. arg[i].set(str(res[i]))
  265. sum_len.append(len(str(res[i])))
  266. k.set_replace(True)
  267. root.deiconify() # показать панель.
  268. time.sleep(0.001)
  269. else:
  270. root.withdraw()# свернуть панель подсказок.
  271. dela(root)
  272.  
  273. frame = Frame(root, borderwidth=0)
  274. for i in range(6):
  275. l.append(Label(frame, text=arg[i], font='Times 14'))
  276. l[i].config(text="")
  277.  
  278. l[i].pack(side=tk.LEFT, padx=3, fill=tk.X, expand=False)
  279. # l[i].pack(side=LEFT, padx=3, fill=X) # Заполняем всю ширину
  280.  
  281. frame.pack(fill=X)
  282.  
  283. def show_hints(key, root):
  284. key= update_word(key)# обновить слово
  285. filling_in_hints(key, root) # вывести подсказки.
  286. # Получаем количество букв первых 6 элементов
  287. res=k.get_list()
  288. lengths = sum(len(word) for word in res[:6])
  289. len_len=lengths*12+10
  290. # len_len=600
  291. root.geometry(f"{len_len}x20+700+1025") # Первые 2 определяют ширину высоту. Последние 2 x и y координаты на экране.
  292.  
  293. def find_nemo():
  294. get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
  295. active_window_id=$(xdotool getactivewindow 2>/dev/null)
  296. if [ -n "$active_window_id" ]; then
  297. process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
  298. echo "$process_id_active"
  299. else
  300. echo "0" # Или любое значение по умолчанию, если нет активного окна
  301. fi
  302. exit '''
  303. result1 = subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip()
  304. lines = result1.split('\n') # Разбиваем вывод по новой строке и извлекаем значения
  305. process_id_active = int(lines[0].split(': ')[0])
  306. result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout) # # print(result)
  307. lines = result.split('\n')
  308. for line in lines: #
  309. if 'nemo' in line:
  310. parts = line.split()
  311. pid = int(parts[1])
  312. cmd = ' '.join(parts[10:]).replace(" ", "")
  313. if 'nemo' in cmd and process_id_active==pid:
  314.  
  315. return True
  316. return False
  317. def search_image():
  318. try:
  319. s = f'''#!/bin/bash
  320. xte 'keydown Return' 'keyup Return'
  321. '''
  322. region = (1400, 100, 1500, 900) # Пример области
  323. image_path = 'Search button.png' # Укажите путь к вашему изображению
  324. location = pyautogui.locateOnScreen(image_path, confidence=0.6, region=region) # Проверяем, есть ли изображение на экране
  325. if location and find_nemo(): #
  326. # print("22")
  327. subprocess.call(['bash', '-c', s, '_'])
  328. except:
  329. pass
  330.  
  331. def b(k, user):
  332. while 1:
  333. time.sleep(3)
  334. if check_current_active_window(user):
  335. k.flag_thread = True
  336. else:
  337. k.flag_thread = False # print("fa")
  338.  
  339. thread1 = threading.Thread(target=b, args=(k, user,))
  340. thread1.daemon = True
  341. thread1.start()
  342.  
  343. def replace_word(number, k, old_word, root):
  344. key1=k.get_list()[number]
  345. replacing_words(old_word, key1, root)
  346. # Словарь для перевода английских символов в русские
  347. eng_to_rus = {
  348. 'q': 'й', 'w': 'ц', 'e': 'у', 'r': 'к', 't': 'е', 'y': 'н', 'u': 'г', 'i': 'ш', 'o': 'щ', 'p': 'з',
  349. 'a': 'ф', 's': 'ы', 'd': 'в', 'f': 'а', 'g': 'п', 'h': 'р', 'j': 'о', 'k': 'л', 'l': 'д',
  350. 'z': 'я', 'x': 'ч', 'c': 'с', 'v': 'м', 'b': 'и', 'n': 'т', 'm': 'ь',
  351. 'Q': 'Й', 'W': 'Ц', 'E': 'У', 'R': 'К', 'T': 'Е', 'Y': 'Н', 'U': 'Г', 'I': 'Ш', 'O': 'Щ', 'P': 'З',
  352. 'A': 'Ф', 'S': 'Ы', 'D': 'В', 'F': 'А', 'G': 'П', 'H': 'Р', 'J': 'О', 'K': 'Л', 'L': 'Д',
  353. 'Z': 'Я', 'X': 'Ч', 'C': 'С', 'V': 'М', 'B': 'И', 'N': 'Т', 'M': 'Ь',
  354. '[': 'х', ']': 'ъ', ';': 'ж', "'": 'э', ',': 'б', '.': 'ю',
  355. '{': 'Х', '}': 'Ъ', ':': 'Ж', '"': 'Э', '<': 'Б', '>': 'Ю'
  356. }
  357.  
  358. # Функция для перевода английского символа в русский
  359. def trans(char):
  360. if char in eng_to_rus:
  361. return eng_to_rus[char]
  362. return char # Если символ не найден в словаре, возвращаем его без изменений
  363.  
  364. def on_press(key):#обработчик клави.
  365. key=str(key).replace(" ","").replace("\'","") # print(key)
  366. #key=trans(key)
  367. global timestamp # print(time.time()- timestamp )
  368. try:
  369. if time.time() - timestamp < 0.3 or k.flag_thread==True: # clean_label(root)# удалить подсказки.
  370. root.withdraw() # свернуть панель подсказок.
  371. dela(root) # time.sleep(0.3) print('op[p')
  372. timestamp = time.time() # root.withdraw() # свернуть панель подсказок.
  373. return True
  374. timestamp = time.time()
  375. if "enter" not in key or key != "Key.right" or key !="Key.left"\
  376. or key != "Key.down" or key != "Key.up" or k.flag_thread==True:
  377. f2 = threading.Thread(target=search_image, args=())
  378. f2.daemon = True # Устанавливаем поток как демон
  379. f2.start() # Запускаем поток
  380. if key=='Key.ctrl_l' or key=='Key.shift_l' or key=='.' or key==',' or key=='Key.shift_r'\
  381. or key=='\'\'' or key == "Key.delete" or key =="Key.right" or key =="Key.left"\
  382. or key =="Key.down" or key =="Key.up" or key == "Key.space" or key == "Key.alt_r" \
  383. or key=='\',\'' or key=='\\ 'or key=='/' or key =="Key.caps_lock" or key =="Key.tab" or key == "Key.alt_l"\
  384. or key =="Key.tab" or key =="Key.cmd" or key =="Key.enter" or key =="Key.esc" or key =="Key.f1"\
  385. or key =="Key.f2" or key =="Key.f3" or key =="Key.f4" or key =="Key.f5" or key =="Key.f6" or key =="Key.f7"\
  386. or key =="Key.f8" or key =="Key.f9" or key =="Key.f10" or key =="Key.f11" or key =="Key.f12" or key =="<65032>"\
  387. or key =="Key.alt" or key =="Key.shift" or key =="0" :# print("unkey")
  388. root.withdraw() # свернуть панель подсказок.
  389. dela(root)
  390. return True
  391. if key == "Key.backspace" :# and k.get_swith() == False:
  392. key1 = k.backspace(root)
  393. if len(key1)>0:# print(key1)
  394. filling_in_hints(key1, root) # вывести подсказки.
  395. return True
  396. else:
  397. dela(root)
  398. return True
  399. if key !="<96>" and key !="<97>" and key !="<98>" and key !="<99>" and key !="<100>" and key !="<101>" \
  400. and key !="<102>" and key !="<103>" and key !="<104>" and key !="<105>" and key !="+" and key !="-" \
  401. and key !="*" and key !="/" and key != "Key.num_lock" and key !="Key.page_down"and key != "Key.page_up" \
  402. and key != "Key.end" and key != "Key.home" and key !="Key.insert" and key !='\'/\'' and key !='\'\ \''\
  403. and key !='\'.\''and key !='1' and key !='2' and key !='3' and key !='4' and key !='5' \
  404. and key !='6' and key !="<65437>" and key !="Key.backspace":
  405. if k.get_flag()==True:# подсказки print(key)
  406. show_hints(key, root)# вывести подсказки.
  407. return True
  408.  
  409. old_word=k.return_key()
  410. if key == "1" and k.get_replace()==True and len(k.get_list())>0:
  411. replace_word(0, k, old_word, root)
  412. return True
  413. if key == "2" and k.get_replace()==True and len(k.get_list())>1:
  414. replace_word(1, k, old_word, root)
  415. return True
  416. if key == "3" and k.get_replace()==True and len(k.get_list())>2:
  417. replace_word(2, k, old_word, root)
  418. return True
  419. if key == "4" and k.get_replace()==True and len(k.get_list())>3:
  420. replace_word(3, k, old_word, root)
  421. return True
  422. if key == "<65437>" and k.get_replace()==True and len(k.get_list())>4:
  423. replace_word(4, k, old_word, root)
  424. return True
  425. if key == "6" and k.get_replace()==True and len(k.get_list())>5:
  426. replace_word(5, k, old_word, root)
  427. return True
  428.  
  429. except Exception as ex: # clean_label(root) #
  430. print(ex)
  431. return True
  432. def on_release(key):
  433. pass# Collect events until released
  434. def on_click(x, y, button, pressed):
  435. root.withdraw()# свернуть панель подсказок.
  436. dela(root) # pass
  437. return True
  438. # root.geometry("600x20+590+1025") # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  439. root.overrideredirect(True)
  440. root.resizable(1, 1)
  441. root.attributes("-topmost",True)
  442. root.withdraw()# свернуть панель подсказок.
  443. listener1 =mouse.Listener(on_click=on_click)
  444. listener1.start()
  445. listener = keyboard.Listener( on_press=on_press, on_release=on_release)
  446. listener.start()
  447. root.mainloop()
  448.  
  449. # if key =="ж" and k.get_flag_screenshot():# print("jhn")
  450. # root.withdraw() # свернуть панель подсказок.
  451. # dela(root)
  452. # root.withdraw() # свернуть панель подсказок.
  453. # k.set_flag_screenshot(False)
  454. # load_coordinates_from_json()
  455. # return True
  456. # if key=="Key.ctrl_r":
  457. # k.set_flag_screenshot(True)
  458. # return True
  459. # k.set_flag_screenshot(False)
  460. #
  461.  
  462. # def from_ghbdtn(text):
  463. # layout = dict(zip('''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~''',
  464. # '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё''')
  465. # )
  466. # if text not in layout.keys():
  467. # return text
  468. # res = str(layout[text])
  469. # return res
  470.  
  471. # if key == "Key.end":
  472. # load_coordinates_from_json() # return True
  473. # k.set_flag(False)# флаг записи вводимое слово.
  474. # k.set_swith(True)# откл блок обработчика
  475. # clean_label()# очистка подсказок.
  476. # if key == "Key.shift_r" and k.get_flag()==True:
  477. # # k.set_flag(False)
  478. # # k.set_replace(True)
  479. # return True
  480.  
  481. #
  482. # if key == "<103>" and k.get_replace()==True and len(k.get_list())>6:
  483. # key1 = k.get_list()[6]
  484. # replacing_words(key1)
  485. # return True
  486. # if key != "<105>" and swit==True:
  487. # print(arg[7].get())
  488. # key1=""
  489. #
  490. # if key != "<106>" and swit==True:
  491. # print(arg[8].get())
  492. # key1=""
  493.  
  494.  
  495. # if key == "Key.space" or key =="Key.right"or key =="Key.left" or key =="Key.down" \
  496. # or key == "Key.delete" or key =="Key.up" and k.get_swith() == True:# блокировка обработчика.
  497. #
  498. # print("unblock key")
  499. # k.backspace()
  500. # k.set_flag(True)# флаг записи вводимое слово.
  501. # k.set_swith(False)# откл блок обработчика
  502. # clean_label()# очистка подсказок.
  503. # return True
  504.  
  505. # print("block")
  506. # clean_label()# очистка подсказок.
  507. # swit1=swit1+1 # Блокировать ввод, пока не напишется слово
  508. # print(swit1)
  509. # print(k.get_len())
  510. # if swit1==k.get_len():
  511. # 0 swit1=0
  512. # global swit1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement