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 則留言:

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

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

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

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

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

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

    回覆刪除
  3. 狐狸大大您好
    小弟找到原因,
    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");研磨
    數字鍵,英文鍵 不能{},不然會沒動作

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

    回覆刪除
  5. 狐狸大大
    確認結果是,版本的問題。


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


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

    感謝。

    回覆刪除
  6. 可能是編碼問題, 試試程式以 utf-8 存檔看看

    回覆刪除
  7. 老師您好

    感謝指導

    無塵作業系統 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)

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

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


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

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

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

      刪除
  9. 有兩種設備,設備的傢動程式均是中文漢字+英文
    (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,呈現類似全型字體放大的漢字

    回覆刪除