Comp sec: Act 9
unknown
python
4 years ago
3.9 kB
7
Indexable
import time import threading import pandas as pd from pynput.keyboard import Key, KeyCode, Listener from sklearn.neighbors import KNeighborsClassifier REFRESH_RATE = 24 class Main: def __init__(self): self.mem: list[tuple[str, float]] = [] self.index: int = 0 self.word: str = "" self.word_len: int = 0 self.run = False self.div = True def loop(self): count = 0 while self.run: time.sleep(1/REFRESH_RATE) self.div = count < REFRESH_RATE//2 if count == REFRESH_RATE: count = 0 self.display() count += 1 def start(self, word): self.mem = [] self.index = 0 self.word = word self.word_len = len(word) self.run = True t = threading.Thread(target=self.loop) t.start() start = time.perf_counter() with Listener(on_press=self.pressed, on_release=self.released) as detector: self.cls() print(word) print() self.cls() detector.join() t.join() return [(*x[:-1], round(x[-1]-start, 7)) for x in self.mem] def register_char(self, char: str): if self.index < self.word_len and self.word[self.index] == char: prev_char = self.word[self.index - 1] if self.index - 1 >= 0 else "" self.mem.append((prev_char, char, time.perf_counter())) self.index+=1 def display(self): self.cls() print(self.word) print("".join([x[1] for x in self.mem]) + ("|" if self.div and self.run else "" ), flush=True, end='\b\n') def pressed(self, key: KeyCode): try: if key == Key.space: self.register_char(" ") elif key == Key.enter: self.run = self.index < self.word_len else: char = key.char self.register_char(char) self.display() except AttributeError: pass def released(self, key): if key == Key.esc or not self.run: self.run = False return False def cls(self): print("\033[H\033[J", end="") WORDS = ["test", "peem"] def generate_dataset(profile): return [ stat for stat_list in [Main().start(word) for word in WORDS] for stat in [ (*x[:-1], x[-1]-stat_list[idx-1 if idx else 0][-1], profile) for idx, x in enumerate(stat_list) ] ] def start_profile(profile): return generate_dataset(profile) , generate_dataset(profile) def dataset_to_csv(data, name): print(data , name) pd.DataFrame( data = data, columns=['prev_char', 'current_char', 'time_used', 'profile'] ).to_csv(name) if __name__ == "__main__": print("PLEASE START PROFILE 0") time.sleep(3) train0, test0 = start_profile(0) REFRESH_RATE = 1 print("PLEASE START PROFILE 1") time.sleep(3) REFRESH_RATE = 24 train1, test1 = start_profile(1) dataset_to_csv(train0 + train1, "train.csv") dataset_to_csv(test0 + test1, "test.csv") df = pd.read_csv('train.csv') df = df[['time_used', 'profile']].groupby('profile')\ .apply(lambda x: x.time_used.values.tolist())\ .to_frame("list")\ .reset_index() X = df["list"].values.tolist() y = df["profile"].values.tolist() model = KNeighborsClassifier(n_neighbors=1).fit(X, y) df = pd.read_csv('test.csv') for profile in set(df.profile.values.tolist()): print(model.predict([df[df.profile == profile].time_used.tolist()])) for i in range(len(WORDS)+1): input()
Editor is loading...