Python使用MetaWeblog批量迁移到博客园

最新把博客从简书迁移到博客园了,各种平台里,还是博客园最适合写技术博客。

为了不一篇篇复制,搜了一下,发现了MetaWeblog这个API。
我用的是Python里的xmlrpc库。不得不说,写一些工具脚本还是Python最方便,几行代码就能搞定。

功能

根据博客园Metaweblog提供的API,可以完成自己博客账户的大部分操作:
包括发布、修改、删除、获取最近发布等。

blogger.deletePost
blogger.getUsersBlogs
metaWeblog.editPost
metaWeblog.getCategories
metaWeblog.getPost
metaWeblog.getRecentPosts
metaWeblog.newMediaObject
metaWeblog.newPost
wp.newCategory

发布博客

首先要配置一些自己的账户信息,用户名密码自不必说,TOKEN从博客园的设置》更多设置》Metaweblog访问令牌获取,MetaWeblog访问地址也在那里。

用账户信息和待发布的博客数据调用metaWeblog.newPost方法即可。

import xmlrpc.client
import time
import os

BLOG_USERNAME = 'rome753' # 博客用户名
BLOG_PASSWORD = '' # 博客密码
BLOG_TOKEN = ''
METAWEBLOG_API = 'https://rpc.cnblogs.com/metaweblog/rome753' # 博客metaweblog api地址


def new_post(title, content, category):
    # 构建发布内容
    struct = {
        'title': title,
        'dateCreated': 0,
        'description': content,
    }
    if category is not None:
        struct['categories'] = ['[Markdown]', category]
    else:
        struct['categories'] = ['[Markdown]']

    client = xmlrpc.client.ServerProxy(METAWEBLOG_API)
    postid = client.metaWeblog.newPost('',BLOG_USERNAME, BLOG_TOKEN, struct, True)
    print('发布成功' + postid)

虽然代码很少,但是坑也不少,有几个需要特别注意的地方:

  • 发布内容里标题title、内容description和创建日期dateCreated是必填的,创建日期可以填0,最终显示的是当前时间。
  • 内容description我填的是markdown文本,注意此时分类categories里一定要加上'[Markdown]',否则传上去的格式有问题,不会换行。
  • client.metaWeblog.newPost的方法参数里用的是用户名和TOKEN,不是用户名和密码!我找了很久在哪传TOKEN,结果发现是直接把密码换成TOKEN就行了。其实没传TOKEN接口也返回提示了,怪自己没仔细看!
  • 发布成功后会返回postid,拼接一下就是这篇博客的url地址。

批量发布

我本地的博客保存在两层目录里,把它们全部读取出来发布,文件名都是.md后缀的。注意博客园每分钟不能发布超过3篇。每篇发布后我加了30s延时。

postCount = 0

def readMyBlog():
    postCount = 0
    path = '' # 本地目录,我这是两层目录
    dir = os.listdir(path)
    for d in dir:
        pp = os.path.join(path, d)
        if os.path.isdir(pp) == False:
            continue
        dd = os.listdir(pp)
        for ff in dd:
            if ff.endswith('.md') == False:
                continue
            p = os.path.join(pp, ff)
            f = open(p, 'r+', encoding="utf-8")
            title = ff[:len(ff)-3]
            print(title)
            content = f.read()
            category = None
            if (title.startswith('Android')):
                category = 'Android'
            if (title.startswith('iOS')):
                category = 'iOS'
            if (title.startswith('FFmpeg')):
                category = 'FFmpeg'
            if (title.startswith('OpenCV')):
                category = 'OpenCV'
            f.close()

            if postCount < 0: # 从上次报错的位置继续
                postCount += 1
                continue
            print(postCount)
            new_post(title, content, category)
            postCount += 1
            time.sleep(30)

获取最近发布

调用metaWeblog.getRecentPosts方法即可。返回的数据直接就是列表。

注意:返回列表元素里面的创建时间'dateCreated'是<class 'xmlrpc.client.DateTime'>类型的,不能直接转JSON字符串,它的value字符串类型的。


def getRecentPost():
    client = xmlrpc.client.ServerProxy(METAWEBLOG_API)
    r = client.metaWeblog.getRecentPosts(BLOG_USERNAME,BLOG_USERNAME,BLOG_TOKEN,100)
    print('读取博客,篇数:%d' % len(r))
    for j in r:
        xmlrpcTime = j['dateCreated']
        j['dateCreated'] = xmlrpcTime.value # string
    f = open('cnblog.txt','w')
    f.write(json.dumps(r))
    f.close()
posted @ 2022-07-20 10:33  rome753  阅读(87)  评论(0编辑  收藏  举报