2009年2月8日星期日

帮人搬家之导出Google Reader缓存

某人的Blog原来放在歪酷上,因为歪酷上榜第七批,所以。

目前歪酷被关Blog的帖子部分无论前台后台均无法访问,日后是否会提供下载不得而知。好在某人的Blog自从2006起就有人(敝人)在Google Reader上订阅,歪酷的Feed也是全文输出,所以能救一部分回来。

但是借助Google Reader缓存搬迁Blog的法子也有不小的局限性:

  • 原Blog提供了全文Feed输出;
  • 只能取回自第一次有人在Reader订阅之后发布的文;
  • 如修改过不包含在Feed中的旧文,则修改部分无法取回;

本想用Javascript写代码,但因为XMLHTTP不能自定义Cookie(ServerXMLHTTP好像可以,不过我没试),所以改用Ruby。

require 'net/https'
require 'uri'

def getSID(email, passwd)
  uri = URI.parse('https://www.google.com/accounts/ClientLogin')

  req = Net::HTTP::Post.new(uri.path)
  req.set_form_data({'Email'=>email, 'Passwd'=>passwd});
  
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  res = http.start {|h| h.request(req)}
  
  case res
  when Net::HTTPSuccess
    res.body.split("\n").each { |s|
      return s if s[0,4] == 'SID='
    }
  else
    res.error!
  end
end

def parseXML(src)
  m = src.match('([^<]+)')
  if m then
    return m[1]
  else
    return ''
  end
end
    
def exportGRCache(feedurl, email, passwd, fn = '000001', c = '')
  sid = getSID(email, passwd)
  
  begin
    # n尽量大一点,方便后续处理
    url = 'http://www.google.com/reader/atom/feed/' + feedurl + '?n=100'
    url += '&c=' + c if c != ''
    uri = URI.parse(url)
    
    headers = { 'Cookie' => sid, }
    puts 'DL ' + url
    res = Net::HTTP.start(uri.host, uri.port) { |h| h.get(uri.request_uri, headers) }
    
    puts 'Save ' + fn + '.xml ...'
    f = File.new(fn + '.xml', 'w')
    fn.next!
    f.write(res.body)
    
    c = parseXML(res.body)
  end while c != ''
end

# Google Reader中订阅的Feed地址
url = 'http://BLOG.DOMAIN.com/PATH.xml'

# Google Account,Reader API目前必须要验证才能用
email = 'USERNAME@gmail.com'
passwd = 'USERPASSWORD'

exportGRCache(url, email, passwd)

7 条评论 :

Nick.Cheung 说...

请问这个代码要怎么用呢~~

我不懂语言的。。。

Nick.Cheung 说...

请问这个代码要怎么使用呢?

能否深入浅出地解释?

oCameLo 说...

如果你对程序代码完全没概念的话,几句话实在是不可能解释得清楚。

愿意的话不妨告诉我具体是要做点什么事,或许我可以给你些更实在的建议。

armgod 说...

我也遇到这种情况,以前的网站(Yo2)关了,又没及时备份,现在我GoogleReader里有全部的订阅,可是不知道怎么导出成wordpress可用的xml

oCameLo 说...

wordpress肯定可以导入blogger,而blogger的feed格式跟reader的是一样的,所以修改一下wordpress导入blogger的代码应该可以管用。

另外,wordpress本身应该也有导入导出功能,所以把reader导出的东西转换成wordpress导入导出的格式,估摸着也能成。

不过传到yo2的图片肯定是没戏了的。

Unknown 说...

大哥,goolge reader快关闭了,那么多的缓存就要永远消失了,好着急呀,大神您能不能写个软件,把自己订阅的条目缓存都导出来呀,没了google reader上网都不知道干啥了

oCameLo 说...

我没试过,但只要我这个脚本还能跑就可以做你想做的事,不过我觉得这没什么意义就是了。

像我,虽然没去查,不过这些年用reader看过的条目恐怕得有几十万,全弄出来没必要,而且其实也没什么用。