非同步、交互式程式編寫工具 (sikuli、expect)

非同步、交互式程式編寫工具 (sikuli、expect)

先前發布的相見恨晚自動化測試工具 sikuli,可以用圖案去編寫程式流程,適用於自動化測試、一鍵執行程式及指令。
用 sikuli 編寫程式是很特別的體驗,概念上來說在程式流程裡,因為無法預期下一個作業或圖案的出現時間,常會有 wait 的情形,
這樣非同步的訊息傳遞、接收、執行,在這工具上變得很自然。

這次在 unix 系統上透過 expect 自動連上 bbs,透過 expect 自動收集想要的資料,並經由 log file 取回資料,再做進一步的資料整理。

expect 讓我有一種既視感,啊~就是 sikuli 呀!
寫程式流程時的體驗相近,sikuli 流程控制時,當發現某個圖形就去點擊另一個圖形。
expect 流程控制時,當發現某段文字就輸入你要的文字。
wait then action,又是個不可多得的好工具。

expect 是用 Tcl 語法 (筆者也是第一次看到 Tcl),expect 相關資料很少,不過還是有找到比較完整的語法書。
Welcome to the Tclers Wiki!  





這次以 expect 為主體完成的練習題,自動登入 ptt、查詢某位網友的動態、上線時間、ip等資料,再進行資料整理。
條列中間遇到的一些問題
1. 編碼問題: ptt 是 BIG5 編碼,ubuntu shell 預設是 UTF-8 編碼,所以會出現有亂碼的問題。
解決方法是透過 iconv -f UTF-8 -t BIG5 file_name -o output_file_name  (將 UTF-8 轉成 BIG5)
如果遇到錯誤訊息, iconv: 位置 xxxx 有不合法的輸入序列,可能是語系的問題,locale LANG 設成 BIG5 就可以了。

範例:
[osboxes@osboxes log]$ locale
LANG=zh_TW.UTF-8
LANGUAGE=zh_TW:en_GB:en
LC_CTYPE="zh_TW.UTF-8"
LC_NUMERIC=zh_TW.UTF-8
LC_TIME=zh_TW.UTF-8
LC_COLLATE="zh_TW.UTF-8"
LC_MONETARY=zh_TW.UTF-8
LC_MESSAGES="zh_TW.UTF-8"
LC_PAPER=zh_TW.UTF-8
LC_NAME=zh_TW.UTF-8
LC_ADDRESS=zh_TW.UTF-8
LC_TELEPHONE=zh_TW.UTF-8
LC_MEASUREMENT=zh_TW.UTF-8
LC_IDENTIFICATION=zh_TW.UTF-8
LC_ALL=

下個指令就好了 (這問題整死我了)
LANG=zh_TW.BIG5

2. expect 是遇到某段文字就輸出某段指令的寫作方式,大部分這些文字會出現在輸入框之前,很容易發生輸入框還沒出現,指令就送出去的狀況。
解決方法是 sleep(1) (單位是秒)   

最後,為了達到自動執行、自動登入 ptt、自動輸入帳號密碼、自動執行相關查詢步驟、自動資料整理,這次把會的工具、不會但聽過的工具都用上了。
linux shell 包裝整個自動化作業及將 expect 輸出的資料擷取需要的部份。
linux crontab 排程達到自動執行功能。
expect 達到自動登入、帳密輸入、查詢網友資料。
python 將收集的資料做進一步的篩選及輸出。

最後的結果還算滿意,將收集的資料排列出來,可以得到一些很私人的資訊。
透過 ip 可以推出網友的部份行蹤、透過上次上站時間可以推出網友的作息時間、透過動態可以關注網友上站的行為。
至於會不會有個資法的問題,請自行斟酌,只能說現今的網路社會,很容易在不知不覺中洩漏出一些祕密。
解決之道就是不要用網路、當個原始人。

留言

這個網誌中的熱門文章

相見恨晚的自動化測試開發工具 Sikuli

[IIS] 自我簽署憑證來啟用SSL

台北市安心地圖