2010年7月6日星期二

手贱

前两天试了试Blogger的导入和导出功能,今天才发现就这么一试导致链接地址全变了。PR什么的我倒是不在乎,可看着也挺不舒服的。Blogger后端没有修改POST URL的功能,API里也没有。等空了找找看有没有什么办法吧,不过暂时只能这么放着了。

要是有人链到我这儿,对不起先。

Update:

折腾了一下,总算是解决了这个问题,部分解决。

首先,打开导出的XML文件,检查每一个entry元素的link子元素,确保href是你想要的。接着写一个脚本,将entry的title子元素改成链接的文件名部分。这里跟直接发帖一样,不改的话Blogger会根据entry的title给你自动生成一个

# coding: UTF-8
require 'rexml/document'

doc = REXML::Document.new(File.open(ARGV[0], 'r'))

posts = {}
doc.root.elements.each('/feed/entry') do |entry|
  # 有5个link的元素才是blog文章
  next if entry.get_elements('link').length != 5
  
  link = entry.elements['link[@rel="alternate"]']
  url = link.attribute('href').value
  posts[url] = entry.elements['title'].text
  url = url[url.rindex('/')+1..-6]
  entry.elements['title'].text = url
end

doc.write(File.open(ARGV[1], 'w'))
File.open(ARGV[2], 'w') { |f| f.write(posts.to_s) }

其次,在Blogger控制台新建一个blog,名字照旧,域名换一个如otnthnew。选择好模板之后,切忌按照向导的提示立刻导入旧帖子。先去设置中,将所有设置改成跟原blog一样。尤其需要注意的是“格式设置”中的“转换断行”选择为“否”,还有“基本”中的“选择帖子编辑器”选择为“旧编辑器”。

最后,导入备份的XML。把原blog的域名改成otnthold,再把otnthnew改成otnth。再然后还是写一个脚本,把帖子标题给改回来。

# coding: UTF-8
require 'gdata'

GMAIL = ''
PWD = ''
BLOGID = 'xxxxxxxxxxxxxxxxxxx'

=begin
因为墙的问题,gdata需要一点小hack。打开lib/gdata/http/default_service.rb,将:

http = Net::HTTP.new(url.host, url.port)

修改为:

http = Net::HTTP::Proxy(ENV['PROXY_ADD'], ENV['PROXY_PORT']).new(url.host, url.port)
=end
ENV['PROXY_ADD'] = '127.0.0.1'
ENV['PROXY_PORT'] = '8118'


posts = eval(File.open(ARGV[0], 'r:utf-8') { |f| f.read })

client = GData::Client::Blogger.new
client.clientlogin(GMAIL, PWD)

url = 'http://www.blogger.com/feeds/#{BLOGID}/posts/default?max-results=10'
idx = 1
while true
  feed = client.get(url + '&start-index=' + idx.to_s).to_xml
  feed.elements.each('entry') do |entry|
    entry.elements.each('link') do |link|
      link = entry.elements['link[@rel="alternate"]']
      entry.elements['title'].text = posts[link.attribute('href').value]

      entry.add_namespace('http://www.w3.org/2005/Atom')
      entry.add_namespace('gd','http://schemas.google.com/g/2005')
      entry.delete_element('thr:total')

      edit_uri = entry.elements['link[@rel="edit"]'].attributes['href']
      response = client.put(edit_uri, entry.to_s)
    end
  end
  
  idx += 10
  break if idx >= feed.elements['openSearch:totalResults'].text.to_i
end

因为blogid已经变了,对于Blogger来说这就是一个全新的blog,会不会有什么严重的后遗症还有待观察。

没有评论 :