JavaEye的博客支持RSS的全文输出,所以你可以随时通过抓取RSS来将博客文章内容备份到本地或者同步到其他博客网站。除此之外,我们还为博客用户提供了如下两种高级的博客导出功能:
一、将博客导出备份为PDF
利用JavaEye博客制作电子书功能,将博客文章制作为PDF,下载或者共享出去,这种方式非常适合于备份或者电子出版。
二、用JavaEye博客备份脚本,将你的博客文章保存在本地硬盘html网页
我们已经为你编写好了ruby的备份脚本,你只要在自己电脑上安装Ruby解析器就可以运行了,抓取下来的博客文章,会按照每篇博客文章一个网页html文件来保存,所有网页文件都默认保存在以你JavaEye域名名称的目录下面。这样你可以定期运行这个备份脚本来实现网页格式的备份。
一、将博客导出备份为PDF
利用JavaEye博客制作电子书功能,将博客文章制作为PDF,下载或者共享出去,这种方式非常适合于备份或者电子出版。
二、用JavaEye博客备份脚本,将你的博客文章保存在本地硬盘html网页
我们已经为你编写好了ruby的备份脚本,你只要在自己电脑上安装Ruby解析器就可以运行了,抓取下来的博客文章,会按照每篇博客文章一个网页html文件来保存,所有网页文件都默认保存在以你JavaEye域名名称的目录下面。这样你可以定期运行这个备份脚本来实现网页格式的备份。
使用JavaEye博客备份脚本来批量导出你的博客
首先你应该确保你的博客被Google Reader订阅,如果你是一个比较勤奋的博客作者,一般情况下都已经被订阅了。如果没有被Google Reader订阅,你也可以在Google Reader里面订阅自己的博客地址。然后你就可以下载这个页面附件提供的备份脚本来批量导出你的博客了。使用方法很简单:
1、你的电脑必须安装了Ruby解析器,如果还没有安装的话,赶紧去Ruby官方网站或者Rubyforge.org上下载安装一个吧。ruby1.8或者ruby1.9版本都可以,我们建议你用ruby1.8.7版本,因为这是我们编写脚本的开发和测试环境。对于操作系统,我们支持MacOSX,Linux和Windows。
2、打开命令行窗口,输入如下命令:
备份脚本支持3个参数:-u和-p是填写你的Google帐户和密码(你还没有Google帐户?赶紧申请一个吧),必选的参数;另外还支持-d指定备份下来的网页保存在那个目录下面,默认是当前目录下面的域名子目录。最后一个参数就是你的JavaEye博客域名了。
是不是很简单? 下载JavaEye博客备份脚本
1、你的电脑必须安装了Ruby解析器,如果还没有安装的话,赶紧去Ruby官方网站或者Rubyforge.org上下载安装一个吧。ruby1.8或者ruby1.9版本都可以,我们建议你用ruby1.8.7版本,因为这是我们编写脚本的开发和测试环境。对于操作系统,我们支持MacOSX,Linux和Windows。
2、打开命令行窗口,输入如下命令:
- ruby javaeye_blog_backup.rb -u bitch -p fcuk-gfw cnnic.iteye.com
备份脚本支持3个参数:-u和-p是填写你的Google帐户和密码(你还没有Google帐户?赶紧申请一个吧),必选的参数;另外还支持-d指定备份下来的网页保存在那个目录下面,默认是当前目录下面的域名子目录。最后一个参数就是你的JavaEye博客域名了。
是不是很简单? 下载JavaEye博客备份脚本
JavaEye博客备份脚本源代码
- #!/usr/bin/env ruby
- # encoding: UTF-8
- %w(cgi iconv open-uri openssl fileutils rexml/document).each { |lib| require lib }
- # this dirty line is used to pass the ssl verify. This script can
- # execute successfully on my ArchLinux. You can try to comment it.
- # And in ruby 1.9, you can pass a hash to open-uri instead of this.
- # open(url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) { bla...
- OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
- # Thanks to http://rednaxelafx.iteye.com/blog/588507
- # String#mgsub taken from Ruby Cookbook, Recipe 1.18
- class String
- def mgsub(key_value_pairs = [].freeze)
- regexp_fragments = key_value_pairs.collect {|k,v| k }
- gsub(Regexp.union(*regexp_fragments)) do |match|
- key_value_pairs.detect {|k,v| k =~ match}[1]
- end
- end
- end
- class GReader
- TEMPLATE = <<-HTML
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>_title_</title>
- </head>
- <body>
- _link_
- _time_
- _body_
- </body>
- </html>
- HTML
- def initialize(options = {})
- @g_sid = get_sid options[:g_name], options[:g_pwd]
- @g_auth = get_auth options[:g_name], options[:g_pwd]
- @blog_rss = "http://#{options[:domain]}/rss"
- @header = {
- "UserAgent" => "JavaEye Blog Backup Script",
- "Cookie" => "SID=#@g_sid",
- "Authorization" => "GoogleLogin auth=#@g_auth"
- }
- @reader_path = "https://www.google.com/reader/atom/feed/#{CGI.escape @blog_rss}?n=44444"
- @dir = FileUtils.makedirs(options[:dir] ||= options[:domain])
- # Thanks to http://rednaxelafx.iteye.com/blog/588507
- # In ruby 1.9, makedirs will give you an array
- Dir.chdir @dir rescue Dir.chdir @dir.first
- end
- def fetch
- puts "Downloading..."
- puts @reader_path
- open(@reader_path, @header) do |response|
- REXML::Document.new(response).elements.each("*/entry") do |entry|
- begin
- title = entry.elements["title"].text
- link = entry.elements["link"].attributes['href']
- time = Time.parse(entry.elements["published"].text).strftime("%Y-%m-%d") rescue ''
- body = (entry.elements["summary"] || entry.elements["content"]).text.sub(/<span style="color:red">\s*<a.*style="color:red">((已有 <strong>\d+<\/strong> 人发表留言,猛击->><strong>这里<\/strong><<-参与讨论)|(本文的讨论也很精彩,浏览讨论>>)).*$/m, '')
- filename = "#{title}.html"
- # Thanks to http://rednaxelafx.iteye.com/blog/588507
- # For windows user
- if RUBY_PLATFORM =~ /mswin/i
- title = title.mgsub([[%r{\\}, '\'], [%r{/}, '/'],
- [/:/, ':'], [/\*/, '*'],
- [/\?/, '?'], [/"/, '“'],
- [/</, '<'], [/>/, '>'],
- [/\|/, '|']])
- filename = Iconv.conv("GB18030", "UTF-8", filename)
- end
- File.open(filename, "w") do |f|
- f.puts TEMPLATE.sub('_title_', title).sub('_link_', "<h3><a href=#{link} title='原文链接'>#{title}</a></h3>").sub('_time_', time).sub('_body_', body)
- end
- puts "[Save] #{filename}"
- rescue Exception => e
- puts "[Error] #{e.message}"
- next
- end
- end
- end
- puts "All files have been saved in #{Dir.pwd}"
- rescue Exception => e
- puts "[Error] #{e.message}"
- end
- def get_sid(g_name, g_pwd)
- puts "Login..."
- 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=/,'') }
- rescue Exception => e
- puts "[Error] login failed. #{e.message}"
- exit
- end
- def get_auth(login, password)
- puts "Auth..."
- open("https://www.google.com/accounts/ClientLogin?Email=#{login}&Passwd=#{password}&service=reader") { |res| res.read.strip.sub(/^SID=.*Auth=/m,'') }
- rescue Exception => e
- puts "[Error] Auth failed. #{e.message}"
- exit
- end
- end