閲覧中のサイトのURLをbit.lyで短縮化し、twitterへ投稿する

(「twitterに今みているページを投稿するブックマークレット - notes plastiques」とやりたい事は同じなのですが、たまにちゃんと動かなかったり、コードがすこし冗長だと思ったので新しく作りなおしました。)

今回は、API keyを使用するものと、使用しないものを用意しました。

また、twitterAPIを使用するスクリプトも用意しました。(3/22)こちらはMITライセンスが適用されます

ブックマークレットなので著作権表示を削除しました…まずいかな汗;

API keyを使用しない

API keyを使用しないのですぐに使えます。

TwitterAPIを使用
このスクリプトは2010-06-30をもって利用できなくなります。

javascript:var public_bitlytter=(function(){this.on_load_document=function(data){var status=data.value.items[0].description+("\x20"+document.title).replace(/[\r\n\t\x20]+/g,"\x20");do{status=prompt("Post to twitter",status);if(!status){return;}}while(status.length>140);var d=document;var i1=d.createElement('iframe');i1.style.display='none';d.body.appendChild(i1);var tid;if(/*@cc_on!@*/false){tid='_self';setTimeout(function(){d.body.removeChild(i1);},5000);}else{tid='TwitterApiID';var i2=d.createElement('iframe');i2.name=tid;i2.style.display='none';d.body.appendChild(i2);if(navigator.userAgent.indexOf('Firefox')>=0){window[tid+'flg']=true;};var onunload=function(){if(window[tid+'flg']){delete window[tid+'flg'];return;}setTimeout(function(){d.body.removeChild(i1);d.body.removeChild(i2);},500);};var w2=i2.contentWindow;if(w2.attachEvent){w2.attachEvent("onunload",onunload);}else{w2.addEventListener("unload",onunload,false);}}d=i1.contentWindow.document;d.open();d.write(unescape("%3Cbody%3E%3C/body%3E"));d.close();var iform=d.createElement("form");iform.id="iform";iform.method="post";iform.action="https://twitter.com/statuses/update.xml";iform.target=tid;iform.setAttribute("Accept-charset","utf-8");var ist=d.createElement("input");ist.type="hidden";ist.name="status";ist.value=status;iform.appendChild(ist);d.body.appendChild(iform);iform.submit();};var s=document.createElement('script');s.charset='utf-8';s.src='http://pipes.yahoo.com/aont/bitly?url='+encodeURIComponent(location.href)+'&_render=json&_callback=public_bitlytter.on_load_document';document.body.appendChild(s);return this;})();

Webへ飛ぶ

javascript:var public_bitlytter=(function(w){this.w=w;this.w.document.body.innerHTML="Please wait...";this.on_load_document=function(data){this.w.location.href="http://twitter.com/?status="+encodeURIComponent(data.value.items[0].description+"\x20"+document.title);};var s=document.createElement('script');s.charset='utf-8';s.src='http://pipes.yahoo.com/aont/bitly?url='+encodeURIComponent(location.href)+'&_render=json&_callback=public_bitlytter.on_load_document';document.body.appendChild(s);return this;})(window.open());

仕組みはこうです。

というように短縮化したいURLを伝えてbit.lyのページを取得します。そうすると、HTMLページ中に短縮化されたアドレスが書いてあります。その部分を切り出してきます。

ところで、Yahoo pipesJSON形式で出力することにも対応しているのでJSONを動的に読み込ませます。そして、コールバックによってデータを受け取るということをしています。

API keyを使用

API keyを使用するのでアクセス数などをみることが出来ます。
TwitterAPIを使用
このスクリプトは2010-06-30をもって利用できなくなります。

javascript:var bitlytter=(function(){this.login="you";this.key="key";this.callback=function(bitlyResponse){var status;for(var r in bitlyResponse.results){status=bitlyResponse.results[r].shortUrl+("\x20"+document.title).replace(/[\r\n\t\x20]+/g,"\x20");break;}do{status=prompt("Post to twitter",status);if(!status){return;}}while(status.length>140);var d=document;var i1=d.createElement('iframe');i1.style.display='none';d.body.appendChild(i1);var tid;if(/*@cc_on!@*/false){tid='_self';setTimeout(function(){d.body.removeChild(i1);},5000);}else{tid='TwitterApiID';var i2=d.createElement('iframe');i2.name=tid;i2.style.display='none';d.body.appendChild(i2);if(navigator.userAgent.indexOf('Firefox')>=0){window[tid+'flg']=true;};var onunload=function(){if(window[tid+'flg']){delete window[tid+'flg'];return;}setTimeout(function(){d.body.removeChild(i1);d.body.removeChild(i2);},500);};var w2=i2.contentWindow;if(w2.attachEvent){w2.attachEvent("onunload",onunload);}else{w2.addEventListener("unload",onunload,false);}}d=i1.contentWindow.document;d.open();d.write(unescape("%3Cbody%3E%3C/body%3E"));d.close();var iform=d.createElement("form");iform.id="iform";iform.method="post";iform.action="https://twitter.com/statuses/update.xml";iform.target=tid;iform.setAttribute("Accept-charset","utf-8");var ist=d.createElement("input");ist.type="hidden";ist.name="status";ist.value=status;iform.appendChild(ist);d.body.appendChild(iform);iform.submit();};var s=document.createElement("script");s.charset="utf-8";s.src="http://api.bit.ly/shorten?version=2.0.1&login="+login+"&apiKey="+key+"&longUrl="+encodeURIComponent(location.href)+"&callback=bitlytter.callback";document.body.appendChild(s);return this;})();

Webで投稿

javascript:var bitlytter=(function(w){this.login="you";this.key="apikey";this.w=w;this.w.document.body.innerHTML="Please wait...";this.callback=function(bitlyResponse){var short;for(var r in bitlyResponse.results){short=bitlyResponse.results[r].shortUrl;break;}this.w.location.href="http://twitter.com/?status="+encodeURIComponent(short+"\x20"+document.title);};var s=document.createElement("script");s.charset="utf-8";s.src="http://api.bit.ly/shorten?version=2.0.1&login="+login+"&apiKey="+key+"&longUrl="+encodeURIComponent(location.href)+"&callback=bitlytter.callback";document.body.appendChild(s);return this;})(window.open());

です。ただし、

を見て、this.login="you";this.key="apikey";の部分を書き換えてください。
仕組みはこうです。

というURLを読み込みますとJSONが返ってきます。これを実行すると、callback関数にURL短縮化の情報を渡されます。そして、そのcallback関数で短縮化アドレス取得してtwitter投稿ページに飛ばすということをしています。

以前のスクリプトとの違い

  • 以前はbitlyライブラリが書かれているスクリプトを動的に読み込んで実行していたが、今回はJSONを使用することでソースがスマートになった
  • 原因は不明だが、twitterのページへ移動しないケースがあったのが改善された