2018年5月15日 星期二

用 AutoIt 搞定煩人的連線 Timeout 問題

今天花了一個早上的功夫, 終於把公司跳板機連線 Timeout 問題搞定了. 由於資安考量, 跳板機每次連線 40 分鐘就會斷線, 除非在斷線前點一下連線軟體上的延時按鈕, 否則斷線後就得插上識別證重新連線, 非常麻煩, 最後搞到沒人要用.

如果能夠排除連線麻煩的話, 跳板機其實還是蠻好用的, 因為每一個網元都存取得到, 因此上周評鑑前我就請 MIS 幫我重設密碼, 然後在跳板機上配置常用軟體與我的最愛連線, 總的來說除連線問題令人頭疼外我是非常滿意的. 所以上週五評鑑結束當天我就開始琢磨如何搞定這問題, 原先是想用 Python 的 PyAutoGUI 模組來寫個軟體機器人, 但這需要一點時間來學習, 似乎緩不濟急, 所以只好搬出已好幾年沒用的 AutoIt 來救援.

程式如下 :

While 1
  RenewConnection()     ;呼叫連線延時函數
  Sleep(300000)              ;休息 5 分鐘再更新
WEnd

Func RenewConnection()
  Run("C:\Program Files (x86)\SpringBoard\SpringBoard.exe")   ;執行跳板機連線程式
  Local $handle=WinWaitActive("SpringBoard Server Service List", "", 10)   ;激活連線程式
  ControlClick($handle, "", "Button11")     ;按一下延時按鈕
  ControlClick($handle, "", "Button2")       ;按一下最小化按鈕
EndFunc

此程式很簡單, 就是每 5 分鐘呼叫 RenewConnection() 這個函數去按跳板機連線程式的延時按鈕 (名稱為 Button11), 它會將連線逾時回復到最長 40 分鐘; 然後按 "最小化" 按鈕 (名稱為 Button2) 將跳板機最小化. WinWaitActive() 會激活跳板機連線程式, 並傳回此 GUI 程式之 Handler 作為操控程式內控件之參考. 注意, 必須傳入第三參數 timeout 等待視窗激活, 否則可能偶而無作用.

程式經 Compile/Build 編譯成 .exe 檔後測試 OK, 一整天都保持連線, 從此不用再重複插卡-輸入卡片密碼-連線跳板機-輸入跳板機密碼這個耗時 5 分鐘的繁瑣程序了.

自從公司電腦升版為 Win7, 導致原先用 AutoIt 寫的軟體機器人無法執行後, 我改弦易轍學會 WSH, 改成以網頁程式執行自動化作業, 從此 AutoIt 就被我束之高閣, 連正在寫的 AutoIt 實戰書籍也停了下來. AutoIt 多年沒使用忘得快光了, 好在以前有勤奮地寫下操典, 稍微翻閱一下就能恢復功力, 等 Python 弄完再回頭來整理.

下午在搜尋 AutoIt 範例時找到下面這個 Dunk 寫的超棒網站 :

http://dunkkm.blogspot.tw/?view=sidebar

看來是將 AutoIt 用在投資理財自動化的範例, 值得好好參學一番.

11 則留言 :

野雲雁 提到...

跳板機是甚麼?

小狐狸事務所 提到...

跳板機就是從終端連線到目標主機前要先連線的中間伺服器, 是資安要求避免目標主機被攻擊.

野雲雁 提到...

請教您
我目前遇到一個怪問題。欲將設備數多按鈕用AUTOIT編輯成鍵盤熱鍵。
辦公室測試沒有問題Hot key 鍵盤: 英文 數字 F1~12 都可以當熱鍵動作
無塵室放進設備電腦Hot key 鍵盤: 英文 數字 都無法作動。F1~212 可以動作

舉例如下
HotKeySet("{1}", "_2x");2倍顯微鏡

Func _2x();2倍顯微鏡
ControlClick ( "title", "text", controlID)
EndFunc

會是怎樣影響呢?
AUTOIT 版本問題(辦公室與無塵室版本不同)?
辦公室 中文WIN7 無塵室XP?
鍵盤輸入日文版?

有請大打指點方向? 謝謝。

野雲雁 提到...

狐狸大大您好
小弟找到原因,
AutoIt3 - v3.5.4 辦公室版本

HotKeySet("{1}", "_2x");2倍顯微鏡
HotKeySet( "1" , "_2x");2倍顯微鏡
HotKeySet("{e}", "_Lapping");研磨
HotKeySet( "e" , "_Lapping");研磨
有無{}均可正常動作

AutoIt -v3.2.8.1 無塵室版本
HotKeySet( "1" , "_2x");2倍顯微鏡
HotKeySet( "e" , "_Lapping");研磨
數字鍵,英文鍵 不能{},不然會沒動作

小狐狸事務所 提到...

所以是版本問題嗎? AutoIt 我已很久一段時間沒使用了 (都在用 Python)

野雲雁 提到...

狐狸大大
確認結果是,版本的問題。


請教您,
我設備有個視窗 Title 是 '基板判定',WinInfo 讀取確實是 '基板判定',複製貼上程式編輯器,變成 ??? 問號
讓我這是窗內作業所有按鈕,"title" 無法辨識,成為有效控制
ControlClick ( "title", "text", controlID [, button = "left" [, clicks = 1 [, x [, y]]]] )


請問您還有其它方式替代 "title" 嗎?

感謝。

小狐狸事務所 提到...

可能是編碼問題, 試試程式以 utf-8 存檔看看

野雲雁 提到...

老師您好

感謝指導

無塵作業系統 Win2000
安裝的 AutoIt
;AutoIt - v3.2.8.1
;SciTE - v1.71
;Win 2000

該版有 File=>Encoding
8Bit
UCS-2 Big Endian
UCS-2 Little Endian
UTF-8
UTF-8 Cookie

明天,我再選擇 UTF-8 存檔試看看。


關於:
WinInfo 讀取日文漢字(設備稼動主程式為日文介面) '基板判定',複製貼上程式編輯器,變成???亂碼
以致 "title" 無法辨識,成為有效控制。

可以解決(1)~(5),打從一開始寫程式就不想使用座標系(1)~(4)。
(1)MouseClick
(2)MouseClick + WinGetPos
(3)PixelSearch + MouseClick(按鈕有顏色可辨識)
(4)PixelSearch + WinGetPos(按鈕有顏色可辨識)
(5)ControlClick

所以,我另外準備對應 "title" 亂碼。(我在座位是可以動作,實際上機才是真正稼動主程式日文介面)

ControlClick("[Class:#32770]","ALL","[CLASS:Button; INSTANCE:22]")
ControlClick("[Class:#32770]","ALL",4463)
ControlClick("[Class:#32770]","ALL","Button22")

ControlClick("[Class:#32770]","ALL","[CLASS:Button;INSTANCE:22]","Left",4,60,20)
ControlClick("[Class:#32770]","ALL",4463,"Left",1,60,20)
ControlClick("[Class:#32770]","ALL","Button22","Left",1,60,20)

小狐狸事務所 提到...

日文漢字編碼也是要用 unicode 才行, 最好不要用座標, 程式移到其他解析度螢幕時會跑掉.

野雲雁 提到...

有兩種設備,設備的傢動程式均是中文漢字+英文
(1)無塵作業系統 Win2000
安裝的 AutoIt
;AutoIt - v3.2.8.1
;SciTE - v1.71

UTF-8 取得中文漢字當作title會呈現亂碼

(2)無塵作業系統 Win7
安裝的 AutoIt
;AutoIt - v3.2.8.1
;SciTE - v1.71

UTF-8 取得中文漢字當作title,呈現類似全型字體放大的漢字

野雲雁 提到...

若真使用座標(表示投降)
那就每使用一行座標前加行
Opt(“MouseCoordMode”,2)


下週一,
ControlFouse("[Class:#32770]",OK,"Button2");Fous 住中文漢字室窗屬性資訊
ControlClick("[Class:#32770]","OK","Button2“);ControlClick,OK button按扭

如果,我在辦公室模擬沒問題,在現場設備應該也是吧!

這樣方法,就不用座標方法。