Hatena::Groupptech

ぷちてく RSSフィード

Archive
 
ProfileProfile

2012-05-15

GreasemonkeyScriptとかUserScript書くときにボーっと考えてること

03:50

どーもこんちわ。いわゆるUserScriptをどんな感じに扱ってるか少し書いておくことにする。チョビチョビ書きだすようになったから。ちょっとリンク足してみた。ポエム

全般的には「すごく怖いものをあつかうことになるから手を出したくないのがいっぱいある」って、てい。拡張の特権こわい><

GM_ しない

書くのは極力素のUserScriptになるようにしててGM関数はBadPartsとまではいかないけどまず使わない。

移植性とか拡張に発展した時を考えてほぼ排除。とはいっても、今はたいしたもの書いてないから無くても平気って言ったほうがたぶん正しい。

だいたい必要に迫られて Bookmarklet書く*1 ⇒ UserScriptに仕上げていく って順番なんで、自然とこうなる。

「名前を言ってはいけないあの」・・アレだよアレ

生兵法こわい。漏らしそう。いろんな意味で

  • unsafeWindow
  • wrappedJSObject

unsafeWindowやらモロモロ排除してGreasemonkey Script → UserJSっぽいの化 とかはけっこうベタ線かも。

executeBrowserContext(funcOrString)の方へもってくアプローチはやってる

「素なUserScript」=?

こういう"素のJavaScriptで動いてるだけのUserScript"みたいな物体を何て呼べばいいか困ってる。感覚としては"POJO"みたいな呼びやすい名前がつくといいとおもう。

「ユーザースクリプト」「ユーザスクリプト」「UserScript」はグリモンのやつもそう呼んでる場合があってピタっとはこない。

単に"user.js" って呼んでタグもつけようと思ったけど、

  • UserCSSとの対比を考えてやめた
  • 将来JSじゃない言語のScriptが出たときにタグ・タイトル付けめんどくさい
    • .user.py とか .user.rb とか .user.pl みたいなの。もうあるのかな?

そんなんでUserScriptで通すことにする。JSじゃない言語のホスティングエンジンあっていいとおもうんだけどなー

「素なUserScript」のいいとこ

ただのJavaScriptだからクロスブラウザしやすいのはもちろんだけど、ブックマークレットでも実行できるのがべんり。頻繁に使わない人用には、

  • GistにUserScriptの本体おいておいてHatena::Letで@requireするだけ

って感じでブックマークレット提供できる。べんり

anonymous wrap

(function () { /* code */ })()する派。if (!condition) return;とかしたいし、あともろもろで

(function () { /* code */ }())のほうはどうもしっくりこなくて使ってない

GM_ するとき

それでもどうしても使わざるを得ない場面がある。それはGM_xmlhttpRequest(GM_XHR)。で、最近けっこうこまってる。前置きからじゅんばんに

XMLHttpRequest(XHR)

まず普通のXHR自体を極力使わないようにしてる。UserScriptでバンバンリクエスト飛ばしてると、Dos/DDoSブロックっぽいのが働いたりしてこわい。

スクレイピングみたいな文字列処理で取れるところはXHRで取れるとしても飛ばさない。

リクエストで サーバクライアント お互いのコストもある。しかたなく飛ばすときはできるだけ普通のXHRしたい。そんなかんじ

Cross-Domain-Request(XDR)とSame-Origin-Policy(SOP)

XDRしなけりゃだめな場合がきつい。具体的には Gist で動くやつなんだけど API アクセスがいるときとか。

Gist API モロモロアクセスとかだと、意図的にSame-Origin-Policyの壁を破壊して越えないと無理っぽな場合があって。

https://raw.github.com/gist/https://gist.github.com/https://api.github.com/gist/

Gist情報とってくるとき こんな感じにlocation.originまたがらなきゃ取れないとこがある

XHR2

XHR2ではサーバAccess-Control-Allow-Origin *(ACAO)とかしてくれれば普通のXHRのコードでXDRできるって捉えてるんだけど、

Gistの場合ヘッダなさそうな・・ちゃんと見ては無いんだけど。で、XHR2はだめっぽい

jQuery

GitHubだとjQueryがいるから@requireしなくてもjQuery.Ajax()とかjQuery.get()できる。

けどやっぱりSOPの壁がある。プラグイン入れればできるみたいだけど、分不相応なの@requireとかしたくないからパス

JSONP

はてなのTenでも殆ど手をつけてないのがJSONPjQuery.ajax({url:'https://example.com', dataType: 'jsonp', success: function (json) {}}

とかやるみたい?jQueryあんまり手つけたくないからやってないし、JSONPも凶器っぽいからちゃんと理解するまで結構こわい。戻りがJSONじゃなくても扱えればいいけど、そんなことできんのかなー

GM_xmlhttpRequest

っと、ここまで考えてGM_XHRしか選択肢がなさそうだな、と思うときになってやっと使うかんじ。そもそもGM関数全然おべんきょしてないからってのも。

よゆーでXDR出来るとか怖すぎる。XHRですむやつをGM_XHRしてると結構かきかえたい。もう一息でOperaでうごくのに、とかを避けたいてのもある。

こういうのあるからGM_XHR軽々しく使うとかこわすぎるんだすー。XHR2も。ちゃんとfinalUrl見ればいい時代になれるといいねぇ

window.postMessage

でゴニョるって手もあるみたいだね。iframe使って別ドメインから埋め込んでpostMessageで読み出し?とか使ったことないからあやふやだけど

それかlocalStorageつかってoriginチェックしてーって方もあるのかな。そうだとするとやっぱしmalaさんのやつとか見てると結構ポカしそうでこわい

localStorageはこういうのあるから、うっかりとかできないんだなー」っておもう ⇒ ほんとに便利なんだろうかと考える ⇒ よくわからない。「危なそうで触りたくないなー」ってマインドが優先する

はてなIDキャッシュできたら便利だなーとか一瞬妄想したときもあったけど、漏らしちゃったら結構すごいことになってしまいそう

なんで、使うとしても漏れて大丈夫な情報だけ格納しようと思ってるけど・・うーん、公開するようなやつで利用用途っていわれると なさげ

潮時かも

もうちゃんとグリモン本読んだほうがいいのかなー。なんかまだ早いきもするなー

Gistとかuserscripts.orgでかっこいいコード読んでるけど、やっぱ体系的なところは本にかなうやつはいない

「大変!オライリーちゃんが息してないの!」

なんか全然本ないなあああああ おおおおおオライリーどうしたー

Greasemonkey HacksGreasemonkeyスクリプティングTIPS&SAMPLES

あれっ・・和書でムラサキでサル本みたいなのなかったっけ・・勘違い? 洋書は・・英語の勉強にはいいね>< ひーん

*1Hatena::Let スタートが多い