本地同步博客园
一直以来,写博客有个痛点,单单在博客平台写文章吧,担心博客丢失或者被删除,如果每次发布后再下载至本地存档,这个过程又过于繁杂。在本地写博客吧,无法便捷的分享和阅读,所以打算写一个本地博客同步的小程序,每次在Typora用markdown写完博客,执行程序自动将本地的博客同步到博客园。
那么如何来实现这个程序呢?一开始是想通过python抓包的形式来发送请求,但在实现的过程中,发现极其麻烦和难度较大,故而放弃。
在搜索引擎的苦苦搜索中,发现找到了一个名叫MetaWeBlog的API。
1、metaWebBlog 概述
MetaWeblog API(MWA)是一个Blog程序接口标准。通过MetaWeblog API,博客平台可以对外公布blog提供的服务,从而允许外面的程序新建,编辑,删除,发布bolg。
MetaWeblog 使用 xml-RPC 作为通讯协议。
XML-RPC是一个远程过程调用(远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。
简单理解就是:在 HTTP请求 中,发送 xml 格式描述的“调用指令”,如果调用成功,会收到 xml格式描述的“执行结果”。
2、博客园文章相关接口:
- blogger.deletePost ——删除博客
- blogger.getUsersBlogs——获取用户博客信息
- metaWeblog.editPost——编辑博客
- metaWeblog.getCategories——获取分类
- metaWeblog.getPost——获取博客
- metaWeblog.getRecentPosts——获取最近的博客
- metaWeblog.newMediaObject——上传图片
- metaWeblog.newPost——添加博客
- wp.newCategory——添加新分类
2.1 接口说明
在博客园管理后台设置页面选项页的地方往下拉可以找到MetaBlog的url,点进去就看API接口的详细说明,类似这样:
https://rpc.cnblogs.com/metaweblog/{userName}
上面的 {userName} 替换成实际的用户名。
下文仅说明“请求的接口和参数”,响应内容在发送成功后一看便知。
2.2 发送方式
HTTP 请求
POST方式到: https://rpc.cnblogs.com/metaweblog/{userName}
请求中的内容是HTML格式,描述了调用参数
2.3 接口协议
2.3.1 获取用户博客信息
- 功能:获取用户博客信息
- 方法名: blogger.getUsersBlogs
- 参数:见下文代码
示例:
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.getUsersBlogs</methodName>
<params>
<param>
<value><string></string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
</params>
</methodCall>
2.3.2 获取最近的文章
- 功能:获取最近的文章
- 方法名: metaWeblog.getRecentPosts
- 参数:见下文代码
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.getRecentPosts</methodName>
<params>
<param>
<value><string>000000</string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
<param>
<value><i4>1</i4></value>
</param>
</params>
</methodCall>
2.3.3 获取文章内容
- 功能:获取文章内容
- 方法名: metaWeblog.getPost
- 参数:见下文代码
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.getPost</methodName>
<params>
<param>
<value><string>{postid}</string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
</params>
</methodCall>
2.3.4 添加文章
- 功能:添加文章
- 方法名: metaWeblog.newPost
- 参数:见下文代码
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<param>
<value><string></string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
<param>
<value>
<struct>
<member>
<name>description</name>
<value>
<string>博客测试内容</string>
</value>
</member>
<member>
<name>title</name>
<value>
<string>标题测试内容</string>
</value>
</member>
<member>
<name>categories</name>
<value>
<array>
<data>
<value>
<string>[Markdown]</string>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
<param>
<value><boolean>0</boolean></value>
</param>
</params>
</methodCall>
2.3.5 编辑文章
- 功能:编辑文章
- 方法名: metaWeblog.editPost
- 参数:见下文代码
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.editPost</methodName>
<params>
<param>
<value><string>{postid}</string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
<param>
<value>
<struct>
<member>
<name>description</name>
<value>
<string>博客测试内容222</string>
</value>
</member>
<member>
<name>title</name>
<value>
<string>标题测试内容222</string>
</value>
</member>
<member>
<name>categories</name>
<value>
<array>
<data>
<value>
<string>[Markdown]</string>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
<param>
<value><boolean>0</boolean></value>
</param>
</params>
</methodCall>
2.3.6 删除文章
- 功能:删除文章
- 方法名: blogger.deletePost
- 参数:见下文代码
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.deletePost</methodName>
<params>
<param>
<value><string></string></value>
</param>
<param>
<value><string>{postid}</string></value>
</param>
<param>
<value><string>{userName}</string></value>
</param>
<param>
<value><string>{password}</string></value>
</param>
<param>
<value><boolean>0</boolean></value>
</param>
</params>
</methodCall>
3、python3使用MetaWeBlog接口
python使用xmlrpc.client模块来调用MetaWeBlog接口的api,这个模块支持编写 XML-RPC 客户端代码;它处理了所有在符合Python对象和XML之间进行翻译的细节。
- Python3内置的xmlrpc.client模块文档:https://docs.python.org/3/library/xmlrpc.client.html
首先来看blogger.getUsersBlogs这个接口,这个接口需要三个参数,appKey、username和password,经过试验,key可以为空,username和password分别是登录博客园的用户名和密码。接口调用的Python代码很简单,首先通过接口URL获取一个ServerProxy对象,然后在该对象上执行方法即可,如下所示:
import xmlrpc.client
# 其中,接口URL就是MetaWeblog的URL。
bp = xmlrpc.client.ServerProxy(接口URL)
print(bp.blogger.getUsersBlogs('', 用户名, 密码))
'''
类似的调用其他的接口
print(bp.blogger.deletePost())
print(bp.metaWeblog.editPost())
print(bp.metaWeblog.getCategories())
print(bp.metaWeblog.getPost())
print(bp.metaWeblog.getRecentPosts())
print(bp.metaWeblog.newMediaObject())
print(bp.metaWeblog.newPost())
print(bp.wp.newCategory())
调用接口方法需要的参数需要自己点击MetaWeBlog的url去查看
'''
4、编写的本地博客同步程序
项目地址:https://gitee.com/Karl-H/syncBlogs
参考:
https://www.cnblogs.com/nickchen121/p/11132957.html
https://www.cnblogs.com/xupccc/p/9565337.html
https://my.oschina.net/u/4318872/blog/4255010
https://blog.csdn.net/vir56k/article/details/105136435
https://zhuanlan.zhihu.com/p/73564778
https://blog.csdn.net/shajunxing/article/details/79553472
https://docs.python.org/3/library/xmlrpc.client.html
https://blog.csdn.net/weixin_30645617/article/details/97408199
https://blog.csdn.net/phphot/article/details/1863764

浙公网安备 33010602011771号