Comp sec: Act 9
unknown
python
4 years ago
3.9 kB
10
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...