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()