现在国内的Blog不敢说稳定,三天两头的关,再有就是出问题。这不Donews也出现过,我有几张图片(虽然不多)但还是丢了,我也懒得去找了。于是就提出建议,是否可以自已做备份。大鱼儿说很快,但是多快,还说不准。想起一个叫webeditor的软件,以前用过,可以与donews连上,但现在不知怎么连不上了,它可以实现Blog的备份。曾经与forestsong讨论过自已写个备份程序,但。。。不过现在我终于写了一个小Python程序,可以实现备份了。

这个程序只能用在donews上,使用前要修改一些配置。下面是整个程序:

import xmlrpclib
import os.path
import os
import codecs
import traceback

name = ‘yourname’
password = ‘yourpassword’
dir = ‘./blogback’
url = ‘http://www.donews.net/<yourname>/services/metablogapi.aspx’
number = 9999
encoding = ‘cp936′

htmltemplate = “”"<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=%(encoding)s”/>
<title>%(title)s</title>
<style type=’text/css’>body {font-family:Verdana,Sans-serif; font-size:10pt;line-height:150%%;}</style>
</head>
<body>
<h2 align=”center”>%(title)s</h2>
<p align=”center”><a href=”%(link)s”>%(link)s</a> – %(date)s</p>
%(description)s
</body>
</html>”"”

def main():
    if not os.path.exists(dir):
        os.mkdir(dir)
           
    print ‘Connecting to server – %s\n’ % url
    server = xmlrpclib.Server(url)
       
    print ‘Getting posts number = %d\n’ % number
    result = server.metaWeblog.getRecentPosts(”, name, password, number)
    num = 0
       
    for v in result:
        filename = os.path.normpath(os.path.join(dir, formateFilename(v['title']+’.htm’)))
        v['date'] = getDateTime(v['dateCreated'])
        v['encoding'] = encoding
        print ’saving —- %s …’ % filename
        try:
            try:
                fp = file(filename, ‘wb’)
                writer = codecs.lookup(encoding)[3](fp)
                writer.write(htmltemplate % v)
            except:
                traceback.print_exc()
        finally:
            fp.close()
        num += 1
    print ‘\nFinished! Total %d posts be saved!’ % num

def getDateTime(d):
    a = str(d)
    return a[0:4]+’/'+a[4:6]+’/'+a[6:8]+’-'+a[9:]
       
def formateFilename(filename):
    s = r’/\<>?:*”|’
    f = ”
    for ch in filename:
        if ch in s:
            f += ‘%’ + oct(ord(ch))
        else:
            f += ch
    return f
       
if __name__ == ‘__main__’:
    main()

刚开始的几个变量,在运行前要进行修改:

name = ‘yourname’
password = ‘yourpassword’
dir = ‘./blogback’
url = ‘http://www.donews.net/<yourname>/services/metablogapi.aspx’
number = 9999
encoding = ‘cp936′

  • name是你的blog名字
  • password是你的blog管理口令
  • dir是你的blog要保存的路径,如果不存在,这个程序会进行创建
  • url是你的blog web services地址,因为是针对donews的,只要把替换成你在donews的用户名即可
  • number是要取的条数。它是从最新的记录开始向前取,我设为9999,就是想把全部的都取下来。以后再做备份,只有计算从上次取回后,还有多少条没取才可以。这里没有实现取指定条的功能,有兴趣自已改程序吧。
  • encoding是保存到本地文件时所用的编码。取回的数据缺省为unicode,因此要进行转码。cp936就是GBK码。

htmltemplate是一个HTML的模板。每个blog将保存为一个HTML文件,只包含内容。

本程序只是作备份,不能发新贴,编辑贴子。这些功能我没有试,而且donews使用的是codelphi改过的.text blog系统,加入了一些功能,不知道还能使用标准的metaWeblogApi来发贴吗?有时间试一试。或者谁试成功了,告诉本人一声,先谢谢了。

使用的技术是xmlrpc调用metaWeblogApi来实现的。xmlrpc可以使用python 2.2版以后所带的xmlrpclib模块,很简单,看一看程序应该就会了。metaWeblogApi是扩展了blogger的API,它是许多blog使用的web service的接口函数。webeidtor就是调用了这个接口实现的远程上传和下传。关于metaWeblogApi的详细说明可以看我前面的blog: [LINK]MetaWeblog API & 竹笋炒肉


15条评论

  1. 好东西耶!

    copy下来先,明天试一下

    :)

  2. 这年头blog服务商不稳定,大家都来写备份程序了…就在上周末,我才写了个备份blogcn的程序,用java httpclient 抓叶面下来用regexp 提取内容,然后在本地保存成RDF. blogcn更惨,这两个星期就好了几天,评论还都没了。我都抓不下来了。

    看来不得不自己建站了,前段时间我中文化开源的roller项目(就是jroller.com 和 sun blogs用的那个),接近完成了吧,还有点小bug, 在这里:www.rsblog.com .

    现在玩blog的人越来越多,开个稳定的blog是越来越难了。看来还是要限制人数,几个好友自己玩了。反正roller是开源的,要架站的人可以随意去架。

  3. 以前去的你网站看到关于roller,不过java我只是学过,没用它编过什么东西。有机会向你讨教讨教。

  4. 保存了所有日志都没问题

    如果能生成目录,并保存回复那多好啊。

  5. 生成目录是没有问题的。但回复没有接口,不好做,当然想做也可以实现,比如把每个回复页面抓回来,再进行分析,然后再保存。不过,有新增的回复可能就不方便了。不好判断哪些回复是新增的。如果donews提供这个web services就可以了。

    总之,想实现是可以的,不过要多花些时间了。大家有兴趣可以自已改呀。只要能备下来已经满意了。

  6. 我的blog是csdn的,看来我也要写一个来保存我的blog了!

  7. limodou, welcome your posting this good piece on cnblog. write to me isaac.mao@gmail.com

  8. 看不懂。

    想用java写一个。

  9. 用了一下,非常不错,谢谢~~!

    我对Python是一无所知的!~

  10. 有兴趣学一学吧,很容易上手。

  11. Python我不懂哦,怎么运行都不知道。

  12. 那要学一学python的基本使用才可以的 :)

  13. 今天,IT行家们普遍都认为,面向中国市场的、桌面客户端中文软件都是没有前途的、挣不到一分钱的,但同时,广大的用户是否却在热切期待着真正能解决他们需求的东西呢?

  14. 都三年了,不过还是有个问题。

    通过这个可以连到 blogjava.net

    csdn blog也是基于metaweblog,

    不知道是不是入口不对。

    http://blog.csdn.net/border1985/services/metablogapi.aspx

    谢谢

  15. 因为没有详细的说明,上面的地址还是以前看别人写过的一个blog工具所给出的地址。所以csdn到底是什么我从来没有试过。而且donews的metablogapi已经无法正确使用了。

发表评论

评论也有版权!