« 03月15日のココロ日記(BlogPet) | トップページ | 先勝しなかった(BlogPet) »
2009.03.16
[Greasemonkey] 『Twitter関連サービスで見つけた発言を「お気に入り」に登録する favorize』をいじってみた
tyoroさん作成の Greasemonkey スクリプト favorize をいじって、IE (上で userscript を動かす仕組みを組み込み済みの環境)でも動くようにしたり、対応サービスを追加したりしてみました。
favorize (ふぁぼらいず) というのは、Twitter の「つぶやき(発言)」を検索、表示する機能のあるサービス(サイト)を閲覧中に、このつぶやきは「(Twitter の)お気に入り」に登録しておきたいというようなときに、その発言の近くに表示されている ☆ をクリックすると「お気に入り」に登録できるようにする Greasemonkey スクリプトです。
現在対応しているのは、
tyoro.exe: Twitter関連のサイトでFavれるようにするグリモン 『Favorize』公開
『ふぁぼったー』『twitter検索(via @shin1x1)』『笑点びゅーわ』『kichikutter』『ついったーじゃんくしょん』『twitter search(本家)』『witter検索(via @penguinana)』
の7サイトです。
ふぁぼったーが公式でfav対応したので機能を削除しました。
tyoro.exe: Favorizeの更新
ついでにふーくんから要望があったのでbuzztter.comに対応しました。
ベースにした favorize は上記、2008年12月01日の版です。
新たに対応したサービス(サイト)は、以下の 4つ です。
- twitority (followされている人の数が多いユーザの発言を検索結果の上位に表示する方式のTwitter検索)
- BackTweets (TinyURL 等の短縮URLを展開した状態の URL も検索対象とする Twitter 検索)
- Twiple! (マイクロブログ横断検索)
- Twingly Microblog Search (マイクロブログ横断検索)
あと、「twitter検索(@penguinanaさん)」対応部分の XPath をいじりました。Twitter の「お気に入り」に登録する API の URL も現在の仕様に合わせて直しました。
なお、以前は、Twitter にログイン済みの状態のままであれば、☆ をクリックするだけで、「お気に入りに登録」することができたのですが、いま(2008年12月の中旬ころから)は、最初の ☆ クリック時に、ユーザ名、パスワードを入力するダイアログが表示されるようになりました(Twitter 以外のサイトを閲覧中に API 実行要求をしたときの挙動が変わりました。おそらくセキュリティ対策の一環だと思われます)。ダイアログが表示されましたら、Twitter のユーザ名とパスワードを入力してください。
動作確認は、Firefox 3.0.3、3.0.7 と拙作の Webブラウザ tumblen3 で行なっています。IE6(以降) + turnabout でも、そのまま動くと思います。
ダウンロード
オリジナルとの差分
以下、オリジナル(2008年12月1日版)との差分(context diff)です。
*** orig\favorize.user.js Mon Dec 1 23:36:52 2008
--- update\favorize.user.js Sat Mar 14 04:05:18 2009
***************
*** 9,14 ****
--- 9,18 ----
// @include http://search.twitter.com/*
// @include http://pcod.no-ip.org/yats/*
// @include http://buzztter.com/ja/k/*
+ // @include http://www.twitority.com/*
+ // @include http://backtweets.com/*
+ // @include http://twiple.jp/status/*
+ // @include http://www.twingly.com/*
// ==/UserScript==
// author: tyoro ( http://tyoro.orz.ne.jp/exe/ )
***************
*** 18,23 ****
--- 22,28 ----
var entry_x_path;
var id_x_path;
var id_reg;
+ var IE='\v'=='v'; /* {@@} */
switch(domain_str){
/* case 'favotter.matope.com':
***************
*** 51,58 ****
id_reg = /.*\/(.*)/;
break;
case 'pcod.no-ip.org':
! entry_x_path = '//tr[@class="xfolkentry"]';
! id_x_path = 'td/a[@class="taggedlink"]';
id_reg = /.*\/(.*)/;
break;
case 'buzztter.com':
--- 56,67 ----
id_reg = /.*\/(.*)/;
break;
case 'pcod.no-ip.org':
! // entry_x_path = '//tr[@class="xfolkentry"]';
! // id_x_path = 'td/a[@class="taggedlink"]';
!
! entry_x_path = '//li[@class="hentry"]'; /* @@ */
! id_x_path = 'div[@class="meta"]/span[@class="date"]/a'; /* @@ */
!
id_reg = /.*\/(.*)/;
break;
case 'buzztter.com':
***************
*** 60,69 ****
id_x_path = 'a[@class="taggedlink"]';
id_reg = /.*\/(.*)/;
break;
}
! var path_to_api = 'http://twitter.com/favourings/create/';
!
var formap = function(arr,callback,_index) {
var _arr = [];
for(var i = _index || 0, len = arr.length; i < len; i++) {
--- 69,102 ----
id_x_path = 'a[@class="taggedlink"]';
id_reg = /.*\/(.*)/;
break;
+
+ case 'www.twitority.com': /* @@ */
+ entry_x_path = '//div[@class="tweet"]/p[@class="info"]'; /* @@ */
+ id_x_path = 'a[2]'; /* @@ */
+ id_reg = /.*\/(.*)/; /* @@ */
+ break; /* @@ */
+
+ case 'backtweets.com': /* @@ */
+ entry_x_path = '//div[@class="timeline"]/p'; /* @@ */
+ id_x_path = 'small/a'; /* @@ */
+ id_reg = /.*\/(.*)/; /* @@ */
+ break; /* @@ */
+
+ case 'twiple.jp': /* @@ */
+ entry_x_path = '//div[@class="item twitter"]'; /* @@ */
+ id_x_path = 'div[@class="content"]/span[@class="date"]/a'; /* @@ */
+ id_reg = /.*\/(.*)/; /* @@ */
+ break; /* @@ */
+
+ case 'www.twingly.com': /* @@ */
+ entry_x_path = '//div[@class="info"]/p[@class="links"]'; /* @@ */
+ id_x_path = 'a[2][contains(@href,"http://twitter.com/")]'; /* @@ */
+ id_reg = /.*\/(.*)/; /* @@ */
+ break; /* @@ */
}
! //var path_to_api = 'http://twitter.com/favourings/create/';
! var path_to_api = 'http://twitter.com/favorites/create/'; /* @@ */
var formap = function(arr,callback,_index) {
var _arr = [];
for(var i = _index || 0, len = arr.length; i < len; i++) {
***************
*** 80,86 ****
formap(updates,addFavoritesButton,index);
index = updates.length;
} catch(e) {
! //alert("error"+e);
}
}
}
--- 113,119 ----
formap(updates,addFavoritesButton,index);
index = updates.length;
} catch(e) {
! // alert("error"+e);
}
}
}
***************
*** 97,104 ****
starImg.id = 'status_star_'+id;
var starLink = document.createElement('a');
!
! starLink.addEventListener('click', function(){ addFavoritesStar(id); } , false);
starLink.setAttribute('style','cursor:pointer;');
starLink.appendChild(starImg);
e.appendChild(starLink);
--- 130,140 ----
starImg.id = 'status_star_'+id;
var starLink = document.createElement('a');
! if (IE) /* {@@} */
! starLink.attachEvent("on" + "click", function(){ addFavoritesStar(id); }); /* {@@} */
! else /* {@@} */
! starLink.addEventListener('click', function(){ addFavoritesStar(id); } , false);
!
starLink.setAttribute('style','cursor:pointer;');
starLink.appendChild(starImg);
e.appendChild(starLink);
***************
*** 110,143 ****
mainloop();
function addFilter(filter, i) {
! i = i || 4
if (window.AutoPagerize && window.AutoPagerize.addFilter) {
! window.AutoPagerize.addFilter(filter)
}
else if (i > 1) {
! setTimeout(arguments.callee, 1000, filter, i - 1)
}
}
// cho45 - http://lowreal.net/
function $x(exp, context) {
if (!context) context = document;
! var resolver = function (prefix) {
! var o = document.createNSResolver(context)(prefix);
! return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
}
! var exp = document.createExpression(exp, resolver);
! var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
! result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
return len != 0 ? ret : null;
}
}
--- 146,189 ----
mainloop();
function addFilter(filter, i) {
! i = i || 4;
if (window.AutoPagerize && window.AutoPagerize.addFilter) {
! window.AutoPagerize.addFilter(filter);
}
else if (i > 1) {
! setTimeout(arguments.callee, 1000, filter, i - 1);
}
}
// cho45 - http://lowreal.net/
function $x(exp, context) {
+
if (!context) context = document;
!
! var resolver;
! var _exp;
! if (!IE) {
! resolver = function (prefix) {
! var o = document.createNSResolver(context)(prefix);
! return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
! }
! _exp = document.createExpression(exp, resolver);
}
! var result = !IE ? _exp.evaluate(context, XPathResult.ANY_TYPE, null)
! : document.evaluate(exp, context, null, XPathResult.ANY_TYPE, null);
!
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
! result = !IE ? _exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
! : document.evaluate(exp, context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
+
return len != 0 ? ret : null;
}
}
***************
*** 146,160 ****
function addFavoritesStar(id) {
var api = path_to_api + id + '.xml';
var callback = function(res){
if(res.status == 200 ){
! document.getElementById('status_star_'+id).src='http://twitter.com/images/icon_star_full.gif';
}else{
! document.getElementById('status_star_'+id).src='http://twitter.com/images/icon_star_empty.gif';
}
! }
! ;
GM_xmlhttpRequest({
method: 'POST',
--- 192,208 ----
function addFavoritesStar(id) {
+ var img = document.getElementById('status_star_'+id); /* @@ */
var api = path_to_api + id + '.xml';
var callback = function(res){
if(res.status == 200 ){
! img.src='http://twitter.com/images/icon_star_full.gif'; /* @@ */
}else{
! img.src='http://twitter.com/images/icon_star_empty.gif'; /* @@ */
}
! img.height = 16; /* @@ */
! img.width = 16; /* @@ */
! };
GM_xmlhttpRequest({
method: 'POST',
***************
*** 162,168 ****
onload: callback
});
! document.getElementById('status_star_'+id).src='http://twitter.com/images/icon_throbber.gif';
}
--- 210,216 ----
onload: callback
});
! img.src='http://twitter.com/images/icon_throbber.gif'; /* @@ */
}
投稿者: tsupo 2009.03.16 午前 05:43
| 固定リンク
|
|
| ![]()
|
|
アマゾンわくわく探検隊
トラックバック
この記事のトラックバックURL:
この記事へのトラックバック一覧です: [Greasemonkey] 『Twitter関連サービスで見つけた発言を「お気に入り」に登録する favorize』をいじってみた:



