[Greasemonkey] 『Twitter関連サービスで見つけた発言を「お気に入り」に登録する favorize』をいじってみた

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] tyoroさん作成の「ふぁぼらいず」を IE コンポーネントブラウザでも動かせるように改造してみました。対応サービスも増やしてみました。
[キーワード] Twitter,favorites,お気に入り,greasemonkey

« 03月15日のココロ日記(BlogPet) | トップページ | 先勝しなかった(BlogPet) »

2009.03.16

[Greasemonkey] 『Twitter関連サービスで見つけた発言を「お気に入り」に登録する favorize』をいじってみた

tyoroさん作成の Greasemonkey スクリプト favorize をいじって、IE (上で userscript を動かす仕組みを組み込み済みの環境)でも動くようにしたり、対応サービスを追加したりしてみました。

favorize (ふぁぼらいず) というのは、Twitter の「つぶやき(発言)」を検索、表示する機能のあるサービス(サイト)を閲覧中に、このつぶやきは「(Twitter の)お気に入り」に登録しておきたいというようなときに、その発言の近くに表示されている ☆ をクリックすると「お気に入り」に登録できるようにする Greasemonkey スクリプトです。

現在対応しているのは、
『ふぁぼったー』『twitter検索(via @shin1x1)』『笑点びゅーわ』『kichikutter』『ついったーじゃんくしょん』『twitter search(本家)』『witter検索(via @penguinana)』
の7サイトです。

tyoro.exe: Twitter関連のサイトでFavれるようにするグリモン 『Favorize』公開

ふぁぼったーが公式でfav対応したので機能を削除しました。
ついでにふーくんから要望があったのでbuzztter.comに対応しました。

tyoro.exe: Favorizeの更新

ベースにした 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 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


Twitter」カテゴリ内の最近の記事

プログラミング」カテゴリ内の最近の記事

品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/6737/44362846

この記事へのトラックバック一覧です: [Greasemonkey] 『Twitter関連サービスで見つけた発言を「お気に入り」に登録する favorize』をいじってみた:

コメント

コメントを書く




※イタズラ防止のため、メールアドレスを入力しないと投稿できません。

次からのコメント入力の手間を省くために、名前やメールアドレスをcookieに記憶しますか?


URL を入力すると、その URL にリンクがはられます。
なお、メールアドレスは公開されません。ご安心ください。


ワード

ニッセン

fujisan.co.jp

楽天市場