Blog Cover Image

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

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

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

Posted on

好啦~

經過一番寒徹骨

焉得咳咳

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

這篇,我是來發說

我已經把我的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