オートコンプリートがオフのパスワード入力を自動入力するユーザースクリプト


自分がよく利用するサイトに、楽天リサーチhontoがあるのですが、この二つのサイトはログイン画面のフォームのオートコンプリートがオフになっており、ログイン画面を開くとパスワードが自動入力されていない状態となっています(IDは自動入力しているようです。hontoはチェックボックスにチェックを入れなければいけませんが)。

正直、毎回毎回パスワードを入力しなくちゃいけないのはすごい面倒です。面倒だから簡単なパスワードや使い回しのパスワードを使ってしまい、パスワードが簡単にバレてしまうという問題も起こりかねないと思うのですが・・・。

というわけで、簡単なものですが、パスワードの入力ボックスを自動入力するユーザースクリプトを作ってみました。

やっていることは単純で、URLを調べて該当の文字列があれば(今回の場合、hontoでは’honto.jp/reg/login.html’)、その中のパスワード入力ボックスを探してパスワードを入力するという処理を行っています。
上記のソースコードをコピーして、”********”の箇所を自分のパスワードに書き換え、拡張子が.user.jsとして保存し、Chromeの拡張機能ページ(chrome://extensions/)を開いた状態でドラッグアンドドロップすると機能するはずです。
自動的にログインボタンを押す機能もつけようと思ったらできるのですが、パスワードが間違っていた場合に無限ループに陥ってしまう可能性があるため、やめておきました。そういう場合でも対策はあるとは思うのですが・・・。

ところで、hontoのほうではgetElementByIdを使ってパスワード入力ボックスのDOMオブジェクトを取得し、楽天リサーチのほうではquerySelectorでinputタグのtype属性がpasswordになっているところを見つけてパスワード入力ボックスのDOMオブジェクトを取得しています。hontoのほうもdocument.querySelector(“input[type=’password’]”)で取得できると思いますが、最初はどちらもgetElementByIdで取得しようと思ったためにこういう書き方になっています。
なぜか、楽天リサーチのほうでgetElementByIdを使ってDOMオブジェクトを取得しようとするとうまくいきませんでした。パスワード入力ボックスのIDには”loginInner”というIDが振られているようなのですが、、document.getElementById(‘loginInner’)としてもなぜかうまくいかない・・・。おかしいなぁ。なんでだろう・・・。と思って詳しく調べてみたら・・・、なんとログインフォームを囲んだdivタグのID名がloginInner・・・。さらにはユーザIDの入力ボックスのID名もloginInner・・・。
知っている人も多いと思いますが、ID属性は一意識別子をあらわし、同じページでは同じID名を重複してはいけないということになっています(参考:id 属性 – グローバル属性 – HTML5 タグリファレンス – HTML5.JP)。
楽天のような大きな会社でもこういうページがあるということにちょっと驚きました(自分も想定外の仕様変更で重複させてしまったということはあるので、人のことは言える立場じゃないです・・・)。

ニコニコ動画のGETパラメータ付きリンクを取り除くユーザースクリプト書いた


他のブログでも書いたけど、書くことないのでこちらでも。

最近、ニコニコ動画を見ていると、動画リンクにrefというGETパラメータがついているのですが、正直これがものすごい邪魔(例えばこんな感じ:【ニコニコ募金】東日本大震災 支援メッセージ動画 ‐ ニコニコ動画:GINZA)。
自分ははてなブックマークのChrome拡張使っているのですが、これがあるとちゃんとパラメータなしのブクマ数がわからないんですよね。
というわけで、特別なことをしているわけではないけれども、動画リンクのリファラを取り除くスクリプト書いてみた(追記:非推奨)。

上記スクリプトをコピペしたテキストファイルを保存し、拡張子『.user.js』で保存。
それを、Chromeの拡張機能ページにドラッグアンドドロップすると動くはずです。

動作としては、”www.nicovideo.jp”というドメイン内でaタグのリンク先に”watch/”が含まれていたら、そのリンクの”?”以降を除いたアドレスに置き換えるというもの。
問題点としては、ニコニコ動画内でないと動かないということと、もし万が一動画リンクにおいて大切なリファラがあればそれまで取り除いてしまうということかな。後は、動画リンク以外の”watch/”が含まれるリンクにも有効ということとかな。
実装は甘々だし、そもそもユーザースクリプトの書き方としてこれはあってるのか分かりませんが、参考までに(しょせん、自分用ですし、今のところ問題はなさそうなので)。

なお、今調べてみると、ユーザースクリプトは

のように、”(function(){“と”})();”で囲むのが一般的だそうです・・・。
参考:ユーザースクリプトの書き方 – UCHD
参考:ChromeのUser Scriptを手抜きで書いてみた – kanonjiの日記

というわけで、書きなおしてみた。

即時関数というらしい。名前衝突の回避用なんだとか。
if文の中での変数宣言も影響あったっけ? まあ、どちらにしろ書いたほうが安全ではあるか。