2019-11-02

針對任務牆運用自動化行為 AUTO 的基本姿態!《SikuliX 篇 》

Bots? Automate? Is it good or bad? Every coin has two sides.

    在前期的自動化行為《 iMacros 篇 》我們使用了網頁瀏覽器外掛的iMacros來達到自動化點擊的目的。由於、這類行為有時對某些敏感網站是會帶來雙刃劍的效果,搞不好會不預警地被開鍘出去 (be banned)

    沒錯、我們就像加入了「水龍頭丐幫組織」的丐兒們,一切都僅憑水幫主的施捨喜好來決定我們的生死去留!也別期待他們都是些上軌道有牌有照正常經營並可申訴的網站,往往他們的主觀認定或是規則的不明確,有時也會造成我們的誤觸行為。(笑、或者貪念~

    案例非常多「介紹給同事結果大夥共用公司同一IP」、「使用到外面公共網路IP」、「家人與你同帳號同時上線」、「使用到 Proxy」、「同時刻點擊過多」…等等不勝枚舉的他們所謂犯規行為,有良心的網站、還真的有所謂客服也許還能申訴恢復……最怕的是等無申訴回應直接判你已被搿搿~(removed)。

等一等、靠杯~怎麼好像都是資方說的算數!

    那……點擊水龍頭所造成的職業傷害疑?有人逼您嗎?)呢?有沒有人替我們這些弱勢水龍頭之友會的勞方著想發聲呢!?我們有沒有工會啊~(



    對啦~對啦~「我將真心照明月;奈何明月照溝渠 (I want you but you do not want me.)」是不是齁~點了好多遍……但任務就是死不出現!自己的真心付出點擊沒有得到應有的回報和尊重。喔、成語是這樣用嗎?

    您瞧!每個都要來回巡點,想想我們的眼睛、手腕、手指長時間大量的使用「腕隧道症候狀」、「視網膜光傷害」等等職災不就指日可待了咩~


    齁~總算冒出來了喔、接下來等待我們的是《少年Click的奇幻漂流》(英語:Life of Click)在腥河網海半夢半醒點擊之間,歷經一次次被動冒險及奇妙勾當或色色際會的接觸。

    有些是18禁、有些是莫名中毒威脅、更甚的摸不著下文的網址等。不是俺想作非分之想,難道我們就不能對自己好一點點嗎?這難道是奢求嗎!?


    「哇答~你們的心聲、哇答~我都聽見了!」、「就讓我傳授一招截拳道、喔不對、是截圖道,哇答~」真的嗎?耶~感謝小龍師傅、讚嘆SeaFood~

等一等、繼續閱讀全文前請三思喔~您真的要使壞壞嗎!?
先說好、施主若用了此招~個人造業個人擔,往後別牽拖俺這邊器(笑)
    喔、您「豁出去了~」為您的勇氣拍拍手!不過、接下的範例會用到MinuteStaff OfferWall來做演示,沒有Cointiply帳號也沒點擊過求職牆 Offer Walls 當中的 MinuteStaff 任務的人!給俺快去先申請一個(新申請去~)。

用 SikuliX 圖形腳本來實現自動化!
   有關SikuliX用一言來簡單敘之就是「用圖形辨識來寫程式!」,簡單易懂、這裡不會寫一堆艱深語法來迷惑您(羞~也寫不出來),就是以10分鐘就能完成程式為首要目的。


SikuliX 的詳細指令說明,就不在此詳介了。(請自個查詢研究一下

SikuliX Downloads
官網:http://sikulix.com/
下載官網:https://raiman.github.io/SikuliX1/downloads.html
SikuliX 2.0.0 直接下載:https://launchpad.net/sikuli/sikulix/2.0.0/+download/sikulix-2.0.0.jar

    現時點SikuliX 2.0.0為最新版就以此來使用。早期版本Sikuli 1.13(需runsikulix.cmd 來啟動)到了SikuliX 1.14版本後就全部封包成一個檔案可方便執行。

1

打好根基

截圖道概念:必須要能在任何位置、任何姿勢出拳。
Every night in my dreams.I see you, I feel you.That is how I know you go on.

    將下載下來的sikulix-2.0.0.jar 直接在 C: 槽開個資料夾 C:\SikuliX\ 將其擺放進去。

    至於為何選擇乾淨版的 MinuteStaff OfferWall 來做演示,就是排除一切會干擾的雜訊與無關圖形,至於如何將Cointiply內的MinuteStaff界面變成乾淨版的 MinuteStaff 界面,在前一帖已有所介紹~(請看下方的延伸閱讀




    左上:MinuteStaff乾淨界面、右下:SikuliX程式界面(上方是程式編輯區、下方是執行訊息區)、左下:程式資料夾狀況。演示基本以此三方面來做說明,放心、絕對讓您腳本跑得起來~(笑)

▼先寫一段註釋!

     執行sikulix-2.0.0.jar去開啟程式,我們先養成一個好習慣先標註一下此程式的介紹。
#
# MinuteStaff OfferWall Loop test
#
    輸入上方的注釋說明於程式編輯區(如上圖所示),# 就是代表此行為注釋說明,程式是會忽略不執行它。


▼先儲存下來!

    是的、沒錯!光是寫注釋也算是完成程式(笑~不是經典的Hello嗎? )。點檔案下拉選單請選另存為……選項


▼以資料夾包方式儲存!

    儲存地點選擇資料夾 C:\SikuliX\
    下方 Files of Type:as folder.sikuli 檔名File Name:MinuteStaff-loop


▼程式檔案設置完成!

        這裡我們採用資料夾包方式 as folder.sikuli 方式並取 MinuteStaff-loop 為檔名,這樣一來程式會自動替我們建一個MinuteStaff-loop.sikuli的子資料夾與子資料夾內新增一個MinuteStaff-loop.py檔案。(.py是python程式語言的副檔名

2

洞察對手

弄清楚做動作時所用到的肌肉有哪些,並柔軟此部份之肌肉。
Far across the distance.And spaces between us.You have come to show you go on.



▼開始寫一段程式並截圖!

     開始正式來寫一段程式囉~(要說腳本亦行
count=0
for count in range(2):
    count +=1
    # Instant On
    if exists(
    宣告一個 count 計數變數起始為0,range(2)為執行迴數範圍,這個 exists 函式是用來偵測畫面上是否存在這樣的物件,count +=1每執行1迴圈加1。

if 條件 : 動作
for 項目 in 集合 : 動作

    很基礎的程式語法,作為迴圈去控制重複操作動作的某一個集合流程。

    而是否存在這樣的物件的判定語句,這裡除可用程式語法或關數去定義它之外,還可以直接用圖形物件去標示它的存在與否。(夠劃時代的程式編寫方式吧!

    將滑鼠定位在exists(的後面處,接著去點選上方工具列上的螢幕截圖的圖示!


▼去截圖點擊目的字塊!

     點擊螢幕截圖的圖示後進入截圖框區域的動作,我們目前的截圖目標是正處於Instant On 顯示的Instant字塊,截圖字塊範圍能夠越小越好。(判圖的速度也會較快些~


▼產生一個截圖檔案!

     截圖精準完成後在程式編輯區內exists(的後面就直接出現剛剛截下的圖塊,並一同產生一個由程式自動命名的暫存圖檔。(在未按存儲前一切都是暫存的


▼給截圖檔案更名!

     這個截圖檔名很難易懂,當只有幾個時還好一旦多了就很難挑選。點選程式編輯區內截圖圖塊來到圖片樣式設定表單


更名成易懂的截圖檔名!

     將難懂程式給的截圖檔名更名為Instant-On,由於MinuteStaff 預設的開啟界面是處在Instant On的狀況下,跟Instant Off的狀況是有著不同明暗的區別。(取這樣的檔名往後就不會搞錯了

    在沒按確定Apply時您可以發現,此刻同時存在有2個相同但不同檔名的圖檔。


發現存在時的接下動作

     如上圖所示、當 if exists(): 找到時……接下可去執行點擊的動作click(

    運作原理就是在螢幕中去尋找剛剛截圖的圖塊,一旦找到的話我們就進行去點擊它的動作。至於要點擊那裡呢?我們就叫滑鼠去點擊click 剛剛我們截圖的圖塊去。

    去點選上方工具列上的掛入圖片的圖示進行圖檔的挑選!


選擇點擊Click的圖塊

     如上圖click( 後面的圖塊是跟判定圖塊有否存在是相同的,此刻2個相同圖檔的挑選,選擇有著正確檔名的Instant-On.png是不是來得更為清楚捏~

3

開始出招

移動一似流水般,靜止時猶如鏡子,反應時卻恰似回聲般。
Near, far, wherever you are.I believe that the heart does go on.Once more you open the door.And you're here in my heart.And my heart will go on and on



先試跑看看效果

     如上圖後面的結尾添加上 wait(3) 延遲3秒的間隔,wait 函式的時間為秒單位。接著可以放膽地去試跑看看效果,去點選上方工具列上的執行圖片的圖示進行程式執行。


先儲存再跑程式

     如上圖跳出後面「確定要關閉這個檔案嗎?」的訊息確認方塊,由於已寫了一些程式還處在未儲存的狀況下,程式是要在已儲存的狀況才能去編程解譯執行,選擇Save all and Run 儲存然後執行為佳。


鬼精靈滑鼠動起來囉~

     興奮吧!滑鼠的游標會自動尋到Instant上方,經過2次的Instant原地刷新點擊過後結束程式又回到程式編輯區處,在下方出現執行訊息區出現2行[log]訊息。

    [log] Click on L[35,124]@S(0) (1038 msec)
    [log] Click on L[35,124]@S(0) (533 msec)

    第一次找到Instant花了1038毫秒、第2次就來得快些。 L[35,124]表圖塊在螢幕上的xy座標值,當然往後的進階時您可以不用圖塊搜索,直接使用座標值來點擊會更快些。


呼叫 Call 一個程序!

     看[log]雖可判別程式是否正常運行,但若我們能夠自主控制顯示我們給的訊息不是更棒!喔「Hello~」總算要執行嗎?

    哈、目的不是這個啦~ 我們要來自設一個關數 Func 來呼叫它!
# ----- Instant Func  -----
def callInstant():
    print("Instant") 
count=0
for count in range(2):
    count +=1
    # Instant On
    if exists(""):
        click("")
        callInstant()
        wait(3)
    使用callInstant() 來呼叫一個我們自定義def的關數函數,並以這個指令 print("Instant") 打印出這個Instant字串訊息出來。

    為何先預留一下呼叫關數的動作,而不是直接將print("Instant") 放在click()的下面呢?(當然亦可)由於MinuteStaff 每個 Tab 任務條件都不同,針對每個任務的後續程式都將不同,若都擠在一塊的話對將來的發展有點不佳。(養成好習慣咩~


▼Hello 您好~

     重新執行程式看看,這下訊息區出現2次的Instant 字串出來囉~證明我們呼叫自設的關數運行一切正常。

 ☆如何強制中斷程式的運行
     程式運行的過程中您可以隨時中斷,強制中斷的命令方式:ALT + SHIFT +C。
 Press ALT+SHIFE+C to kill a running script. 

4

對敵的姿勢

搏擊時需有彈性,不墨守成規,能臨機應變、反應敏捷。
Love can touch us one time,And last for a lifetime. And never let go 'til we're gone.



▼新添另一個Visit進去!

     完成Instant的Tab 點擊,接下要把滑鼠游標控制移位到 Visit 的Tab位置去並點擊它。記得此刻Visit 的狀況是處在 Off 的,故圖檔名取Vist-Off.png為佳。

    Visit截圖跟呼叫關數的動作跟Instant的設定一模一樣,寫完就可試跑看看。


▼先完成一個小迴圈!

     到目前的流程動作:

    Instant(On)  →Vist(Off) →Vist(On) and Instant(Off)  →無法選到Instant(Off)而迴圈中斷

    如上圖我們再新增一個Instant(Off)回到初始的Tab位置去,如此一來Instant跟Vist形成一個小迴圈。


▼測試小迴圈是否正常運行!

     如上圖整個流程在訊息區一覽無遺,我們從上可知Instant 中間多點擊一次(但又何妨呢?),當然可以完美修正……但首要目標是整體全搞定再說咩~


▼把其他的Tab 項目全加進來!

     嫌繁瑣的人可先複製一組腳本然後一口氣將所要的項目數全部對應貼上去,接著一一更名並個別截圖上去會來的快速完成喔~

    相信到此、您已經變得非常老練了!看看下面的動作是否完美執行呢?



 ☆謹慎控制迴圈執行次數
     太過密集的迴圈跟點擊可是會惹人怨喔~傳送頻繁的呼叫,堵塞目標網站的流量就跟駭客發動DDoS攻擊無異。(偶而跑個2~3回就夠了)


5

猛龍過江

截圖道總結:倘若時機不當,一拳一腳招式就是再妙再快也是枉然的。
Love was when I loved you.One true time I'd hold to.In my life we'll always go on.



    上面我們完成了自動巡迴的目的囉~但是唯獨Vist此項因為任務完成條件的說明過長,往往好康的任務出現時我們是無法發覺到的……那怎麼辦呢?

    早期的MinuteStaff 的Tab分頁名稱上是沒有超連結的,當點擊到 Vist 的Tab分頁的名稱上後就會將 Focus 焦點移至此分頁內上,也就是說此刻我們可以進行 Key Dow 或 Key Up or PageDown 或 PageUp命令指令的操作,來將其分頁內容做下移拖拉或上移歸位。

    那如何讓目前定在 Vist 的Tab分頁超連結上的滑鼠的焦距移到Vist 的分頁內容區塊呢?有許多種方法都可以達成此目的。

    譬如再多找一個圖塊或字串像「Instructions」將滑鼠定位至其上換言之焦距在分頁的內容上,或者隨意找一個分頁內容內上任一定位點亦可。
增加自設 Vist函數動作:
# ----- Vist Func  -----
def callVist():
    x=Env.getMouseLocation().getX()
    y=Env.getMouseLocation().getY()+40
    click(Location(x,y))
    type(Key.DOWN+Key.DOWN+Key.DOWN+Key.DOWN+Key.DOWN+Key.DOWN+Key.DOWN)
    wait(3)
    type(Key.UP+Key.UP+Key.UP+Key.UP+Key.UP+Key.UP+Key.UP)
    print("Vist")

    嘻~利用Env.getMouseLocation().getX()這個語法來分別獲得目前滑鼠的x,y的位置,然後故意把y座標多添加上40,來讓目前的焦距移到此分頁的內容區內。(由於後面會大量使用到抓MouseLocation的語法來達到定位目的故用它啦~

    點擊此處click(Location(x,y)),確定焦距已在此區內!接著就可進行頁內容的捲動。



同理可證:利用x,y定位點的偏移量、呵、呵、管他Cointiply的亂數出現的搞怪文字,我們也可以輕鬆讀取進來~接著利用此文字對應的截圖再去判圖點選就OK囉!(簡單咩~


    所以、這道問題如前面的解決方式,先截圖一個不會變更的區塊,然後去找出可相對應的偏移座標出來就可迎刃而解了。(管他轉址文字每次都不一樣







    例如截圖此區塊  當作基準x,y座標然後下移y去定位到轉址的超連結位置上,接著點擊此新座標就可開啟廣告頁囉~(y下移的偏移值多試幾遍就可抓準


    截圖可定義在同一區塊內,免得寫程式時造成視覺上的不一致。接著當然針對每個任務完成條件的不同去一一破解它這才是好玩又有成就感的破解遊戲),Instant 、Click 、View 這三樣任務是最容易解決的,其他的Vist、Target、EX 就常常會因廣告業主的網頁搞怪……有時是會有突槌狀況發生。(沒法度~

    任務牆的自動化點擊任務應該是都可以解決的,就看您投入的心力囉~



「呵、呵、真是秀色可餐啊~」「來吧!多多亦善咩~」

5 則留言:

  1. 可以直接把脚本打包放出来吗

    回覆刪除
    回覆
    1. 感謝您的興趣~
      前半段算是初階的很容易10分鐘內就達成。(最好實作為佳)
      由於每個人的螢幕解析度大小不同,在截圖跟往後的定位上很難會一致。
      故也許很難做到一腳本通吃每個人不同的狀況。

      刪除
  2. Loren Cordain, writer belonging to the Paleo Diet program, Robb contains altered the particular lifetime associated with lots of men and women worldwide using his / her prime positioned iTunes podcast, guide and even training seminars. https://imgur.com/a/nICmcM6 https://imgur.com/a/h2G7dNQ https://imgur.com/a/ruNAjPJ https://imgur.com/a/hf24jrq https://imgur.com/a/YODBKey https://imgur.com/a/cSJFRiC https://imgur.com/a/qlHjQvW

    回覆刪除
  3. 是用python嗎
    這一個月賺多少啊

    回覆刪除
    回覆
    1. 官方SikuliX支持作為腳本語言如下:
      SikuliX 支援的Scripting Languages
      …Python language level 2.7 (supported by Jython)
      …running RobotFramework text-scripts is supported (see docs)
      …Ruby language level 1.9 and 2.0 (supported by JRuby)
      …JavaScript (supported by the Java Scripting Engine)

      寫腳本最主要是減輕重複性的動作啦~(呵)
      至於每個月能賺多少........就看能否持之以恆積少成多咩~(加減賺微薄飲料代)

      刪除