2020年4月26日 星期日

如何用 Sikuli 來將重複性的工作自動化,讓省下來的時間從事更有生產力的工作並提升生活品質。


Sikuli 介紹 

Sikuli 曾因是由在麻省理工學院的台灣學生所開發,且其可用圖像編寫程式的特色而名噪一時,Sikuli 後來被轉至克羅拉多大學,最後將它釋放出來,現由Rainmen維護,並且持續開發v2版本,現 Sikulix 的官方資訊網站如下:


Sikuli 可在Windows、Mac、某些Linux / Unix、VNC、甚至是 Android 下運行,使用OpenCV提供的圖像識別功能,來識別畫面上特定圖像,並編寫程式進行特定操作,除此之外其還有 OCR 的功能,提供在指定圖像中,進行文字識別的功能,此功能由 Tesseract支持,不過其中文辦識能力不佳。但以上功能讓 Sikuli 在我們可以在無法改動程式或網站上執行,這非常方便。

Sikuli 採用 Python 2.7版語法,其基底事實上是 Jython支持,也就是說 Sikuli 最底層事實上是 Java,因此其也支援了 Ruby (由JRuby支持)及 JavaScript(由 Java Scripting Engine 支持),另也支援  RobotFramework 腳本執行,一般來說,Sikuli 可用在以下用途:


  • 自動測試:測試所寫的網站或程式,可否正常且穩定的執行,這多半為程式或網站開發時所用,先前曾因網站需大量上傳圖像,為測試網站在大量上傳時的穩定性,用 SikuliX 同時用多台電腦操作上傳網站,測試穩定性。
  • 玩遊戲:也就是常說的開外掛,掛機自動執行。
  • 重複輸入或操作的應用程式或網頁:這也就是最近挺流行的 robotic process automation (RPA) ,在使用情境上,使用在對網站或應用程式無法修改為適用目前工作,或修改成本很高的情況下,例如: 網站需要輸入大量資料,且無提供整筆匯入功能,也無修改網站權限或能力時,這時可用 Sikuli 模擬人工操作的方式,將資料輸入。也可以用於線上搶票、搶訂閱、搶選課等用途(這有點偏了)。

Sikuli 安裝與執行

Sikuli 的安裝在這提目前這常用到的環境 WIndow 下的安裝,前面有說到 Sikuli 最底層是 Java ,所最開始要確認目前所用的 WIndow 系統下有無安裝 Java ,且因現 Oracle 有修改了Java 的授權,所以現在可能用 OpenJDK 會較好一點,再來就是要安裝 Jython ,不過不是去 Jython 官網下載安裝,而是要去下載  SikuliX 下載頁所附下列 Jython 解釋器,並與 SIkuliX 的 Jar放在同一目錄下,就如同我在在 WIN 10 下執行 SikuliX 2.0.X 版所說明的一樣,執行時在命令列模式下,於放置 SikuliX Jar 檔目錄下鍵入如下指令:

java -jar sikulix-2.0.X.jar
執行成功畫面如下:


Sikuli 的操作

在 Sikuli 最基本的函式是 find,是用來尋找在螢幕上我們所指定的圖形,舉個例子,假設我們現在想要開啟我的電腦,可以鍵入如下畫面語法:
其中我的電腦圖示,只要選左上螢幕截圖功能即可截取,當用 find 找到圖形後,我們可用dobuleClick 來模擬連按兩滑鼠左鍵的動作,鍵入上面程式碼後,按右上執行圖示,即可看到執行結果,但因執行速度太快,我們可能會看不清滑鼠的動作,這時可用慢動作執行方式來看看執行的過程。
另外截圖的部分也可做進一步的設定,只要滑鼠擊點圖示二下,即可進入設定畫面,畫面如下,第一畫面為截圖所放的路徑及檔名。


第二個畫面為顯示,所截的圖與現在螢幕畫面比對時,是否可正確找到我們所要的截圖,如下圖所示,紅色框表示所找到的截圖位置,由下圖來看有找到正確的位置,畫面下方可設定辨識度,預設為 0.7(70%),如果辦識的準確度可拉高設定值,但拉高設定值,也會造成失敗率增加,且就經驗來說,如果70%辨識度無法捉到正確的截圖的話,那就表示你所選的截圖是辦識度不夠高,不夠獨特,需要重新詢找截圖。


第三個畫面可讓我們設定找到截圖後,滑鼠焦點偏移的位置,Sikuli 預設找到截圖後滑鼠的焦點為截圖的正中心,但有時因為我們想要取的位置,辦識度不高,所以只好捉附近辦識度高的截圖,在捉到後設定偏移到我們要取的位置,在這畫面我們可以直接用滑鼠點我們所要的偏移位置,下方會顯示偏移量,在本例我們取偏移到資源回收桶的位置,取好後按下方 Apply 鍵即可設定完成。


Sikuli 其他可用函式,請參照 Sikuli 文檔 以及 Python 。

Sikuli 使用技巧

由前面的介紹我們可知道 ,Sikuli 以圖形辦識為核心,以Python(事實上為 Jython) 語法撰寫程式,因此在使用上有下面的注意事項:
  • 截圖的選擇並須符合下列幾個要點:
  1. 獨特性要高、要夠明顯(對比高),要為螢幕上唯一的圖示,例如在 Window 上資源回收桶的圖示,其多半為桌面上唯一的圖示,且夠明顯。像有些網頁其按鍵的圖示和背景一樣為淺灰色,其按鍵的框又為透明,這種狀況就很容易造成辦識度低,這時可能就要採取前一節所講的方法,取其他明顯的截圖,在偏移過去。
  2. 尺寸最好固定不變,雖然 Sikuli 辦識度設定為 70%,已有緩衝,但像是突然改變畫面解析度,或在看網頁時放大縮小畫面,皆會造成截圖尺寸的變化而造成失敗,不過通常用慣的畫面解析度不常會改變,網頁縮放設定在100%就可避免上述問題。
  3. 要不被其他程式遮蓋,像前面所提的資源回收桶圖示,就存在易被化程式遮蓋,這種情行可改用不易被其他程式遮蓋的圖示,在 Window 上工作列的圖示就不易被其他程式遮蓋,例如 Window 鍵。另一種作法是在執行辦識前把所有視窗縮到最小或關閉,避免遮到圖示。
  4. 採用偏移的方式時,所選的截圖和我們所要的位置偏移量需要固定不變,且偏移量不要太大,否則失敗率會增加,通常就近選擇載圖是較好的選擇。
以下為示範截圖如取不好,辦識度不佳的結果,由下圖我們可看到,我們選擇的截圖有不夠獨特明顯的問題,所以 Sikuli 的辦識結果就不好,找到了20多個相似的截圖,這是在使用上要避免的問題。

  • 不要所有的步驟都用截圖方式來執行,前面提到,Sikuli 辦識度設定為70%,還是有一定的失敗率,建議用 Sikuli 取得所要執行程式或網頁的焦點後,在程式或網頁執行用模擬鍵盤輸入的方式處理,像是用 type(key.TAB) 模擬鍵盤 TAB 鍵切換輸入欄位焦點,用 key("input message") 或 paste("要輸入的訊息"),來模擬輸入訊息,以提高正確率。
  • 雖然 Python 支援 Unicode ,但在 WIndow 上中文處理的問題,分兩個層面說明。
    1. 如果是要模疑鍵盤輸入,要輸入中文時,不能使用type(), 而需使用paste(), 且中文必需使用unicode("中文","utf8")做轉換,整個函式會變為 paste(unicode("中文","utf8")),即可正常使用。
    2. 如果在程式中要讀入含中文的 csv 檔時,在Windows需先用 Notepad++ 將 csv 檔的編碼轉為 UTF-8 ,讀入後在用 unicode 函式輸出,以下為範例程式碼。
import codecs
data = open("test.csv").read()
if data[:3] == codecs.BOM_UTF8:
    data = data[3:];
for row in data:
    paste(unicode(row[1],"utf-8"));
    
  • Sikuli 雖用採用 Python 2.7 語法,但其實是用 Jython,故還是跟 Python 有些許不同,故如要用 Python 套件需事先測試,但就以正常來說,直接用 Python(Jython)預設的套件是較好的選擇。 

Sikuli 的限制

Sikuli 的限制基本上就是由其賣點圖形辦識所引起的,在前面 Sikuli 使用技巧所提截圖尺寸的變化易而造成失敗,在單台電腦上可以用固定螢幕解析度設定來達成,但如要移植到其他台電腦上執行,就常常要在每一台上重新截圖,才可正常執行,這就造成了,作業上額外的負擔,也無法提供與一般人使用,我相信這也是 Sikuli 無法普及的一個主要原因,其應用範圍被限制於自動測試或單機 RPA。
另外新版的 Sikuli 雖然提供 OCR (文字辦識)的功能,不過其中文辦識能力不佳,仍有待進一步的改進。

結語

上面簡單介紹 Sikuli ,雖然其使用上有諸多限制,但在辦公室自動化上仍有用途,可以將重複性的作業自動化,節省工作的時間,如對 Sikuli 的應用有興趣,除可參見上面所提的官方網站外,也可參考這篇文章,做更進一步的暸解。

2020年4月20日 星期一

[讀書心得]師父

師父這本書是作者在自身創業及輔導他人創業的經驗總和下所寫出的一本書,範圍涵蓋創業起始到企業發展的選擇,以及由財務到企業文化的建立,很有趣的事情是,作者在財務上強調毛利率及現金流量的重要性,也是在投資股票時,篩選的重要標的,可見這二項因子在企業經營上的重要性。在事業上,作者也強調,要找出自已所從事的行業到底是什麼行業,也就是說要從不同的角度重新審視自已的事業,找出事業利基,像是作者所從事的倉儲業,原本作者已傳統的服務業角度是看待,後來重新定義為不動產業,也就是將倉庫空間租給客戶,從而想出於離客戶近的地方,找挑高倉庫以劃分較多儲位壓低單一儲位成本的方式,來提供客戶地點好,儲位價格又合理的服務,以維持一定的毛利率,並避免其他同業的競爭,這也有點像是護城河的概念。本書我想除了可供有創業意願的人作為參考用書外,對於從事投資的人,也有相當的參考價值,是很不錯一本書。

作者一在強調

[Python,Sikuli] 如何得到今日的日期及現在的時間

Sikuli 適用 Python 2.7 語法,故針對日期及時間的使用上,可以直接套用 Python提供的套件,基本上常用的有 time 及 datetime 兩個套件,在使用前要先引入。

import datetime,time;
在本次個人使用的情境,是想找出今日的日期的月、日、時間,還有星期幾, 好做後面的處理,可用以下語法得到:
nowtime=datetime.datetime.now();
print "Now:",nowtime;
print "Year:",nowtime.year;
print "Month:",nowtime.month;
print "Day:",nowtime.day;
print "Hour:",nowtime.hour;
print "Minute:",nowtime.minute;
print "Second:",nowtime.second;
print "Weekday:",nowtime.weekday();
print "Weekday:",nowtime.isoweekday();
print "Weekday:",nowtime.strftime("%A");

執行的結果如下:
Now: 2020-04-20 04:54:41.251945
Year: 2020
Month: 4
Day: 20
Hour: 4
Minute: 54
Second: 41
Weekday: 0
Weekday: 1
Weekday: Monday
這裡可以看到星期,如果用 isoweekday 呼叫,星期一會顯示為1 ,如用 weekday 星期一會顯示為 0,也可以用 sttftime 格式化輸出 Monday。如想看線上執行結果可參考下面連結:

請點我


2020年4月16日 星期四

如何設定行動版 Blogger

最近在 Google 的 Search console 的行動裝置相容性測試,一直 會出現警告訊息,如下面所示:



主要顯示3個問題 :

  1. 未將可視區域設為「device-width」
  2. 文字太小,不易閱讀
  3. 可點選的元素之間距離太近
結果我真的就是一個一個網頁針對上面的問題去做修正,例如第一個問題,我參考了Responsive Web Design 基礎 : 設定,在好幾篇文章設定如下語法:



結果設完後 Blogger 直接把上面語法拿掉,讓人摸不著頭序(各位可以試試看,在 Blogger 貼上此語法儲存文章, Blogger 會自動把此文字刪除)。第二個問題,就一直調到文字大小到最大,結果還是顯示文字太小。到後來才發現,原來 Blogger 有提供行動版選項,直接到 Blogger 後台主題,於右上角進階設定選擇,行動裝置設定選項,如下圖所示 :


 此時會跳出畫面供我們選擇所要的行動版主題,選好後右手邊會有一個 2D Code,供我們確掃描在手機上確認。



下面為在手機確認畫面,如果覺得沒問題,就在上面畫面選擇儲存,就設定完成了。



這時在到 Search console 的行動裝置相容性測試,測試結果即為正常,如下圖所示 :

事實上,Blogger 在處理行動版網頁跟視窗版網頁時,設定是不一樣的,視窗版網址如下:
https://ghl0506.blogspot.com/2013/01/blog-post.html

 https://ghl0506.blogspot.com/2013/01/blog-post.html?m=0
行動版網址則為以下網址:
 https://ghl0506.blogspot.com/2013/01/blog-post.html?m=1
差別就在於 ?m=0 ?m=1 的設定,在行動裝置觀看時,Blogger 會引導到 ?m=1 結尾的網址。

2020年4月12日 星期日

如何將 Gmail 會話群組的電子郵件一次下載完成

在 Gmail 中如果我們想要將部分電子郵件下載下來作為佐證或是備份,我後可以點入電子郵件後,選擇下載郵件的選項,如下圖所示。


但是如果我們想要將完整會話群組,一次下載下來要怎麼辦?總不成要一件一件的電子郵件下載吧。事實上,可以用下列 二種方法:

  • 使用 Gmail 以附件形式轉寄的功能轉寄所要下載的電子郵件後,再以附件下載形式將電子郵件下載,步驟如下:
    • 首先要將會話群組的功能取消,否則將無法選取所有的該群組的所有電子郵件。
    • 用搜尋功能找到該群組的所有電子郵件,最簡單的作法就是用主旨來搜尋,並對找到的該群組電子郵件選取。
    • 按滑鼠右鍵跳出快選選單,選擇以附件形式轉寄。
    • 這時會開啟一個信件草稿,我們可以看到,剛才所選的電子郵件,現在都以附件形式,附在信件草稿內。
    • 這時的電子郵件已經可以下載了,但只能一個一個下載,如果附件多了一個一個點太麻煩,這時只要把信件寄給自已,利用 Gmail 提供的下載所有附件的功即可將所有電子郵件一次下載下來。





  • 上述這方法可以下載完整的電子郵件,包含其附件。但如果目標是著重在電子郵件的內文內容,而且想將其一次轉出來時,這方法就不適用,要採用下面第二個方法。
    • 打開對話群組選擇右上角的列印功能。
    • 在列印時選擇儲存成PDF,這時就可以將電子郵件轉存成PDF檔。
















第二個方法的缺點就是電子郵件的附件內容無法一併顯示,但可以將其內容一次輸出。我們可以視需要的情境,選擇所要適用的方法。

2020年4月9日 星期四

特別的瀏覽網址

近來觀看網站後台流量統計,發現有下列二個特別網址:

android-app://com.google.android.googlequicksearchbox/https/www.google.com

http://10.0.65.52:15871/cgi-bin/blockOptions.cgi?ws-session=-711527042

經查詢發現,第一個 com.google.android.googlequicksearchbox 為 Android 上 的 Google app ,如用以下網址,就會出現 Google APP。

https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox






另一個網址 blockOptions,則為 網站被某一家公司/機關/學校的 Websense 內容過濾器,阻止其使用者訪問網站的訊息,也不知我寫了什麼,會被攔???

[Excel]如何創建自定義函數

在 Excel 內建函式中找不到自已想要的函式怎麼辦?事實上我們可以自已建一個,以下是一個簡單的Excel自定義函數示例,用於將民國年轉為西元: Function 民國轉西元(x As Double) As Double     民國轉西元 = x + 1911 End Func...