如何批量导出JavaEye的博客做备份?

JavaEye的博客支持RSS的全文输出,所以你可以随时通过抓取RSS来将博客文章内容备份到本地或者同步到其他博客网站。除此之外,我们还为博客用户提供了如下两种高级的博客导出功能: 

一、将博客导出备份为PDF 

利用JavaEye博客制作电子书功能,将博客文章制作为PDF,下载或者共享出去,这种方式非常适合于备份或者电子出版。 

二、用JavaEye博客备份脚本,将你的博客文章保存在本地硬盘html网页 

我们已经为你编写好了ruby的备份脚本,你只要在自己电脑上安装Ruby解析器就可以运行了,抓取下来的博客文章,会按照每篇博客文章一个网页html文件来保存,所有网页文件都默认保存在以你JavaEye域名名称的目录下面。这样你可以定期运行这个备份脚本来实现网页格式的备份。 

使用JavaEye博客备份脚本来批量导出你的博客 Top

首先你应该确保你的博客被Google Reader订阅,如果你是一个比较勤奋的博客作者,一般情况下都已经被订阅了。如果没有被Google Reader订阅,你也可以在Google Reader里面订阅自己的博客地址。然后你就可以下载这个页面附件提供的备份脚本来批量导出你的博客了。使用方法很简单: 

1、你的电脑必须安装了Ruby解析器,如果还没有安装的话,赶紧去Ruby官方网站或者Rubyforge.org上下载安装一个吧。ruby1.8或者ruby1.9版本都可以,我们建议你用ruby1.8.7版本,因为这是我们编写脚本的开发和测试环境。对于操作系统,我们支持MacOSX,Linux和Windows。 

2、打开命令行窗口,输入如下命令: 

Ruby代码 
  1. ruby javaeye_blog_backup.rb -u bitch -p fcuk-gfw cnnic.iteye.com  


备份脚本支持3个参数:-u和-p是填写你的Google帐户和密码(你还没有Google帐户?赶紧申请一个吧),必选的参数;另外还支持-d指定备份下来的网页保存在那个目录下面,默认是当前目录下面的域名子目录。最后一个参数就是你的JavaEye博客域名了。 

是不是很简单?  下载JavaEye博客备份脚本 

JavaEye博客备份脚本源代码 Top

Ruby代码 
  1. #!/usr/bin/env ruby  
  2. # encoding: UTF-8  
  3.   
  4. %w(cgi iconv open-uri openssl fileutils rexml/document).each { |lib| require lib }  
  5.   
  6. # this dirty line is used to pass the ssl verify. This script can   
  7. # execute successfully on my ArchLinux. You can try to comment it.  
  8. # And in ruby 1.9, you can pass a hash to open-uri instead of this.  
  9. # open(url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) { bla...  
  10. OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE  
  11.   
  12. # Thanks to http://rednaxelafx.iteye.com/blog/588507  
  13. # String#mgsub taken from Ruby Cookbook, Recipe 1.18  
  14. class String    
  15.   def mgsub(key_value_pairs = [].freeze)    
  16.     regexp_fragments = key_value_pairs.collect {|k,v| k }    
  17.     gsub(Regexp.union(*regexp_fragments)) do |match|    
  18.       key_value_pairs.detect {|k,v| k =~ match}[1]    
  19.     end    
  20.   end    
  21. end    
  22.   
  23.   
  24. class GReader  
  25.     TEMPLATE = <<-HTML  
  26.         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  27.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  28.         <html xmlns="http://www.w3.org/1999/xhtml">  
  29.             <head>  
  30.                 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
  31.                 <title>_title_</title>  
  32.             </head>  
  33.             <body>  
  34.         _link_  
  35.         _time_  
  36.                 _body_  
  37.             </body>  
  38.         </html>  
  39.     HTML  
  40.   
  41.     def initialize(options = {})  
  42.     @g_sid = get_sid options[:g_name], options[:g_pwd]  
  43.     @g_auth = get_auth options[:g_name], options[:g_pwd]  
  44.     @blog_rss = "http://#{options[:domain]}/rss"  
  45.     @header = {  
  46.       "UserAgent" => "JavaEye Blog Backup Script",   
  47.       "Cookie" => "SID=#@g_sid",  
  48.       "Authorization" => "GoogleLogin auth=#@g_auth"  
  49.     }  
  50.     @reader_path = "https://www.google.com/reader/atom/feed/#{CGI.escape @blog_rss}?n=44444"  
  51.     @dir = FileUtils.makedirs(options[:dir] ||= options[:domain])  
  52.     # Thanks to http://rednaxelafx.iteye.com/blog/588507  
  53.     # In ruby 1.9, makedirs will give you an array  
  54.     Dir.chdir @dir rescue Dir.chdir @dir.first   
  55.   end  
  56.   
  57.   def fetch  
  58.     puts "Downloading..."  
  59.     puts @reader_path  
  60.     open(@reader_path@headerdo |response|  
  61.       REXML::Document.new(response).elements.each("*/entry"do |entry|  
  62.         begin  
  63.           title = entry.elements["title"].text  
  64.           link = entry.elements["link"].attributes['href']  
  65.           time = Time.parse(entry.elements["published"].text).strftime("%Y-%m-%d"rescue ''   
  66.           body = (entry.elements["summary"] || entry.elements["content"]).text.sub(/<span style="color:red">\s*<a.*style="color:red">((已有 <strong>\d+<\/strong> 人发表留言,猛击-&gt;&gt;<strong>这里<\/strong>&lt;&lt;-参与讨论)|(本文的讨论也很精彩,浏览讨论&gt;&gt;)).*$/m, '')  
  67.           filename = "#{title}.html"  
  68.   
  69.   
  70.           # Thanks to http://rednaxelafx.iteye.com/blog/588507  
  71.           # For windows user  
  72.           if RUBY_PLATFORM =~ /mswin/i  
  73.             title = title.mgsub([[%r{\\}, '\'], [%r{/}, '/'],    
  74.                                 [/:/, ':'],    [/\*/, '*'],    
  75.                                 [/\?/, '?'],   [/"/, '“'],    
  76.                                 [/</, '<'],    [/>/, '>'],    
  77.                                 [/\|/, '|']])    
  78.             filename = Iconv.conv("GB18030""UTF-8", filename)  
  79.           end  
  80.   
  81.           File.open(filename, "w"do |f|   
  82.             f.puts TEMPLATE.sub('_title_', title).sub('_link_'"<h3><a href=#{link} title='原文链接'>#{title}</a></h3>").sub('_time_', time).sub('_body_', body)   
  83.           end  
  84.           puts "[Save]  #{filename}"  
  85.         rescue Exception => e  
  86.           puts "[Error] #{e.message}"  
  87.           next  
  88.         end  
  89.       end  
  90.     end  
  91.     puts "All files have been saved in #{Dir.pwd}"  
  92.   rescue Exception => e  
  93.     puts "[Error]   #{e.message}"  
  94.   end  
  95.   
  96.   def get_sid(g_name, g_pwd)  
  97.     puts "Login..."  
  98.     open("https://www.google.com/accounts/ClientLogin?Email=#{g_name}&Passwd=#{g_pwd}") { |res| res.string.split("\n").detect {|l| l =~ /^SID=/ }.strip.sub(/^SID=/,'') }  
  99.   rescue Exception => e  
  100.     puts "[Error]   login failed. #{e.message}"  
  101.     exit  
  102.   end  
  103.   
  104.   def get_auth(login, password)  
  105.     puts "Auth..."  
  106.     open("https://www.google.com/accounts/ClientLogin?Email=#{login}&Passwd=#{password}&service=reader") { |res| res.read.strip.sub(/^SID=.*Auth=/m,'') }  
  107.   rescue Exception => e  
  108.     puts "[Error]   Auth failed. #{e.message}"  
  109.     exit  
  110.   end  
  111. end  
  112.   
分享到:
评论
1 楼 wjheye 2011-09-15  
用的ruby是 1.9.2版本的,运行命令后出现以下的错误:

javaeye_blog_backup.rb:111: can't find string "HTML" anywhere before EOF
javaeye_blog_backup.rb:25: syntax error, unexpected $end, expecting tSTRING_CONT
ENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
    TEMPLATE = <<-HTML
                      ^

弄了一个多小时都没有弄好,麻烦帮忙给个简洁详细的样例

你可能感兴趣的:(linux,Google,脚本,Blog,Ruby)