Hatena::Groupstudyroom

文::字

2007-12-01

Favotterに直接favするボタンをつけるGreaseMonkeyスクリプト 13:42 Favotterに直接favするボタンをつけるGreaseMonkeyスクリプト - 文::字 を含むブックマーク

<追記>

os0xさんがMinibuffer用のTwitter Post & Favコマンドを作られたので、そっちのほうを使ったほうがいいです。

http://d.hatena.ne.jp/os0x/20071201/1196460723

以下のスクリプトはあくまで勉強用に作ったものなので、信頼性が低いです。

</追記>

<追記2>

ふぁぼったーの仕様変更で動かなくなっていたのですが、jt_noSkeさんが修正して動くようにしてくれました。ここに載せている「インストール」リンクと、ソースコードにも反映しておきました。Tnx!

</追記2>

かなり動作がもっさりしてるんだけど、一応作ってみた。

FavotterでFavってない発言があると、日時表示の右に「Favに追加」という文字が出る。

「Favに追加」という文字をクリックすると、自分のFavに追加するリクエストが始まる。

追加が終了すると、「Fav済」という文字に変わる。

ダメっぽいところ:

  • 正規表現使ってるところが多くてソースが汚い
  • document.evaluateを2回使ってるんだけど1回に減らせるのだろうか
  • AutoPagerize非対応

どんどんダメ出しお願いします。

インストール

// ==UserScript==
// @name          Favotter Direct Fav
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @include       http://favotter.matope.com/*
// ==/UserScript==
(function (){
    var attr_links = document.evaluate("//div[@class='info meta entry-meta']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < attr_links.snapshotLength; i++) {
        var l = attr_links.snapshotItem(i);
        l.innerHTML.match(/<a title="[^"]*" href="([^"]*)">/);
        var status_url = RegExp.$1;
        l.innerHTML.match(/<a class="taggedlink" href="status\.php.*?(\d.+)">/);
        var status_id = RegExp.$1;
        status_url = status_url + "/statuses/" + status_id;

        make_link(status_url, status_id, i);
    }
    function make_link(status_url, status_id, num){
        GM_xmlhttpRequest({ // confirm whether already faved or not
            method: 'GET',
            url: status_url,
            onload: function(res){
                if(res.responseText.match(/icon_star_full/)){
                }else if(res.responseText.match(/icon_star_empty/)){
                    _make_link(status_id, num);
                }else{ // Not Logged in to Twitter
                }
            }
        });
    }
    function _make_link(status_id, num){
        var attr_links = document.evaluate("//span[@class='xfolkentry']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var l = attr_links.snapshotItem(num);
        l.innerHTML = l.innerHTML.replace(/(\d+ fav by)/, '<span id="add_' + status_id + '_to_fav">Favに追加する</span> ' + RegExp.$1);
        var span = document.getElementById('add_' + status_id + '_to_fav');
        span.addEventListener(
            'click',
            function(){create_fav(status_id)},
            false
        );
    }
    function create_fav(status_id){
        GM_xmlhttpRequest({
            method: 'GET',
            url: 'http://twitter.com/favourings/create/' + status_id,
            onload: function(){
                span = document.getElementById('add_' + status_id + '_to_fav');
                span.innerHTML = "fav済";
            }
        });
    }
})();

jt_noSkejt_noSke2007/12/10 17:04ふぁぼったー仕様変更により動かなくなっていたので直しましたよ。
たぶんこれで動くと思います。

function make_link までのところを以下のコードに置き換え

(function (){
{
var attr_links = document.evaluate("//div[@class='info meta entry-meta']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for(var i = 0; i < attr_links.snapshotLength; i++) {
var l = attr_links.snapshotItem(i);
l.innerHTML.match(/<a title="[^"]*" href="([^"]*)">/);
var status_url = RegExp.$1;
l.innerHTML.match(/<a class="taggedlink" href="status\.php.*?(\d.+)">/);
var status_id = RegExp.$1;
status_url = status_url + "/statuses/" + status_id;

make_link(status_url, status_id, i);
}