获取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






很不错.小伙现在越来越棒了.加油.
不错,支持一下!
这个……好长的代码……厉害
沙发
兄弟的订阅数很强大啊
~~这个,我可怜的小站受不了啊
@simaopig
大家一起努力,哈哈
@zwwooooo
不是我写的,我只是摘抄过来,老外写的.我自己最多写10行
@章鱼
兄弟,醒醒,地板都不是了
@goldapple
是那老外的订阅数,哈哈
@老饕
囧…….JavaScript是在浏览器里运行的,不关你的站事
是网站打开慢啦
就两个字,强悍~~
不错,支持一下!
共享数目可以查看吗?我找了一下Google Reader中也没有显示共享数的地方。
回帖,是一种支持与鼓励
在fb里面看看就行了
高手,你真的做到了,哈哈。这下我要好好研究这两篇文章了
光贴代码,也不解释一下呢
@唏嘘一世
我很少用Google Reader,不清楚
@wulinfo
时间关系,只是在代码的上面简单说了说原理
怎么没看到博主的订阅数呢
天书啊!不过可以用就行了哈
技术性真强啊
真是不错的文章,不过我订阅不多,暂时还用不上
很强的技术文章
不错的文章,周末试验一下~
收藏一下 现在在公司不好实验
订阅数在哪里啊
@卢松松
比不上你,而且觉得没有必要放出来,哈哈
@A.shun
可以根据这个原理做其他事,哈哈
@我想想
我没有把自己的订阅数放出来
这段代码先收藏了。。