Applescriptで初心者が罠にハマったところ

Apple Mac

最近Applescriptでsafariをいろいろと操作していたのですが、そこでハマったところを備忘録的に列記しておきます。

(お約束)ご利用は自己責任でお願いします

  1. サブルーチンは my で呼ぶ。my無しでも呼べるが二回目以降エラーになる
    set answer to my hoge_Sub
    -- サブルーチン
    on hoge_Sub(a,b)
        .....
        return hoge
    end hoge_Sub
  2. ダイアログから”text returned of”で得た数値は as number で変換しないと文字列と認識されて誤処理される可能性あり。
    set num to text returned of (display dialog "何番ですか?") --ダイアログを出してnumに代入
    if (num as number < 100) then --numが100より小さいときには
    	display dialog "100以下 num = " & num
    else
    	display dialog "100以上 num = " & num
    end if

    以下のように書くとelseルートにしか通らない

    set num to text returned of (display dialog "何番ですか?") --ダイアログを出してnumに代入
    if (num < 100) then --numが100より小さいときには
    	display dialog "100以下 num = " & num
    else
    	display dialog "100以上 num = " & num
    end if
  3. safariでtype=”image”のボタンをクリック。
    なぜこれでできるかはよく分からないが、できたのでよしとする(笑)。
    参考 http://stackoverflow.com/questions/22082120/click-on-input-type-image

    	do JavaScript "var elements = document.getElementsByName('image');for (i=0;i<elements.length;i++) {if(elements[i].type == 'image') {elements[i].click();}}" in document 1

     

  4. submit ボタンをクリックする。
    例えばファンサカにログインするときは以下の様なかんじ。

    <form method="post" action="" name="login_form" id="login_form">
    <div>Yahoo! JAPAN ID<input name="login" id="username" value="" class="" type="text"></div>
    <label for="" class="" id="">パスワード</label>
    <div class="">パスワード<input name="passwd" id="passwd" value="" class="" type="password"></div>
    <input type="submit" value="ログイン" class="" id="">

    formのidは『login_form』、Yahoo! JAPAN IDのidは『username』、なので、『document.login_form.username.value』 に 『mailID』 を代入するかたちになります。

    my openURL_Sub("https://login.yahoo.co.jp/config/login?.src=spt&.pd=&.v=4&.done=http%3A//fantasy.sports.yahoo.co.jp/jleague/stats/") --ファンサカ
    tell application "Safari"
    	activate
    	set mailID to "xxx@yahoo.co.jp" --ID
    	set passWD to "pass" --パスワード
    	do JavaScript "document.login_form.username.value='" & mailID & "'" in document 1
    	do JavaScript "document.login_form.passwd.value='" & passWD & "'" in document 1
    	do JavaScript "document.login_form.persistent.checked= true" in document 1
    	delay 1
    	do JavaScript "document.login_form.submit();" in document 1 --submitボタンを押す
    end tell
    
    on openURL_Sub(theURL)
    	tell application "Safari"
    		activate
    		open location (theURL as string) --URLを開く
    	end tell
    end openURL_Sub

     

  5. 指定IDや指定classをクリック
    参考 http://cubemg.com/applescript/how-to-click-a-button-on-a-web-page-with-applescript/
    ここでサブルーチン化されているものを使えばOK。サブルーチンのtoはonと同じ。例えば
    『<input type=’button’ id=’CT_BUTTON_0′ onclick=’ConnentClick(0)’  value=’接続’ />』
    をクリックしたいとき、指定IDなら以下のように書く。

    my clickID("CT_BUTTON_0")--idを指定
    on clickID(theId) --creates a function that we can use over and over again instead of writing this code over and over again
    	tell application "Safari" -- lets AppleScript know what program to controll
    		do JavaScript "document.getElementById('" & theId & "').click();" in document 1 -- performs JavaScript code that clicks on the element of a specific id
    	end tell -- tells Applescript you are done talking to Safari
    end clickID -- lets AppleScript know we are done with the function

    class名やタグ名でも同様。elementnumはエレメントの順番を指定する。

    そして使うときには、以下のように 「tell application “Safari”」を分けること。

    tell application "Safari"
       set to なんちゃらかんちゃら	--コードを書く
    end tell
    
    clickID("xxxID")
    
    tell application "Safari"
       set to なんちゃらかんちゃら	--コードを書く
    end tell
  6. safariでいつも同じウィンドウ(タブ)でURLを開く。
    以下のように書くと新しいタブでURLを開いてくれます。

    tell application "Safari"
    	open location ("http://192.168.0.1/" as string) --URLを開く
    end tell

    ただそれだと都合が悪いときがある。いつも同じウィンドウの同じタブでURLを開きたいときは

    tell application "Safari"
    	set the URL of the front document to "http://192.168.0.1/" --いつも同じウィンドウで開く
    end tell

    参考 http://stackoverflow.com/questions/7015881/applescript-safari-open-url-in-current-window

  7. リンクをクリックする。
    上記5をつかってクリックする。例えば以下のようなリンクの場合

    <p><a href="http://www.google.co.jp/" id="linkID" class="linkClass">google</a></p>

    以下の様な感じでクリック可能。

    サンプルには三つ書いたが、もちろん三つのいずれかを使うこと。
    my clickID(“linkID”)
    my clickClassName(“linkClass”, 0)
    my clicktagName(“a”, 0)

    tell application "Safari"
    	open location ("test.html" as string)
    end tell
    delay 1 --ページのloadを待つ
    
    my clickID("linkID") --IDでクリックする場合
    my clickClassName("linkClass", 0) --class名でクリックする場合
    my clicktagName("a", 0) --タグ名でクリックする場合
    
    on clickID(theId)
    	tell application "Safari"
    		do JavaScript "document.getElementById('" & theId & "').click();" in document 1
    	end tell
    end clickID
    
    on clickClassName(theClassName, elementnum)
    	tell application "Safari"
    		do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
    	end tell
    end clickClassName
    
    on clicktagName(thetagName, elementnum)
    	tell application "Safari"
    		do JavaScript "document.getElementsByTagName('" & thetagName & "')[" & elementnum & "].click();" in document 1
    	end tell
    end clicktagName

    ただ my clicktagName(“a”, 0) は一番上の <a href= に反応してしまうので、以下のように二行目のyahooや三行目のamazonをクリックすることは不可能になる。
    そういう場合はURL(文字列)を抽出してsafariに送るとかの工夫が必要になると思われる。

    <p><a href="http://www.google.co.jp/">google</a></p>
    <p><a href="http://www.yahoo.co.jp/" >yahoo</a></p>
    <p><a href="http://www.amazon.co.jp/">amazon</a></p>

     

  8. 『~』チルダが『‾』(上線、オーバーバー、オーバーライン)になってしまう。
    チルダはほぼURLでしか利用されていない(と思う…)ので、URL形式で書けばよい。『~』のURL形式は『%7e』
  9. safariが落ちる。
    こういうコードで落ちるときは、

    tell application "Safari"
    	activate
    	make new document --safariで新しいウィンドウを開く
    end tell

    こうやって分けると落ちないことがあるので、試行錯誤してみる。

    tell application "Safari"
    	activate
    end tell
    
    tell application "Safari"
    	make new document --safariで新しいウィンドウを開く
    end tell

     

  10. ファイルの文字コードをUTFに変換する。
    Applescript内はどうやらS-JISらしい。「 write saveData to saveFileName 」などとファイルを書き出すとS-JISになる。
    UTFにしたいときは、シェルのiconvでの変換が楽。

    set FileNameSJIS to "/SJIS.txt" --ファイル名をセット(s-jis)
    set FileNameUTF to "/UTF.txt" --ファイル名をセット(utf用)
    do shell script "iconv -f SJIS -t UTF8 " & FileNameSJIS & " > " & FileNameUTF --UTFに変換する

     

  11. Finderで選択したフォルダ内にある画像を指定した横幅でリサイズしてImageOptimで容量圧縮するApplescript
  12. メモ
    http://cubemg.com/applescript/how-to-extract-information-from-a-website-using-applescript/
    How to Get AppleScript to Wait for a Page to Load
    NEW! AppleScript Maker Beta: Hey Everyone, I am working on a new AppleScript tool that is going to BLOW YOUR MIND! After...

コメント

タイトルとURLをコピーしました