本地同步博客园

一直以来,写博客有个痛点,单单在博客平台写文章吧,担心博客丢失或者被删除,如果每次发布后再下载至本地存档,这个过程又过于繁杂。在本地写博客吧,无法便捷的分享和阅读,所以打算写一个本地博客同步的小程序,每次在Typoramarkdown写完博客,执行程序自动将本地的博客同步到博客园。

那么如何来实现这个程序呢?一开始是想通过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之间进行翻译的细节。

首先来看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

posted @ 2021-04-19 18:30  savagefoo  阅读(151)  评论(0)    收藏  举报