Home > Internet > 获取Feed地址的Google Reader订阅数
2009August . 24th

获取Feed地址的Google Reader订阅数

获取Feed地址的Google Reader订阅数继续说说Google Reader的话题.
话说@LAONB掌握了分享文章到Google Reader的方法以后,还不满足,还想把分享次数也盗过来.我帮他找了一下,没发现获取分享次数的方法,不过找到了获取Feed地址在Google Reader里的订阅数的方法.估计广大Google Fans对这个会有点兴趣,一次摘抄一下,以备不时之需.
这个效果是用一段JavaScript实现的,原理是检查网页上是否含有Feed地址声明,如果有的话,则利用你的Google 帐号发送一个订阅请求,并获取Feed地址的订阅数量,并且缓存订阅数量,每24小时清空一次.
脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<script type="javascript">
if(!Array.prototype.uniq) {
    Array.prototype.uniq = function() {
        for(var i = 0, x = []; i < this.length; i++) {
            if(x.indexOf(this[i]) < 0) x.push(this[i]);
        }
        return x;
    };
}
 
GoogleReaderSubscribersCount = {
    position: 'bottomright',
    openInSidebar: false,
    id: 'subscribers-count',
    readerUriBase: 'http://www.google.com/reader/view/feed/',
    results: [],
    counts: 0,
    loggedIn: true,
    cache: null,
    cacheExpires: 24 * 60 * 60 * 1000,
    initialize: function() {
        if(window != window.parent) return;
        var self = GoogleReaderSubscribersCount;
        var xp = '//link[@rel="alternate" and (contains(@type,"atom") or contains(@type,"rss"))]';
        var metalinks = getElementsByXPath(xp) || [];
        var feeds = metalinks.map(function(e) { return e.href }).uniq();
        if(!feeds.length) return;
        self.cache = eval(GM_getValue(self.id));
        var now = new Date().getTime();
        if(!self.cache || self.cache['expires'] < now) {
            self.cache = {'expires': now + self.cacheExpires};
            GM_setValue(self.id, uneval(self.cache));
        }
        if(self.openInSidebar)
            self.readerUriBase = self.readerUriBase.replace(/reader\/view/, 'reader/m/view');
        feeds.forEach(self.fetch);
    },
    fetch: function(e, i, a) {
        var self = GoogleReaderSubscribersCount;
        var appendResults = function(url, count) {
            if(typeof(count) == 'undefined') return false;
            if(typeof(self.cache[url]) == 'undefined') {
                self.cache[url] = count;
                GM_setValue(self.id, uneval(self.cache));
            }
            self.counts += count;
            self.results.push(
                ['<a ', ((self.openInSidebar)? 'target="_search" ' : ''), 
                 'title="', url, '" href="', self.readerUriBase, encodeURIComponent(url), '">', 
                 count, '< ', '/a>'
                ].join(''));
            if(self.results.length == a.length) self.show();
            return true;
        };
        if(!appendResults(e, self.cache[e])) {
            var url = 'http://www.google.com/reader/directory/search?hl=en&q=' + encodeURIComponent(e);
            var callback = function(r) {
                if(!self.loggedIn) return;
                var r = r.responseText;
                if(/{"query":"([^"]*)"/.test(r)) {
                    var x = 0, url = RegExp.$1;
                    if(/<span class="number">(.*)< \/span>\n?<div>subscribers?< \/div>/.test(r)) {
                        var num = RegExp.$1.replace(/,/g, '');
                        x = (num == 'Unknown')? 0 : parseInt(num);
                    }
                    appendResults(url, x);
                } else {
                    self.cancel();
                }
            }
            GM_xmlhttpRequest({method: 'GET', url: url, onload: callback});
        }
    },
    show: function() {
        var self = GoogleReaderSubscribersCount;
        var box = document.createElement('div');
        box.id = self.id;
        document.body.appendChild(box);
        GM_addStyle(<>< ![CDATA[
            #{id} {
                letter-spacing: 0;
                font-family: Arial, sans-serif;
                line-height: 1;
                position: fixed;
                margin: -3px 3px;
                padding: 3px 5px 5px 5px;
                z-index: 1500;
                font-size: 11px;
                color: #555;
                background-color: #c3d9ff;
                display: none;
                -moz-border-radius: 3px;
            }
            #{id} a {
                font-weight: bold !important;
                border: 0 !important;
                padding: 0 !important;
                color: #1010c8 !important;
                text-decoration: bold;
                background: none;
                font-family: Arial, sans-serif;
                font-size: 11px;
            }
        ]]>.toXMLString().replace(/\{id\}/g, box.id)
        );
        /^(bottom)(.*)$/.test(self.position) || /^(top)(.*)$/.test(self.position);
        box.style[RegExp.$1] = box.style[RegExp.$2] = 0;
        box.innerHTML = (self.loggedIn)? 
            (self.results.join(' + ') + ' subscriber' + ((self.counts > 1)? 's' : '')) :
            '<a href="http://www.google.com/reader/">Login required.</a>';
        box.style.display = 'block';
 
        document.addEventListener('keypress', function(e) {
            if(e.keyCode == 27) {
                var t = document.getElementById(box.id);
                t.style.display = (t.style.display == 'none')? 'block' : 'none';  // ESC key to hide
            }
        }, true);
    },
    cancel: function() {
        with(GoogleReaderSubscribersCount){
            loggedIn = false;
            show();
        }
    }
}
 
GoogleReaderSubscribersCount.initialize();
 
 
// borrowed from AutoPagerize <http ://userscripts.org/scripts/show/8551>.
function getElementsByXPath(xpath, node) {
    var node = node || document
    var doc = node.ownerDocument ? node.ownerDocument : node
    var nodesSnapshot = doc.evaluate(xpath, node, null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    var data = []
    for (var i = 0; i < nodesSnapshot.snapshotLength; i++) {
        data.push(nodesSnapshot.snapshotItem(i))
    }
    return (data.length >= 1) ? data : null
}
 
function log(s) { console && console.log(s) }
</http></div></span></script>

虽然这个脚本还是满足不了LAONB同学的要求,不过就当为获取文章分享数提供一个思路吧.
出处:http://bit.ly/EF1Ew

  1. 2009August . 24th - 1:53 PM

    很不错.小伙现在越来越棒了.加油.

  2. 2009August . 24th - 2:04 PM

    不错,支持一下!

  3. 2009August . 24th - 2:06 PM

    这个……好长的代码……厉害

  4. 2009August . 24th - 2:30 PM
  5. 2009August . 24th - 4:32 PM

    兄弟的订阅数很强大啊

  6. 2009August . 24th - 5:03 PM

    ~~这个,我可怜的小站受不了啊 :cry:

  7. 2009August . 24th - 5:18 PM

    @simaopig
    大家一起努力,哈哈
    @zwwooooo
    不是我写的,我只是摘抄过来,老外写的.我自己最多写10行
    @章鱼
    兄弟,醒醒,地板都不是了
    @goldapple
    是那老外的订阅数,哈哈
    @老饕
    囧…….JavaScript是在浏览器里运行的,不关你的站事

  8. 2009August . 24th - 6:21 PM

    是网站打开慢啦

  9. 2009August . 24th - 9:21 PM

    就两个字,强悍~~

  10. 2009August . 25th - 2:47 AM

    不错,支持一下!

  11. 2009August . 25th - 8:56 AM

    共享数目可以查看吗?我找了一下Google Reader中也没有显示共享数的地方。

  12. 2009August . 25th - 12:35 PM

    回帖,是一种支持与鼓励

  13. 2009August . 25th - 9:03 PM

    在fb里面看看就行了

  14. 2009August . 25th - 9:45 PM

    高手,你真的做到了,哈哈。这下我要好好研究这两篇文章了 :lol:

  15. 2009August . 26th - 11:49 AM

    光贴代码,也不解释一下呢

  16. 2009August . 26th - 12:52 PM

    @唏嘘一世
    我很少用Google Reader,不清楚
    @wulinfo
    时间关系,只是在代码的上面简单说了说原理

  17. 2009August . 26th - 12:58 PM

    怎么没看到博主的订阅数呢

  18. 2009August . 26th - 4:25 PM

    天书啊!不过可以用就行了哈

  19. 2009August . 27th - 7:08 PM

    技术性真强啊

  20. 2009August . 27th - 9:49 PM

    真是不错的文章,不过我订阅不多,暂时还用不上

  21. 2009August . 27th - 9:59 PM

    很强的技术文章

  22. 2009August . 28th - 12:39 AM

    不错的文章,周末试验一下~ :razz:

  23. 2009August . 28th - 9:21 AM

    收藏一下 现在在公司不好实验

  24. 2009August . 28th - 10:05 AM

    订阅数在哪里啊

  25. 2009August . 28th - 10:40 AM

    @卢松松
    比不上你,而且觉得没有必要放出来,哈哈
    @A.shun
    可以根据这个原理做其他事,哈哈
    @我想想
    我没有把自己的订阅数放出来

  26. 2009August . 28th - 1:20 PM

    这段代码先收藏了。。

Subscriber selector

Close