2010年07月06日

POSTメソッドのログインフォームに自動ログインするブックマークレット用の設定部分を生成するブックマークレット

POSTメソッドのログインフォームに自動ログインするブックマークレット」用の設定部分を生成するブックマークレットです。

添付ファイル
forAutoLogin

改行を入れるとこんな感じです。

javascript:(function(){
var a,d=document,b=d.body.tagName,c=/^body$/i.test(b),e=frames.length,f=d.forms,i,j,n='',o='/',u=d.baseURI||location,v=u.split(o),w,x,z;
a=!c?b:e?'iframe:'+e+'\n':n;
a+=c&&!f[0]?'form:0\n':n;
for(i=0;i<f.length;i++){
  b=f[i];
  if(/^post$/i.test(b.method)){
    z=b.getAttributeNode('action');
    z=z?z.value:u;
    w=z.split('../');
    x=w.length;
    z=z==n?u:/^https?:\/\//i.test(z)?z:v.slice(0,z[0]==o?3:v.length-x).join(o)+o+w[x-1].replace(/^\.?\//,n);
    a+='\''+z+'\',{';
    e=b.elements;
    for(j=0;j<e.length;j++){
      c=e[j];
      a+=/^(text|password|hidden)$/i.test(c.type)?'\''+c.name+'\':\''+c.value+'\',':n;
    }
    a=a.replace(/,$/,n)+'}\n';
  }else{a+='get\n';}
}
alert(a);
})();
  • postメソッドのフォームしか取得しません。
  • textとpasswordとhiddenしか取得しません。
  • フレームページでは使えません。
  • 「FRAMESET」と表示された場合はフレームページです。目的のログインフォームが取得できなかった場合は、個別のフレームを開いてやり直してください。
  • 「iframe:n」と表示された場合はページにiframe要素が含まれます。目的のログインフォームが取得できなかった場合は、個別のiframeを開いてやり直してください。
  • 「form:0」と表示された場合はページにform要素が含まれません。同時に「iframe:n」と表示されている場合は目的のログインフォームはiframe内に含まれているかもしれません。個別のiframeを開いてやり直してください。
  • 「get」と表示された場合はform要素のmethod属性の値がgetです。
  • form要素が複数ある場合はその数だけ表示されます。

WindowsXPのFirefox3.6で確認しました。IE6はアドレスバーに書き込める最大文字数を超えているので動きませんでした。

posted by 掛け出汁 at 20:40 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

POSTメソッドのログインフォームに自動ログインするブックマークレット用の設定部分の例

POSTメソッドのログインフォームに自動ログインするブックマークレット」用の設定部分の例です。

詳しくは「POSTメソッドのログインフォームに自動ログインするブックマークレット」に書いています。

Yahoo! JAPAN
'https://login.yahoo.co.jp/config/login',{'login':'ID','passwd':'PASSWORD'}
Yahoo!メール
'https://login.yahoo.co.jp/config/login',{'login':'ID','passwd':'PASSWORD','.done':'http://mail.yahoo.co.jp'}
一度もYahoo!JAPANにアクセスしていない場合はログイン後Yahoo!JAPANのトップページが表示されます。
Yahoo!ブログ
'https://login.yahoo.co.jp/config/login',{'login':'ID','passwd':'PASSWORD','.done':'http://blogs.yahoo.co.jp/FRONT/mypage.html'}
一度もYahoo!JAPANにアクセスしていない場合はログイン後Yahoo!JAPANのトップページが表示されます。
livedoor
'https://member.livedoor.com/login/index',{'.next':'','.sv':'top','livedoor_id':'ID','password':'PASSWORD'}
livedoorメール
'https://member.livedoor.com/login/index',{'.next':'http://member.livedoor.com/gmail/go','.sv':'mail','livedoor_id':'ID','password':'PASSWORD'}
livedoor Blog
'https://member.livedoor.com/login/index',{'.next':'http://blog.livedoor.com/','.sv':'blog','livedoor_id':'ID','password':'PASSWORD'}
goo
'https://login.mail.goo.ne.jp/id/authn/Login',{'uname':'ID','pass':'PASSWORD','Site':'www.goo.ne.jp','Success':'http://www.goo.ne.jp/'}
gooメール
'https://login.mail.goo.ne.jp/id/authn/Login',{'uname':'ID','pass':'PASSWORD','Site':'mail.goo.ne.jp','Success':'http://mail.goo.ne.jp'}
gooブログ
'https://login.mail.goo.ne.jp/id/authn/Login',{'uname':'ID','pass':'PASSWORD','Site':'blog.goo.ne.jp','Success':'http://blog.goo.ne.jp/admin/'}
エキサイト
'https://sec.excite.co.jp/idcenter/login_req/?pname=xmy&brand=xcit&targeturl=http%3A%2F%2Fwww.excite.co.jp%2F',{'acctname':'ID','passwd':'PASSWORD'}
エキサイトメール
'https://sec.excite.co.jp/idcenter/login_req/?pname=mail&brand=xcit&targeturl=http%3A%2F%2Fwww.excite.co.jp%2Fmail%2F',{'acctname':'ID','passwd':'PASSWORD'}
エキサイトブログ
'https://sec.excite.co.jp/idcenter/login_req/?pname=blog&brand=xcit&targeturl=http%3A%2F%2Fwww.exblog.jp',{'acctname':'ID','passwd':'PASSWORD'}
Seesaa ブログ
'https://ssl.seesaa.jp/www/pages/welcome/login/input',{'member__email':'ID(MAIL)','member__password':'PASSWORD','WZD_RETURN_URL':'http://blog.seesaa.jp/pages/my/home/?now_logined=1','WZD_PARAM':'return_url=http://blog.seesaa.jp/pages/my/home/?now_logined&load=/pages/welcome/login/input'}
Ameba
'https://www.ameba.jp/login.do',{'amebaId':'ID','password':'PASSWORD'}
QLOOKパスポート
'https://www.qlook.net/signin.html',{'addr1':'ID(MAIL)','pass':'PASSWORD'}
フォト蔵モバイル
'http://m.photozou.jp/basic/login',{'email':'ID(MAIL)','password':'PASSWORD'}
モバイルじゃないほうはうまくいきませんでした。
posted by 掛け出汁 at 20:37 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

POSTメソッドのログインフォームに自動ログインするブックマークレット

javascript:(function(u,o){var w=window,d=document,f=d.createElement('form'),e,i;(location=='about:blank'?w:open()||w).document.body.appendChild(f);f.action=u;f.method='POST';for(i in o){e=d.createElement('input');e.name=i;e.value=o[i];e.type='hidden';f.appendChild(e);}f.submit();})('/*フォーム要素のaction属性の値*/',{/*各フォームコントロールのname属性の値とvalue属性の値*/});

改行を入れるとこんな感じです。

javascript:(function(u,o){
  var w=window,d=document,f=d.createElement('form'),e,i;
  (location=='about:blank'?w:open()||w).document.body.appendChild(f);
  f.action=u;
  f.method='POST';
  for(i in o){
    e=d.createElement('input');
    e.name=i;
    e.value=o[i];
    e.type='hidden';
    f.appendChild(e);
  }
  f.submit();
})('/*フォーム要素のaction属性の値*/',{/*各フォームコントロールのname属性の値とvalue属性の値*/});

'/*フォーム要素のaction属性の値*/',{/*各フォームコントロールのname属性の値とvalue属性の値の組み合わせ*/}」の具体例としては、Yahoo!JAPANの場合は「'https://login.yahoo.co.jp/config/login',{'login':'ID','passwd':'PASSWORD'}」といった感じです。

GoogleとMSN(live.com)では使えませんでした。Googleはアクセスすると与えられる特別な値が必要で、MSNはJavaScriptかCookieが必要っぽいです。ほかにも使えないところがあると思います。

  • WindowsXPのFirefox3.6で確認しました。
  • WindowsXPのFirefox4.0b2preで確認しましたが、動きませんでした。actionに指定されたページが開くけど各フォームコントロールの値が空になってるようです。Firefox4.0の正式版が出るまでに動くようにしたいです。
  • WindowsXPのGoogleChrome5で確認しましたが、うまく動きませんでした。現在のタブがabout:blankのときにうまく動きませんでした。
  • WindowsXPのIE6で確認しましたが、うまく動きませんでした。ポップアップがブロックされていなくて新規ウィンドウが開くときにうまく動きませんでした。
posted by 掛け出汁 at 20:32 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2010年06月14日

双葉のID表示、IP表示のスレでID、IPをポップアップさせるGreasemonkeyスクリプトを書き直しました

双葉のID表示、IP表示のスレでID、IPをポップアップさせるGreasemonkeyスクリプト」を書き直しました。

前のものよりはよくなっているつもりです。

  • Windows XP SP3、Firefox 3.6、Greasemonkey 0.8.20100408.6、で確認しました。
  • Windows XP SP3、Firefox 3.6、userChromeJS 1.1、サブスクリプトローダなし、userContent.js 1.3 mod6、userContent.pl.jsなし、GM_modoki.jslなし、で確認しました。
添付ファイル
userContent_2chan_resIDorIP_20100614{^.2chan.net+^+res+^}.user.js
posted by 掛け出汁 at 19:29 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2010年06月06日

DOMのRangeを使って特定の文字列をすべて別の要素に置き換えることができたけど

ドキュメント内の特定の文字列を別の要素に置き換えるには、DOMのRangeを使うといいそうです。Rangeを使うのは初めてなので、Rangeの基本的なことが説明されている「range - MDC」と「JavaScriptでDOMレンジを扱う / CodeGuru - japan.internet.com コラム」というページを見ながらRangeを使ってみました。

特定の文字列が複数箇所にあって、それらすべてを別の要素に置き換えるようなサンプルは載っていなかったので、長いこと暗中模索しました。なんとか思い通りの動作になったので喜んでいたのですが、動くには動くものの、いい書き方ではない書き方をしていたようです。「効率的な JavaScript - Opera Developer Community」の「DOM を辿りながら書き換えるのはやめよう」に書かれていました。

思いつきで書いたもの
<html>
<head>
<script>
window.addEventListener("load", func0, false);
function func0(event) {
  event.currentTarget.removeEventListener(event.type, arguments.callee, false);
//  var start = (new Date()).getTime();
  func1(document.getElementById("test"));
//  alert((new Date()).getTime() - start);
};
function func1(aElement) {
  for (var i = 0; i < aElement.childNodes.length; i++) {
    if (!/hoge/.test(aElement.childNodes[i].textContent)) {
      continue;
    }
    if (aElement.childNodes[i].hasChildNodes()) {
      arguments.callee(aElement.childNodes[i]);
    } else {
      var span = document.createElement("span");
      var range = document.createRange();
      range.setStart(aElement.childNodes[i], /hoge/.exec(aElement.childNodes[i].textContent).index);
      range.setEnd(aElement.childNodes[i], /hoge/.exec(aElement.childNodes[i].textContent).index + /hoge/.exec(aElement.childNodes[i].textContent)[0].length);
      range.surroundContents(span);
      range.detach();
      span.style.color = "red";
      i++;
    }
  }
};
</script>
</head>
<body>
  <div id="test">
hogehugahugahugahogehugahogehuga<br>
hoge<br>
hogehugahugahugahogehugahogehuga<br>
<span>hugahoge</span><br>
hogehugahugahugahogehugahoge<br>
<span>hugahoge</span><br>
<span>hogehugahoge<span>hugahogehugahoge</span>hugahogehuga</span><br>
<span>hugahoge</span>
  </div>
</body>
</html>
  • ループ中にノードの数が変わってしまうような処理をすると、反復するたびにノードの数を数え直さないといけない。
  • #textノードの特定の文字列を別の要素に置き換えると、もともとひとつだったノードがみっつ(ふたつの場合もあるかも)に分断されてしまい、置き換えた要素が次の反復でまた処理されるので、別の要素に置き換えたときはさらにインクリメントしないといけない。
DOM を辿りながら書き換えるのはやめよう」を参考に書き直したもの
<html>
<head>
<script>
window.addEventListener("load", func0, false);
function func0(event) {
  event.currentTarget.removeEventListener(event.type, arguments.callee, false);
//  var start = (new Date()).getTime();
  var temp = [];
  func1(document.getElementById("test"), temp);
  func2(temp);
  temp = null;
//  alert((new Date()).getTime() - start);
};
function func1(aElement, temp) {
  for (var i = 0, length = aElement.childNodes.length; i < length; i++) {
    if (!/hoge/.test(aElement.childNodes[i].textContent)) {
      continue;
    }
    if (aElement.childNodes[i].hasChildNodes()) {
      arguments.callee(aElement.childNodes[i], arguments[1]);
    } else {
      var myArray = [];
      while ((myArray = /hoge/g.exec(aElement.childNodes[i].textContent)) !== null) { //正規表現にgフラグ
        temp[temp.length] = [aElement.childNodes[i], myArray.index, myArray[0].length];
      }
      myArray = null;
    }
  }
};
function func2(temp) {
  var i = temp.length;
  while (i--) { //逆から
    var span = document.createElement("span");
    var range = document.createRange();
    range.setStart(temp[i][0], temp[i][1]);
    range.setEnd(temp[i][0], temp[i][1] + temp[i][2]);
    range.surroundContents(span);
    range.detach();
    span.style.color = "red";
  }
};
</script>
</head>
<body>
  <div id="test">
hogehugahugahugahogehugahogehuga<br>
hoge<br>
hogehugahugahugahogehugahogehuga<br>
<span>hugahoge</span><br>
hogehugahugahugahogehugahoge<br>
<span>hugahoge</span><br>
<span>hogehugahoge<span>hugahogehugahoge</span>hugahogehuga</span><br>
<span>hugahoge</span>
  </div>
</body>
</html>
  • ノードが分断されないので、ひとつのノードの中に特定の文字列が複数ある場合のために正規表現にgフラグを付ける必要がある。
  • Rangeを別の要素に置き換えるときはノードが分断されてノードの数が変わるので、数が変わっても影響がないように後ろから処理する。

最初のループでは、別の要素に置き換えたい文字列があるノードとそのノードの中の文字列の位置を探すだけにして、次のループで、最初のループで探したノードと位置の情報を元に文字列と要素を置き換えるようにしたほうがいいみたいです。書き直したもので本当にいいのか自信はありませんが、書き直す前よりはいいような気がします。「双葉のID表示、IP表示のスレでID、IPをポップアップさせるGreasemonkeyスクリプト」の該当箇所を書き直さないと。

正規表現にgフラグを使用する場合の文字列の検索は、「exec - MDC」に書かれているものをそのまま使っています。

posted by 掛け出汁 at 21:13 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする