搞定新浪博客RSS feed不全文输出

从上周开始发现在Google Reader中订阅的一些新浪博客变成不全文输出了,刚开始以为是博主自己改的,后来在Twitter上看到有人说新浪对一些名人博客改为“不全文输出”,为此先鄙视一下新浪博客。

不全文输出的缺点有:

  • 必须打开原文才能看到全部内容;
  • Google Reader无法缓存全文内容,因此如果文章被删除就无法看到全文;
  • 手机上阅读很不方便,得打开原文并加载一些无意义的内容。

曾记得之前有人解决过这种不全文输出的订阅,因此在Google上做一了翻搜索,老肥博客的这篇《RSS feed 不输出全文?一样搞定你》文章给我了一些提示。

我通过Firefox的“工具->附件组件”功能搜索并添加了“Greasemonkey”的最新插件v0.8.20100408.6,重启Firefox后到google reader full feed changer下载最新的脚本,点该页上的“Install”按钮即可安装。特别说明一下,这种方法只对Firefox有效,其它浏览器或手机访问请绕行。

按老肥那篇文章的提示我找到安装后脚本的存放位置:
[系统盘]:\Documents and Settings\[当前用户]\Application Data\Mozilla\Firefox\Profiles\[随机数].default\gm_scripts\google_reader_full_feed_\google_reader_full_feed_.user.js

anmin0001的博客为例,随便打开一篇文章,按ctrl+u或通过右击菜单查看页面源代码,可以看到博文内容用<div class="articalContent" id="sina_keyword_ad_area2">来标注,因此我们打开上面提到的脚本文件,在SITE_INFO数组里添加新的一项:
}, // 注意新添加的项要使用逗号跟之前的分隔
{
url: 'http://blog.sina.com.cn',
xpath: '//div[@class="articalContent"]', // 这里用不同的颜色表示与博文的标注对应关系
charset: utf-8 // 缺省是utf-8编码,新浪博客的编码也是utf-8,所以这行可以省略
}

保存后刷新Google Reader,可以看到Reader自动加载原文链接并显示出来。

实际使用时我们发现一些小问题,在自动加载的原文里我们看到以<span class='MASSxxx'>标注的部分博文内容是重复的,而且没有格式,导致原文很难阅读。分析页面源代码我们发现在文件头有对应的css标注该段内容不显示:<style>.MASSxxx{display:none}</style>
分析多个人的博客我们发现这个“xxx”各不一样,但同一个人都是一样的,真不知道新浪在搞什么鬼,不过我们可以修改脚本对这部分做隐藏处理。

首先还是来修改SITE_INFO,我们加上一个hidden的定义:

    {
        url: 'http://blog.sina.com.cn',
        xpath: '//div[@class="articalContent"]',
        hidden: '//span[@class="MASSxx1"]|//span[@class="MASSxx2"]|...|//span[@class="MASSxxn"]'
    }

不同的新浪博客有不同的MASS码,我们分别找到并在hidden中罗列出来,各个MASS之前用“|”分隔。

对应的修改脚本的代码:
1. 加一个hiddenTags函数:

function hiddenTags(tag, node) {
var tags = getElementsByXPath(tag, node);
if (tags != null && tags.length) {
for (var i = 0; i < tags.length; i++) { tags[i].style.display = "none"; } } return node; } [/javascript] 2. 修改FullFeed.request函数,在body.appendChild之前判断并调用hiddenTags函数: [javascript highlight_lines="4,13"] if (!contents.length) { var node = addTargetAttr(relativeToAbsolute(contents, link)); if (SITE_INFO[i].hidden) { node = hiddenTags(SITE_INFO[i].hidden, node); } body.appendChild(node); return; } // array for (var num = 0; num < contents.length; num++) { var node = addTargetAttr(relativeToAbsolute(contents[num], link)); if (SITE_INFO[i].hidden) { node = hiddenTags(SITE_INFO[i].hidden, node); } body.appendChild(node); } [/javascript] 保存并刷新Google Reader我们可以看到<span class="MASSxxx">部分的内容被隐藏掉了。 图片问题:
我们还发现图片不能正常显示,分析发现<img里有个“real_src”用来显示实际的图片链接,而“src”显示的是一个1x1的图片,同样我们可以修改脚本来实现,修改relativeToAbsolute函数:

function relativeToAbsolute(node, link) {
var imgs = getElementsByXPath('//img', node);
if (imgs.length) {
for (var i = 0; i < imgs.length; i++) { var src = imgs[i].getAttribute('src'); var real_src = imgs[i].getAttribute('real_src'); if (src) { if (real_src) { imgs[i].setAttribute('src', toAbsolutePath(real_src, link)); } else { imgs[i].setAttribute('src', toAbsolutePath(src, link)); } } } } return node; } [/javascript] 在发现有“real_src”属性时取来给“src”用,这就解决了图片显示的问题。 这是我现有用到的脚本文件:google_reader_full_feed_.user.js.txt,里面指定了两个MASS:
anmin0001的博客:feed - http://blog.sina.com.cn/rss/anmin0001.xml,MASSd3158bed322a
曹建海的博客:feed - http://blog.sina.com.cn/rss/caojianhai.xml,MASS046cdd2ad48f

Tags: ,

17 Responses to “搞定新浪博客RSS feed不全文输出”

  1. sqhlight说道:

    奇怪,我试了还是不起作用,依然是 >>点击查看新浪博客原文
    why?

    • sqhlight说道:

      比如我是用李承鹏的新浪博客,添加了 //span[@class="MASSd93b9d484a47"]

      • admin说道:

        我刚订阅了他的博客,没有问题呀。
        你看一你的Greasemonkey是否是启用状态,FF右下角的小猴头像应该是亮的。
        你可以把我用到的那个脚本另存到你本地,替换MASS(把不要的删除,包含分隔符“|”),然后把文件名.txt去掉再替换你自己的js文件,刷新Google Reader。

        • sqhlight说道:

          我确定打开了啊,我就是在你的脚本上添加的啊,奇怪了

          • lordong说道:

            在我那个脚本上添加的结果应该是这样,你对比一下看多或少了什么:
            hidden: '//span[@class="MASSd3158bed322a"]|//span[@class="MASS046cdd2ad48f"]|//span[@class="MASSd93b9d484a47"]'
            最后要以单引号结尾。

  2. sqhlight说道:

    我就是这样试了的,你发布的2个可以用,我的不行
    多谢指点

    • lordong说道:

      我压缩后发给你只有李承鹏的js文件,你替换后刷新一下Google Reader试试。
      有可能某篇文章打不开会长时间不响应,你换一篇文章试试。

      • sqhlight说道:

        测试了,还是不行,greasemonkey 版本没问题,firefox 3.6.6。 是不是我的google reader 设置有问题啊?
        另外,reader 怎么把已读的文章标为未读啊?

  3. sqhlight说道:

    另外 文中 hidden: '//span[@class="MASSxx1"]|//span[@class="MASSxx2"]|...|//span[@class="MASSxxn"]'
    每个mass 后面的序列数好像不要加吧

    • lordong说道:

      序列数只是为了描述上的区分而已,“...”指的是无任意多个。你那不会只有一个的情况也不成功吧?
      hidden: '//span[@class="MASSd93b9d484a47"]'
      Google Reader在展开的文章底部有一个“保持为未知状态”可以标为未读的。

      • sqhlight说道:

        只有1个也不成功,
        是的,我打开了全部文章,但只有1篇有保持为未知状态,其余的没有这个选项,其他的rss好像都有。我退订后重订还是一样

  4. sqhlight说道:

    测试了徐静蕾的博客后发现可以,然后重新测试,发现等待1分钟后可以打开李承鹏的。看来我的心太急了
    多谢楼主帮助

    • lordong说道:

      嗯,是有些链接打开的时候要花点时间,不过你那里要花上1分钟左右才打开是夸张了点。
      我也碰到过打不开的,直接点博主的那个链接也半天打不开,所以我跟你说过试点别的文章。

  5. rangerQ说道:

    Chrome 可以去搜一个叫Google Reader Full Feed的应用 可以搞定新浪博客

  6. poly说道:

    补充一个chrome下的方法吧:
    用Read More! for Google Reader 这个插件获得全文~
    然后用Adblock Plus for Google Chrome 插件过滤掉狗日的MASS~
    Adblcok貌似新规则添加后需要清空下缓存才有用。

  7. iuse说道:

    请问,用一些在线网址生成rss的类似方法,不能够把全部的文章都弄成feed,似乎sina自己的rss只能是最近的十条。另外,不知对于某些 已经消失的网站的feed,如何弄(未消失前有非全文的rss地址)?

    • lordong说道:

      全文输出有Google Reader来负责缓存,对于不全文输出的我目前没找到好的办法,GR只帮缓存了头部和链接,这对消失的网站则是个杯具。

Leave a Reply


提醒: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。