« Zaurus用iTunesネットワークリモコンRCTunes(3) | Main | Zaurus無線LAN自動再接続スクリプトwlan-re-establish »

2007.02.02

ZaurusのNetFrontを強化! QCopでJavaScriptを実行

QCopメッセージでLinux ZaurusのNetFrontにJavaScriptを実行させる、というのをやってみました。

NetFrontに送るQCopメッセージとしては、

qcop QPE/System 'execute(QString,QString)' netfront3 "http://www.google.co.jp/"

これが基本形でしょう。僕はこういうのをいくつかKeyHelper Appletに登録して、Googleやらmixiやら駅探SSに、いついかなるときでもバシっと一発でジャンプできるようにしてあります。

qcop QPE/System 'execute(QString,QString)' netfront3 "mailto:hoge@hoge.com"

みたいなのも通ります。しかし、「?subject=test&cc=hoge2@hoge.com」といった引数はqtmailに通らないようでした。

qcop QPE/System 'execute(QString,QString)' qtmail "mailto:hoge@hoge.com"

でも同じですね。よくメールを送る人をKeyHelper Appletに登録しておいてはいかがでしょうか。
この延長上で、

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:alert('hoge');"

というのも通りますよ、と、こういう話です。
bookmarkletと違って、実行方法はいろいろです。KeyHelper Appletを使うのが一番便利かと思います。

ただ、一つ問題があります。ロケーションバーに実行したスクリプトの内容が流し込まれてしまうんですね。
実行前に退避しておいて、window.locationなどで復帰したりとやってみましたが、うまくいっていません。

応用例をいくつか作ってみましたので、参考にしてください。可能性は無限大です。
JavaScriptが書けないとダメですが……。

スクロール系

以下はKeyHelper Appletのkeyhelper.confの[Launch]セクションのフォーマットで書いてあります。
行頭のGとかTとかは僕の適当な設定ですので、適宜読み替えてください。<TAB>はタブ文字を入力です。

上方向にスクロール (スクロール量調整可能)

G = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollBy(0,-200);"

下方向にスクロール(スクロール量調整可能)

H = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollBy(0,200);"

ページトップにジャンプ

T = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollTo(0,0);"

ページボトムにジャンプ

B = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollTo(0,100000000);"

スクロールさせる方は、「scrollBy(0,X)」のXの数値を大小させるとスクロール量を調整できます。
「ページボトムにジャンプ」はページのheightを計算してスマートにジャンプさせる方法があるかと思いますが、格好悪く非現実的な数値を入れてます。

フォームの自動入力系

フォームの解析が必要ですが、フォームに自動入力できると便利な局面もあるでしょう。
モバイラーはSNSとかにいろんなところからログインするので、勝手にログアウトしてイラっとすることが多いかと思いますが、そんなときに一発でログインできると快感。

あらかじめフォームに値を入れて、submit()をFireするローカルページを用意しておけばいいんですけどね……。動的にページを生成するサイトなどでは使えなかったりするので、そういった場合のサンプルということで。

EMAILADDRESS、USERNAME、PASSWORDを自分のものに書き換えてください。
Gmailのはアカウントを取っ替え引っ替えしている人に便利かな。
ログインできさえすればいいなら、全部まとめてdocument.URLで判定して、実行すれば何でもログインスクリプトにすれば便利ですね。
これ以降はコマンドラインやシェルスクリプトから実行する場合のフォーマットで書きます。

mixiログイン

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:m='EMAILADDRESS';p='PASSWORD';f=document.forms[0];if(f.email){f.email.value=m;f.password.value=p;f.sticky.checked=1;f.submit()}else{exit()}"

Yahoo! Auctionのパスワード再確認画面

(これはSafariでしか確認してません。うまくいかない場合は「document.title=='パスワードの確認'」をtrueにしてください)

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:if (document.title=='パスワードの再確認'){document.forms[0].passwd.value='PASSWORD';document.forms[0].submit();}"

Amazonログイン

(http://www.amazon.co.jp/gp/yourstore/?signIn=1)

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:df=document.forms[0];if(df.name=='sign-in'){df.email.value='EMAILADDRESS';df.action[1].checked='1';df.password.value='PASSWORD';df.submit()}"

Gmailログイン

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:m='USERNAME';p='PASSWORD';d=document;e=d.getElementById('Email');if(e){e.value=m;d.getElementById('Passwd').value=p;d.forms[0].PersistentCookie.checked=1;d.forms[0].submit()}else{exit()}"

Js_scrn005

Js_scrn006

Js_scrn007

ユーティリティ系?

ページの要素を抜き出してきて、別ページを生成、そこに一覧、みたいなのもできます。
とりあえず画像へのリンクと通常のリンクの一覧を抜き出してきて、別ページを開いてtextareaの中にダダっと貼り込むというのを作ってみました。

リンクを抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:dl=document.links;if(dl.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Links</title><form><textarea cols=85 rows=20>');for(i=0;i<dl.length;i++){w.write(dl[i].protocol+'//'+dl[i].hostname+dl[i].pathname+'\n')};w.write('</textarea></form>');w.close();"

画像を抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:di=document.images;if(di.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Images</title><form><textarea cols=85 rows=20>');for(i=0;i<di.length;i++){w.write(di[i].src+'\n')};w.write('</textarea></form>');w.close();"

正規表現にマッチする画像を抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:di=document.images;if(di.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Images</title><form><textarea cols=85 rows=20>');for(i=0;i<di.length;i++){if(/gif/.test(di[i].src)){w.write(di[i].src+'\n')}};w.write('</textarea></form>');w.close();"

Js_scrn001

Js_scrn002_1

Js_scrn003

「if(/gif/.test(di[i].src)){}」なので、「gif」が含まれる画像リンクだけ抜き出した一覧になっています。
ほとんど可読性ゼロの状態ですが、何もbookmarkletのようにOne Linerでなくてはいけないわけでなく、例えばShell Scriptから実行する場合は、以下のような形でOKです。

#!/bin/sh

# 「javascript:」の直後、文無しで改行を入れてはいけない
# 文字列リテラルの中で改行してはいけない (基本)
# 最近のECMAScriptでは改行できるみたいですが。

qcop QPE/System 'execute(QString,QString)' netfront3 "
javascript://;
di = document.images;
if (di.length == 0) {exit();}
w = window.open('', (new Date()).getTime());
w = w.document;
w.open();
w.write('<title>Images</title>' +
'<form><textarea cols=\"85\" rows=\"20\">');
for (i = 0; i < di.length; i++)
{
if (/gif/.test(di[i].src))
{
w.write(di[i].src + '\n');
}
}
w.write('</textarea></form>');
w.close();
"

Shell ScriptのKeyHelper Appletからの実行は、以下のようにします。keyhelper.confの[Menu]セクション形式の記述です。

10_img list = @exec<TAB>/bin/sh /home/zaurus/bin/js.sh

あとがき/情報募集

かように、いろいろなことができます。ページのソースを表示するとか、リンク先を抜き出すにしても最初っからwgetを頭に付けておいてダウンロード補助するとか、抜き出したリンク先を貼ったページを前面に出して、selectして、InputHelper AppletなどでCtrl + Cを発行してクリップボード経由でダウンロードまで自動でやっちゃうとか。絞り込みの正規表現を途中で入力するようにするとか。

KeyHelper Applet + QCop経由でのJavaScript実行は、他のモバイルプラットフォーム/ブラウザに無い強みですので、ぜひ活用してみてください。

「document.readyState」が使えないようです。存在するべきElementの存在判定をすればいいのかもしれませんが、汎用性が無いので、動的にページを生成するスクリプトで面倒です。
代替案等がありましたら教えてください。

それと、今フォーカスしているリンクを取得する方法があればと思うんですが。

|

« Zaurus用iTunesネットワークリモコンRCTunes(3) | Main | Zaurus無線LAN自動再接続スクリプトwlan-re-establish »