2014年8月12日 星期二

iMacros進階篇

我在之前的「讓您的瀏覽器也能自動工作」文章中曾經介紹了iMacros,這是一種瀏覽器的外掛程式,提供適用於瀏覽器的巨集程式的功能,讓您可以透過錄製或者自行編寫巨集的方式讓瀏覽器也能夠自動工作,官方網站上iMacros建議可應用於以下的情景:
表單填寫和密碼管理
您可以將常用的輸帳號密碼步驟錄製下來,往後便可不需要重複進行此步驟便可自動登入;另外一個非常好用的方式是,當您的朋友需要登入,但您又不想將密碼讓他知道,在錄製時,您可以設定將密碼部份加密,再將錄製的檔案給他執行就可以了,如此一來,您就可以讓他可以登入但無法獲知密碼內容。
自動下載和上傳
您可以透過iMacros自動進行重複性的檔案上傳或下載的動作。
資料獲取,網頁抓取/開採和企業資料重組
這部份是iMacros最強大也是最廣為應用的功能之一,您可以自行修改iMacros成為強大的網路蜘蛛或機器人,替您抓取Internet上的資料轉化為有用的資訊。
網頁測試
網頁相關工作者可以使用iMacros對網頁進行各項自動化的測試。內建的中斷點查看命令可以精確的捕捉網頁反應時間,iMacros也可以支援許多AJAX元素,只要錄製好步驟程序,便可以各個不同的瀏覽器版本上執行並查看其效果。
遠端執行
和版的iMacros提供雲端的功能,讓您可在任何有網路及瀏覽器支援的地方就可以執行之前所錄製的巨集程式。
雖然iMacros這套軟體的基本版是免費的,但是它只能單純的錄製及修改程式而已,需升級到進階版才有提供更多像是與其它程式溝通整合的功能;在一般的需求下,或許我們只需要錄製便可達到使用目的,但在「資料獲取,網頁抓取/開採和企業資料重組」這個一般企業經常會使用到的功能上,若不考慮購買商業版,就只能透過本文所介紹的動態產生方式才能達成,故本文的重點在於介紹如何利用免費版本就可以擁有或開發出媲美進階版本的程式與應用。

靜態與動態

    我們錄製出來的iMacros巨集,它的巨集內容是固定不變的,因此只能重複性的進行相同的步驟,無法根據外在環境變化而改變下一個行為步驟,我們可以稱它是靜態的巨集。
如上圖,靜態巨集必須根據不同的狀況製作不同的巨集。
如果您的要求的行為很單純,比如每天固定抓取某個網站的前幾筆資料、按時去點擊某個固定區域或Button、或者自動張貼文章傳送檔案,這些動作我們用靜態的巨集就可以應付了,但如果有一天,您的需求是要依據前一天的最熱門的新聞主題,並依其關鍵字下載相關的新聞內容儲存到資料庫中,或者說,您有一個資料表,裏面有各項隨時會變動的資料,您希望能夠抓取資料表的內容並自動填寫在網頁表格中傳送出去,那麼,您會發現這種靜態的巨集無法滿足需求,我們需要能夠因應不同的狀況動態的產生相對應巨集內容的程式才行。
    由於我們需要依據不同的狀況來執行對應的巨集程式,因此,如果我們事先製作一個可動態產生巨集的程式,讓它依據不同的需求產生相對應的巨集,就可以滿足這類的需求狀況:

如何產生動態巨集?

    這部份就是本篇文章的精華所在,由於我們不是購買iMacros的商業版,因此無法直接與外部程式串連來改變iMacros執行過程中的內容,但還是有其它的方法讓我們透過其它程式來動態的產生巨集,我們的作法如下方的流程圖,利用web server依據不同的需求產生相對應的巨集,再交由iMacros來執行,此server端程式可以用任何網頁語言來編寫,在這裏我們用PHP來作示範。

確認系統架構

    我們先模擬一個比較單純的需求狀況,假設你打算要架設一個網站,專門提供網友們二手物品的自動搜尋及價格分析功能,讓使用者能夠在網頁上註冊他們感興趣的物品,並設定一個希望購買價格,然後系統就會每日按時搜尋包含eBayAmazon、露天、Yahoo、DCView、Mobile01、KeyBuy等二手拍賣網站,找出他們感興趣的商品,記錄及計算平均價格變化,除了每日系統會寄發相關的價格趨勢統計圖表之外,當有某個拍賣商品達到了網友預定的價格區間(低於希望購買的價格),系統立刻會自動寄發email給網友,告訴他在某個拍賣網站上的某件商品達到他預定的價格,可以考慮是否購買。
    下圖是我們的系統架構圖,看來似乎有些複雜,但其實它的步驟可歸納如下:
使用者輸入資料(1~2) 系統讀取使用者的資料後,產生iMacros巨集並執行(3~7) 從儲存的網頁中萃取重要的資訊(8~9) (10~12)如果是線上查詢,則顯示結果列表,若為查詢登錄,則定時地比較分析,每日發送價格訊息,若有符合商品則額外email通知。
在本文後半部我將僅針對3~7的步驟說明其作法。

準備平台

    由於本文使用PHP作為iMacros巨集產生的工具,因此我們需要架設Apache + PHP的環境,如果您使用Windows,可以在google上搜尋LAMP + Windows,找一套適合的來安裝。
    當您裝好了之後,可以確認看看PHP這個指令可以單獨work,如果您經常使用PHP來開發程式,能夠直接透過command執行PHP程式是非常方便的事,而且也可以把PHP寫成獨立的程式讓server去執行;若PHP無法執行的話,先檢查您的環境變數,看看PHP指令所在的路徑有沒有定義在PARH環境變數中,可以試試輸入php –version看看這個php 指令是否work。





品名及價格輸入介面

    我們先製作一個網頁頁面讓使用者能夠輸入品名及價格,表單的HTML碼如下,檔名為askprice.html,您可以看得出來這是一個很基本的表單,讓使用者可以輸入資訊再傳送給askprice2.php。






    它長得就像這個樣子,請記得將網頁放在Apache的文件目錄中,再使用瀏覽器輸入網址http://localhost/askprice.html 就可以開啟它。

錄製巨集樣本

    我們先用錄製的方式得到一個巨集,再利用此巨集作為動態產生的樣本;請注意,因為我們要到不同的網站去查詢並獲取資料,由於不同的網站會有不同的頁面及查詢方式,因此需要針對每個網站分別錄製一個樣本,我在這裏先錄製兩個網站樣本作為示範,錄製的方法如果您忘記了請參考上一篇「讓您的瀏覽器也能自動工作」一文。
    我分別在eBay及露天兩個網站查詢Nikon D800E這項商品,並將查詢結果用另存新檔方式儲存下來,請記得錄製時要錄到另儲新檔為止。


VERSION BUILD=8820413 RECORDER=FX
TAB T=1
URL GOTO=http://www.ebay.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:gh-f ATTR=ID:gh-ac CONTENT=Nikon<SP>D800E
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:gh-f ATTR=ID:gh-btn
SAVEAS TYPE=CPL FOLDER=* FILE=+_{{!NOW:yyyymmdd_hhnnss}}

VERSION BUILD=8820413 RECORDER=FX
TAB T=1
URL GOTO=http://ruten.com.tw/
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:srch ATTR=ID:keyword CONTENT=Nikon<SP>D800E
TAG POS=1 TYPE=INPUT:BUTTON FORM=ID:srch ATTR=*
SAVEAS TYPE=CPL FOLDER=* FILE=+_{{!NOW:yyyymmdd_hhnnss}}

更改iMacros的預設巨集目錄

    這是重點所在了,首先,請您先將iMacros的巨集位置設定在Apache的網頁路徑之下,(一般Windows會預設在C:\Apache2\htdocs),在本例中,我設定在C:\Apache2\htdocs\imacros,這樣作的目的是,讓動態產生的巨集檔可以被iMacros讀取得到。
    我們將巨集預設路徑更改到Web server目錄下之後,iMacros就可以讀取到並執行Web server在預設路徑下所動態產生的巨集,避免呼叫iMacros執行巨集時經常發生的找不到巨集的錯誤。

讓PHP產生巨集檔

    接下來,我們要將剛剛所錄製的巨集作為範本讓PHP來產生;我們有兩個巨集檔,它們會分別到eBay及露天去搜尋Nikon D800E這個商品:
            eBay





            露天









    我們把這兩個巨集內容整合成一個,包在一個變數$macro之中,並將該PHP儲存為askprice2.php,放置於askprice.html相同的路徑下:
   










    您會注意到最後一行:file_put_contents("imacros/dcviewtest.iim",$macro);,它會把$macro變數內容,儲存為iMacros的巨集檔放置於imacros路徑下,而這個路徑,也是我們之前已在iMacros中所設定的預設路徑,所以php產生的巨集檔變可被iMacros所執行了。
    還有一點需要注意的是,我們在每一行後面會加上斷行字元\n,這是為了模擬實際的巨集檔案內容。
    最後,我們要將Nikon<SP>D800E這個商品搜尋字串改為承接自上一頁的商品名稱的內容,並且將空白字元替換為<SP>,整個PHP檔案內容更改後如下,黃色的字體代表有更動的地方:














測試看看

     這樣就完成了,您可以試看看在瀏覽器上執行http://localhost/askprice.html,輸入產品名稱後按下submit按鈕,是否有在macros目錄下產生巨集檔askprice.iim,若運作正常的話它應該會自動產生,而且您也可以在瀏覽器的iMacros panel中看到此檔,此時請click它,確認這個巨集檔可以正常的運作。   

讓巨集程式自動被伺服器執行

     確定動態產生的巨集可以正常執行後,表示我們巨集產生的語法是正確的,接下來,我們要讓伺服器去執行該巨集檔,執行時機有兩個考量點:
  1. 即時執行:如果該User是作線上查詢的動作,那麼,我們應當在產生巨集檔後立即執行,並在執行結果產生後擷取並匯整需要的資訊,經過格式化後在網頁上呈現給User觀看。
  2. 事後執行:如果該User選擇預約查詢,那麼我們可讓伺服器定時檢查目錄下是否有 iim巨集檔,若有的話則用指令模式去執行它,此定時執行的程式依不同的主機環境有不同的寫法,您可以用Shell,例如bashcsh等,或者用perl,每隔一段時間去執行該目錄下的iim檔,並將執行結果經過擷取並匯整後,使用email寄發給使用者。
透過指令執行iMacros巨集
  您還記得我曾在上一篇知識文件介紹的,如何用指令方式執行iMacros巨集而不用手動開啟瀏覽器嗎?只要在指令中輸入瀏覽器的執行路徑並帶入巨集名稱就可以了,如下圖,


沒有留言:

張貼留言