使用metaweblog API实现通用博客发布 之 API测试

使用metaweblog API实现通用博客发布 之 API测试

使用博客比较少,一则是文笔有限,怕写出的东西狗屁不通,有碍观瞻, 二则是懒,很讨厌要登录到网站上写东西,也没有那么多时间(借口)。个人最喜欢用于记录的工具是Zim https://zim-wiki.org/ ,记录东西超级方便,可惜只支持PC版本, 记录的东西可以到处为MarkDown 格式,非常方便(你现在看到的这篇就是用Zim写的)。

无意间看到Vs Code上有博客园的插件,作为程序员,顺手google/百度了一下,原来通用博客都支持使用metaweblog API来访问,还支持直接发布markdown 格式,简直不要太好。 找了找2年前注册的博客源账号,用来测试一下。

发挥典型中国程序员的拿来主义精神,经过goolgle/百度一番搜索,参考以下文档进行API测试,在此表示感谢!!
https://www.cnblogs.com/caipeiyu/p/5475761.html
https://github.com/1024th/cnblogs_githook

1 在哪里找API说明

在博客设置最的最末端,有MetaWeblog 的访问地址链接
点击进入页面,有metaweblog API 的详细说明
具体内容不赘述了。

2 测试API

使用python3 进行API测试,直接上代码:
```python
#encoding = utf-8
#!/bin/sh python3

import xmlrpc.client as xmlrpclib
import json

'''
配置字典:
type | description(example)
str  | metaWeblog url, 博客设置中有('https://rpc.cnblogs.com/metaweblog/1024th')
str  | appkey, Blog地址名('1024th')
str  | blogid, 这个无需手动输入,通过getUsersBlogs得到
str  | usr, 登录用户名
str  | passwd, 登录密码
str  | rootpath, 博文存放根路径(添加git管理)
'''

'''
POST:
dateTime    dateCreated - Required when posting.
string  description - Required when posting.
string  title - Required when posting.
array of string categories (optional)
struct Enclosure    enclosure (optional)
string  link (optional)
string  permalink (optional)
any postid (optional)
struct Source   source (optional)
string  userid (optional)
any mt_allow_comments (optional)
any mt_allow_pings (optional)
any mt_convert_breaks (optional)
string  mt_text_more (optional)
string  mt_excerpt (optional)
string  mt_keywords (optional)
string  wp_slug (optional)
'''

class MetablogClient():
  def __init__(self, configpath):
    '''
    @configpath: 指定配置文件路径
    '''
    self._configpath = configpath
    self._config = None
    self._server = None
    self._mwb = None

  def createConfig(self):
    '''
    创建配置
    '''
    while True:
        cfg = {}
        for item in [("url", "metaWeblog url, 博客设置中有            ('https://rpc.cnblogs.com/metaweblog/blogaddress')"),
                     ("appkey", "Blog地址名('blogaddress')"),
                     ("usr", "登录用户名"),
                     ("passwd", "登录密码"),
                     ("rootpath", "博文本地存储根路径")]:
            cfg[item[0]] = input("输入"+item[1])
        try:
            server = xmlrpclib.ServerProxy(cfg["url"])
            userInfo = server.blogger.getUsersBlogs(
                cfg["appkey"], cfg["usr"], cfg["passwd"])
            print(userInfo[0])
            # {'blogid': 'xxx', 'url': 'xxx', 'blogName': 'xxx'}
            cfg["blogid"] = userInfo[0]["blogid"]
            break
        except:
            print("发生错误!")
    with open(self._configpath, "w", encoding="utf-8") as f:
        json.dump(cfg, f, indent=4, ensure_ascii=False)

  def existConfig(self):
    '''
    返回配置是否存在
    '''
    try:
        with open(self._configpath, "r", encoding="utf-8") as f:
            try:
                cfg = json.load(f)
                if cfg == {}:
                    return False
                else:
                    return True
            except json.decoder.JSONDecodeError:  # 文件为空
                return False
    except:
        with open(self._configpath, "w", encoding="utf-8") as f:
            json.dump({}, f)
            return False

  def readConfig(self):
    '''
    读取配置
    '''
    if not self.existConfig():
      self.createConfig()

    with open(self._configpath, "r", encoding="utf-8") as f:
      self._config = json.load(f)
      self._server = xmlrpclib.ServerProxy(self._config["url"])
      self._mwb = self._server.metaWeblog

  def getUsersBlogs(self):
    '''
    获取博客信息
    @return: {
      string  blogid
      string    url
      string    blogName
    }
    '''
    userInfo = self._server.blogger.getUsersBlogs(self._config["appkey"], self._config["usr"], self._config["passwd"])
    return userInfo

  def getRecentPosts(self, num):
    '''
    读取最近的博文信息
    '''
    return self._mwb.getRecentPosts(self._config["blogid"], self._config["usr"], self._config["passwd"], num)

  def newPost(self, post, publish):
    '''
    发布新博文
    @post: 发布内容
    @publish: 是否公开
    '''
    while True:
      try:
          postid = self._mwb.newPost(self._config['blogid'], self._config['usr'], self._config['passwd'], post, publish)
          break
      except:
          time.sleep(5)
    return postid

  def editPost(self, postid, post, publish):
    '''
    更新已存在的博文
    @postid: 已存在博文ID
    @post: 发布内容
    @publish: 是否公开发布
    '''
    self._mwb.editPost(postid, self._config['usr'], self._config['passwd'], post, publish)

  def deletePost(self, postid, publish):
    '''
    删除博文
    '''
    self._mwb.deletePost(self._config['appkey'], postid, self._config['usr'], self._config['passwd'], post, publish)

  def getCategories(self):
    '''
    获取博文分类
    '''
    return self._mwb.getCategories(self._config['blogid'], self._config['usr'], self._config['passwd'])

  def getPost(self, postid):
    '''
    读取博文信息
    @postid: 博文ID
    @return: POST
    '''
    return self._mwb.getPost(postid, self._config['usr'], self._config['passwd'])

  def newMediaObject(self, file):
    '''
    资源文件(图片,音频,视频...)上传
    @file: {
      base64    bits
      string    name
      string    type
    }
    @return: URL
    '''
    return self._mwb.newMediaObject(self._config['blogid'], self._config['usr'], self._config['passwd'], file)

  def newCategory(self, categoray):
    '''
    新建分类
    @categoray: {
      string    name
      string    slug (optional)
      integer   parent_id
      string    description (optional)
    }
    @return : categorayid
    '''
    return self._server.wp.newCategory(self._config['blogid'], self._config['usr'], self._config['passwd'], categoray)
```

以上是对API的简单封装,万事具备,开始测试

2.1 获取分类

    import core.metablogclient as blogclient

    client = blogclient.MetablogClient('blog_config.json')
    client.readConfig()
    catLst = client.getCategories()
    print(catLst)
    [{'description': '[发布至博客园首页]', 'htmlUrl': '', 'rssUrl': '', 'title': '[发布至博客园首页]', 'categoryid': '0'},
    {'description': '[Markdown]', 'htmlUrl': '', 'rssUrl': '', 'title': '[Markdown]', 'categoryid': '-5'}...]

获取了所有的分类信息,其中我在网站上自建了一个随笔分类,也可以获取到

2.2 新建分类

    import core.metablogclient as blogclient

    client = blogclient.MetablogClient('blog_config.json')
    client.readConfig()
    catid = client.newCategory({
    "name": "[随笔分类]测试分类",
    "slug": "",
    "parent_id": 0,
    "description": "测试建立一个随笔子分类"
    })
    print("新建分类:", catid)
    新建分类: 1536823

但是在博客园网站上无法看到这个分类,使用获取分类再次测试,也无法获取到该分类,使用该分类发布博客,也是无
效的,所以我想__根据年月自动分类__的想法就泡汤啦

2.3 拉取现有博文

    import core.metablogclient as blogclient

    client = blogclient.MetablogClient('blog_config.json')
    client.readConfig()
    posts = client.getRecentPosts(9999)
    print(posts)
    [{'dateCreated': <DateTime '20190829T11:21:00' at 0x2a80990>, 'description': '<p>测试</p>', 'title': '测试', 'enclosure': {'length': 0},
    'link': 'https://www.cnblogs.com/robert-9/p/11428668.html', 'permalink': 'https://www.cnblogs.com/robert-9/p/11428668.html',
    'postid': '11428668', 'source': {}, 'userid': '-2'}]

正确拉取现有博文,通过API文档,发现无法获取博文是否处于发布状态,这是一个遗憾

2.4 发布博文

    import core.metablogclient as blogclient
    import datetime

    client = blogclient.MetablogClient('blog_config.json')
    client.readConfig()
    postid = client.newPost({
      "time": datetime.datetime.now(),
      "title": "metaweblog API随笔发布",
      "description": "##metaweblog API随笔发布\n测试\n",
      "categories": ["[Markdown]"],
      "mt_keywords": "metaweblog;python"
    }, False)
    print('发布随笔:', postid)

测试发布成功,并能在网站上看到该随笔, 如果想发布为文章,日志或新闻,加入必要的分类即可。

2.5 上传图片

    import datetime
    import base64
    import core.metablogclient as blogclient

    client = blogclient.MetablogClient('blog_config.json')
    client.readConfig()
    with open('abc.png', 'rb') as f:
      bs64_str = base64.b64encode(f.read())
      url = client.newMediaObject({
          "bits": bs64_str,
          "name": "abc.png",
          "type": "image/png"
      })
      print(url)
    {'url': 'https://img2018.cnblogs.com/blog/1211514/201908/1211514-20190829114435333-814710358.png'}

测试成功, 这样就可以在上传Markdown 格式之前,自动将本地的图片上传到服务器上了。

原文地址:https://www.cnblogs.com/robert-9/p/11428982.html

时间: 2024-10-29 19:12:11

使用metaweblog API实现通用博客发布 之 API测试的相关文章

【转】如何使用离线博客发布工具发布CSDN的博客文章

目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写博客需要在第三方博客平台注册帐号,且需要第三方博客平台提供API接口.目前的有的博客平台均已关闭博客接口,所以无法使用Word来发布博客. 2.发布到博客或公众号平台的图片无法转载.由于所有博客平台,公众号平台(如微信)开启了图片防盗链功能,作者发布到这些平台上的图片则无法转载到其它的网站中,这限制

Mac端博客发布工具推荐.md

引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后填入用户名和密码即可.效果如图: cnblog

Word2016编辑博客发布至博客园教程

用word2016编辑博客发布至博客园教程 博客园的编辑器不够灵活,且官方推荐的windows live writer不再更新,不知什么原因windows10安装不了,markdown的语法不太熟悉,所以用word编辑博客既方便又快捷. 点击文件à共享à发布至博客 在弹出对话中点击立即注册à在"选择博客提供商中选中其他"à点击下一步 在弹出注册框中设置如下: 再点击图片选项,在弹出框中选择"我的博客提供商 测试 博客效果 原文地址:https://www.cnblogs.co

@借助 Alfred 简化博客发布流程

为了方便管理已经发布的博文,所以目前本地使用 Mweb 的外部模式对已有博文进行管理,所以整个博文发布流程变得有点繁琐,需要在终端与 Mweb 两个程序间进行不断的切换,而且每次发布过程都需要输入重复指令,如:hexo new post 'title', hexo clean, hexo g -d,git add -A git commit -m 'message'等等.为了能够简化这个发布流程,选择采用 Alfred 的工作流来解决这个问题. 目前的发布流程: 为什么要在 Mweb 外部模式和

利用MetaWeblog API 自制博客发布小工具

博客园提供了诸多数据接口, 利用这些接口可以很容易的实现博客的发布,修改,删除等 1.需要引用一个DLL:为CookComputing.XmlRpcV2 2.新建一个类,在其中是一些要实现的东西,如: 3.调用这些接口发布一篇简单的博客,其中的URL应该是你的博客设置里的 在下方的账号与密码处填上你的账号与密码 4.查看结果

Vue 全家桶 + Express 实现的博客(后端API全部自己手写)

为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVVM,你刚唱罢我登场. backbone,AngularJS 已成昨日黄花,reactjs 如日中天,同时另一更轻量的 vue 发展势头更猛,号称兼具了 angularjs 和 reactjs 的两者优点. 2.Vue能干吗 移动端的上网需求已经远高于pc端,特别是 hybrid 方式的H5应用中,但是性能问题一直是痛点. 如果使用 SPA(就是俗称的单页应用(Single Page Web A

51CTO博客发布H5移动版(适配手机)2017.5.17

各位,51CTO博客于5月17日发布H5移动版,可以适配手机和平板,分享文章到手机,阅读体验更佳,扫码可以进入(进入后,可以收藏到浏览器或展示在手机桌面,以后可以打开进入博客): 后续我们还会继续优化移动站的首页,也欢迎广大博友的建议和意见.

【Alpha阶段】展示博客发布!

1.团队成员简介 ? ? 2.典型用户描述 ? ? 2.1 团队项目的目标 本项目致力于计算机计算代替人工计算,使用简单可行的原理,利用服务器端的计算功能将高校学生从物理实验的繁杂计算中解脱出来而开发的一款网站. 2.2 预期的典型用户 名字 小徐 性别 男 职业 某校一般学院大三学生 物理知识层次与能力 好得我实验都重修了 生活情况 大三也要每周花将近一天时间坐地铁回沙河上物理实验,十分苦逼 动机 我真的不想再挂科了 目的 希望能够帮助自己处理好实验报告,至少能保证实验报告不因数据处理步骤不对

汇总博客常见的api接口地址(windows live write)

1. cnblogs 日志地址,直接输入 http://www.cnblogs.com/xxxxx/ api接口 http://www.cnblogs.com/xxxx/services/metablogapi.aspx 2. 51cto http://xxxxxx.blog.51cto.com/ Metaweblog API: http://xxxxxx.blog.51cto.com/xmlrpc.php 3. csdn http://blog.csdn.net/xxxxxx Metawebl