博客转移记(1)——关于metaWeblog接口

本来想直接用网上的博客转移服务,无奈找了好几个,比如http://blogmover.redv.com,但是这家的Blogger写入插件好像坏了…… 又如maikr,这个要注册,而且还是windows程序…… 最后只好自己写一个,就当练练Python。 首先是读取原mblogger.cn上的。这个支持metaWeblog接口,试了一下,非常好用。基于Python这种脚本语言的灵活性,对象的方法能够动态生成(估计差不多就像perl里面有个函数能处理未定义的方法调用一样……),metaWeblog的接口直接就成了Python里面对象的方法。 首先,引用xmlrpclib,这个东西现在Python自带了。 接下来 server_uri = “http://computer.mblogger.cn/henryhu/services/metablogapi.aspx” sp = xmlrpclib.ServerProxy(server_uri) 这样就搞出来一个能够帮你进行xmlrpc调用的对象了。它有.system.listMethods()方法,还有.system.methodHelp(method)方法,不但能知道有哪些方法,还有使用说明…… 这个实在是很好用…… 随后 blogs = sp.blogger.getUsersBlogs(progname, username, password) 得到一个list,里面每个对象是个dict,就是一个blog。 这个dict里面的blogid,之后就用来代表这个blog了。blogName对应的博客标题。 for post in sp.metaWeblog.getRecentPosts(blogid, username, password, POST_LIMIT): 这个是metaWeblog的方法,获取最近的POST_LIMIT个帖子。自然你希望获取全部的话,取个什么99999之类的就行了…… 这个post就是个dict,里面有title(标题),description(内容),link(帖子链接),dateCreated(写作日期),categories(分类)。 前三个都是字符串。第三个就复杂点。 返回的这个格式,应该是XMLRPC的标准格式,但是Blogger不认,Blogger认datetime对象的isoformat()返回的格式。 datetime.datetime.strptime(post[‘dateCreated’].value,”%Y%m%dT%H:%M:%S”)+datetime.timedelta(hours=-8) 这样能够把它转换成datetime对象。之所以要后面减掉8小时,因为这里返回的是本地时间(UTC+8),而Blogger需要的是UTC时间,所以要-8。 categories是个list,每项是个字符串,就是分类。 后来搞了一天不成,第二天想着把Comments也移过来。 这个不是metaWeblog力所能及的了,只好直接抓网页了。 本来想把comment的内容提取出来用Blogger API的comment功能发上去。无奈这个comment功能目前只能用自己的帐号发comment,这个看上去就很不好看。后来想想,干脆直接把网页的评论部分处理一下,附在内容后面,还能保存原有风格,以及发送时间、发送人信息等。 httpold = urllib2.urlopen(post[‘link’]).read() 这样先把网页抓下来。 草稿也是返回的,而草稿会抓来一个错误网页。另一方面,在抓下来的网页中发现错误,我就认为这个是草稿——虽然这个像dirty hack,但是也能用用~ commentpart = comm_exp.search(httpold).groups()[0] newcommentpart = comm_re2.subn(“”,commentpart) 其中 comm_exp = re.compile(“(

[\d\D]*

)\s*<div id=\”commentform\”>
“) comm_re2 = re.compile(“(&lt;a id=\”_ctl\d+__ctl\d+_CommentList__ctl\d*_EditLink.*</a&rt;)”)#(.*)</a>\r\n</h4>
\s*

\s*(.*)