Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

[DEVELOP]PYTHON 桌機版開發之(7)圓滿結束

Posted onAug 25, 2018

好啦~

經過一番寒徹骨

焉得咳咳

經過了不知許久上一篇文章

這篇,我是來發說

我已經把我的 PYTHON 桌機加分程式寫好了

也實際實作於資料結構班 6 次測驗

然後藉由他收集到的資料玩成了我的碩士論文

最後我的程式架構長這樣

31

然後,很陽春的加分系統

32

停留在這個畫面,就開始側錄學生的資料囉!!!

33

鍵盤側錄錄到的訊息

34

最後截取歷史留欄記錄輸出成 CSV

35

回傳自 dJango 後台

36


其實我原本以為可以很順利

結果我們老師沒有給我太多時間準備

隔天就要馬上裝機給學生測

但是那天教室滿檔

眼看隔天要測,今天教室沒有一堂空堂

覺得很無助還特地躲起來哭了一番

結果兩個小學弟幫我說服了朋友跟老師們

讓我可以在晚上考試於教室中裝我的軟體

剛裝的時候發現歷史瀏覽的功能失靈

跳出錯誤,我整個人簡直慌張,一堆失敗的念頭網自己腦中通過

後來兩位學弟尋找出問題才發現其實一直是歷史瀏覽子系統的問題

以下就針對整個源頭作一下介紹


首先

煩請各位工程師,無論是作專題,開發小程式

不管你的軟體建在本地端/硬碟裡/雲端(我現在比較相信雲端)/自架伺服器

都記得每作一些更動就要存一版,除了保護備份以外,萬一新的寫錯還可以往前看之前對的程式碼。

因為我這次開發時有發生過意外,所以那次意外後我特別在我的雲端備份好幾次

輩分


最初始的狀況是這個樣子的

我們學弟妹分兩組專題做了六個子系統

我就圖文並茂來解釋一下

Untitled Diagram

起初規劃就漲這個樣子,總共五個子系統。

想要做一個根據學生行為來判斷分數的加分獎勵系統

正面一點說的就是當初還想做有獎勵,像是送小禮/虛擬幣的獎賞,讓喜歡玩遊戲的學生們,會想要加分而練習程式。

一開始老師是希望專題生做這個,然後給我拿去做實驗,學大數據分析。

可是後來兩組專題生除了本來就溝通不量外,其中一組三人,只有一個人在做(最後那位學弟就炸掉)

所以後來變成我獨自開發這個系統,結果之後的數據分析由於時間不夠,就只能人工閱卷。

之後,兩組專題生就開始瓜分子系統來開發

Untitled Diagram (1)

左邊部分僅僅只有一人開發,使用 Python+OpenCV

右邊部分主要使用 C++做鍵盤偵測,滑鼠追蹤後來直接取消掉

兩個部分語言不同,學弟妹交接也沒有跟我說得很清楚,一開始我接手的時候要整合我覺得頭非常痛。

其時我從專題生剛開始開發我就坐在旁邊了

我覺得最大的問題點出在於

沒有任何的溝通,因為男生很害羞,甚麼事都悶在心裡

另外一邊又是兩位女生,他們也不知道該如何做交流。

一般我自己開發,我都是時常會跟旁邊的幾個學弟妹工程師一起討論

尤其是開發功能/協調 BUG 之類的

最後我接手的檔案如下圖:

Untitled Diagram (2)

左邊部分用大量 py 檔及資料夾分割

右邊的話就是幾個 cpp(c++檔)跟一堆我看不懂的檔案 QQ


最後我只用兩個 .py 檔結束我的程式

最後開發就變成這樣

我把臉部辨識跟滑鼠拿掉

31

程式碼目錄

ADDP
   UR
      UR.py
   Main.pyw

將所有的介面寫在一個 Main.pyw

加上把鍵盤側錄寫進 Main.pyw

本來是想挑戰直接一個 Main.pyw 包全部

後來我發現,我用學弟寫的歷史擷取 UR.py 檔會報錯

Main.pyw 用 3.6 版 python 寫的

學弟的歷史擷取是一年前寫的,他用 2.7 版本寫

研究後才發現 2.7 > 3.6 有編碼改變的問題

我將歷史擷取的程式 UR.py (python 2.7)的程式碼寫入主頁面 Main.pyw (python 3.6) 會一直報 CP950/big-5 的錯誤。

再加上,經過很多次嘗試後我發現學弟寫的歷史擷取,不能在 win 7 使用...

還好測試環境都是 win10

所以我只好在介面上寫只能用 win10 XDDDD

最後我將程式碼貼上來

歷史擷取程式碼 UR.py

import os,sys
from shutil import copyfile
import csv, sqlite3
from datetime import datetime, timedelta

def historycopy():
    copyfile(os.getenv("APPDATA") + '\..\Local\Google\Chrome\User Data\Default\history', os.getenv("APPDATA") + '\..\history1')

def historycatch():
    connection = sqlite3.connect(os.getenv("APPDATA") + "\..\history1")
    connection.text_factory = str
    cur = connection.cursor()
    output_file = open('chrome_history.csv', 'wb')
    csv_writer = csv.writer(output_file)
    headers = ('URL', 'Title', 'Visit Count', 'Date (GMT)')
    csv_writer.writerow(headers)
    epoch = datetime(1601, 1, 1)
    for row in (cur.execute('select url, title, visit_count, last_visit_time from urls')):
        row = list(row)
        url_time = epoch + timedelta(microseconds=row[3])
        row[3] = url_time
        csv_writer.writerow(row)

def readcatch():
    with open('chrome_history.csv') as fs:
        lastN=list(fs)[-50:]
    file=open('filter.pickle','w')
    file.write(','.join(str(num)for num in lastN))
    file.write('\n')
    file.close()



historycopy()
historycatch()
readcatch()

sys.exit()
  • 作業系統: windows 10
  • 使用 python 2.7, 用 3 以上會報錯
  • 有些電腦 chrome 的歷史紀錄資料夾存取不同,要去找,要改"copyfile"那行

主程式與鍵盤側錄 Main.pyw

我只將有用到的函式庫寫出來

.之後有時間在開啟我的 github 輸入我的程式 QQ

# -*- coding: utf-8 -*-

from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter.ttk import *
import os
import sys
import requests
from tkinter import messagebox
from pynput import keyboard
from pathlib import Path
import win32clipboard
import signal,os,sys
import threading
from threading import Thread
import datetime,time

鍵盤側錄主要用到

win32clipboard

將 Ctrl 定義為例外按鍵

def ctrl(a,b):
    pass

因為 Ctrl 是大多數被設為系統關閉的按鍵

也就是說我們想要側錄複製的動作 Ctrl+c 會造成程式自己關閉

因為 ctrl+c 本身也是關系統的指令

最後程式跑完,記得要在內部程式碼下一個將程式關閉的指令,不然已經將 ctrl 設為例外,怎麼狂按 ctrl 程式都不會自己關閉,鍵盤側錄就會一直在背景跑,跑到你發現你電腦變得很慢 XD


再來我要記錄一下,用 django 作為收發

也蠻新奇,後來才發現可以透過 HTTP 來發送請求跟 django 端做接收

也是老師跟我說 RESTful 的架構

Django 端的部分我也就不貼了

沒有 template 這一塊

創一個 model 的 database 設幾個欄位

然後使用 view 跟 url

我設了一個 url

所以電腦程式端就傳送到

http://120.xxx.xxx.xxx/upload/

伺服器端接到來自電腦端的訊息,會做動作然後傳回後台與資料庫

這個動作在 view 寫

所以用 HTTP get/post/.. 作收發

在電腦端先將學號(text),側錄到的鍵盤資料(txt)及歷史瀏覽(csv),轉為一串參數

{student_id: ... ; keyboard: ...txt ; history: ...csv}..

類似這樣的參數,送到伺服器端

在請伺服器端分別將這三個參數分割成三個部分存在我的資料庫裡

起初我還不是很懂 RESTful 的架構用法

想說電腦端的軟體程式可以直接跟伺服器網頁作連結?

不過事後想想也是笨笨

不然那些掃毒軟體及其他線上軟體是要怎麼傳資訊到網路 xD

這也讓我了解客戶端及伺服器端還有 RESTful 架構用法

電腦端 >> 寫成參數 >> 傳到 ..../upload/ >> HTTP 伺服器端接收 >> view 中的處理程序 >> 傳回後台資料庫

大概就是這樣


以上就是我整個加分程式的始到終

也是我碩士論文的主要程式

感言喔

在我還沒寫這個程式之前,我其實是不會 python 的

就算之前有用過 django

但也是半個碼農,抄抄抄,貼貼貼

直到開發這個程式後我才發現 python 的好玩,也才了解真正的程式邏輯

在碩士兩年半,起初下定決心要苦學程式的心

總算在碩士快畢業時,有了一個初步基礎的了解

未來還想成為 junior 工程師 及 邁向 senior 工程師。

資訊科技永遠是挖掘不完的深井,尤其他的主體是邏輯

讓我覺得很新奇又有趣。

這不負責任的開發過程跟心得

從去年 2017.6 月就開始

今年 2 月接手,4 月才開始開發

歷經約兩個月,5 月 22 日開發完成

中間非常害怕延畢,所以壓力神大,現在回頭看覺得,雖然當初真的壓力頗大

但我還是很沉浸跟懷念之前天天寫程式,天天學習新事物的日子

不過下次還是別這麼趕了 QQ