python zblog API实现类似XMLRPC/发布文章

2023-12-13 18:42:09

我发现python对Zblog的XML发布并不友好,虽然也有对应的模块,但是远远没有XPCRPC更直接方便,但是使用xmlRpc是直接给发布文章带来了不小的便利,但是对系统也并不友好,但是zblog也开放了Api,但是干部子弟不乐意了,想自己琢磨。
对于wordpress系统,大家都熟悉一个模块 wordpress_xmlrpc 利用此模块可以轻松将文章发布到wordpress系统中,也可以轻松上传附件。总体总结以下好处。

  • 使用无门槛,方便
  • 自动创建分类
  • 自动创建标签
  • 上传附件
  • 无需验证码

使用方法简单如下:

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import posts
wp = Client('https://domain.com/xmlrpc.php', 'username', 'password')
def post_new_article(title, content):
    post = WordPressPost()
    post.title = title
    post.content = content
    post.post_status = 'draft'  # 文章状态,不写默认是草稿,private表示私密的,draft表示草稿,publish表示发布
    post.terms_names = {
        'category': ['分类目录'],
        'post_tag': ['标签1', '标签2'],
    }

    post.id = wp.call(posts.NewPost(post))
    return post.id

是不是很方便,简单,以上category和post_tag如果不存在则自动创建

下面来看下zblog,zblog可以搜一下看,并没有类似于wprdpress这块模块,但是对于XmlRpc也有对应的方法,但是那种方法并不方便,而且要手动创建分类和标签,一般作者会在zblog的xmprc中实现对newPost方法的支持,然后在写一个方法,这个方法确实可以,也能实现以上的功能,对于很多模块需求还是受限,但对于科班出生的野生代码崽就显得尤为无助,此外系统对于检测也有排斥,总会提示这个文件不是最新文件,而且更新后会将这个文件给还原。
俗话说没有轮子就自己造轮子,我就用了zblog的api来实现类似的功能,地址如下 https://docs.zblogcn.com/php/#/books/api-05-design

对于拥有强迫症的我来说,格式必须要一样的,而且要兼容

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import posts
from zblogApi_xmlrpc import Client,ZblogPressPost
wp = Client('www.domain.com', 'username', 'password')
def post_new_article(title, content):
    post = ZblogPressPost()
    post.title = title
    post.content = content
    post.post_status = 'draft'  # 文章状态,不写默认是草稿,private表示私密的,draft表示草稿,publish表示发布
    post.terms_names = {
        'category': ['分类目录'],
        'post_tag': ['标签1', '标签2'],
    }
    post.id = wp.call(posts.NewPost(post))
    return post.id

使用以上方法就可以发布成功了

首先添加对post的支持

class ZblogPressPost:
    def __init__(self):
        # self.id = 0
        self.title = ''
        self.content = ''
        self.post_status = 'draft'  # 默认状态为草稿
        self.meta_koileedesc=''
        self.meta_koileekey=''
        self.meta_tesetu = ''
        self.meta_recommend=''
        self.terms_names = {
            'post_tag': [],
            'category': []
        }

    @property
    def post_status(self):
        return self._post_status

    @post_status.setter
    def post_status(self, value):
        valid_statuses = ['private', 'draft', 'publish']
        if value in valid_statuses:
            self._post_status = value
        else:
            raise ValueError(f"Invalid post status: {value}. Valid options are {valid_statuses}")

    def __repr__(self):
        return str(self.to_dict())

    def to_dict(self):
        return {
            'title': self.title,
            'content': self.content,
            'post_status': self._post_status,
            'terms_names': self.terms_names,
            "meta_koileedesc":self.meta_koileedesc,
            "meta_koileekey":self.meta_koileekey,
            "meta_tesetu" :self.meta_tesetu,
            "meta_recommend":self.meta_recommend
        }

其次对zblog的封装


class Client:
    BASE_URL = '/zb_system/api.php'
    LOGIN_ENDPOINT = 'mod=member&act=login'
    CATEGORY_ENDPOINT = 'mod=category&act={action}'
    TAG_ENDPOINT = 'mod=tag&act={action}'
    POST_ENDPOINT = 'mod=post&act=post'
    UPLOAD_ENDPOINT = "mod=upload&act={action}"

以下支持

  • 使用无门槛,方便
  • 分类不存在自动创建分类
  • 标签不存在自动创建标签
  • 上传附件
  • 登入token,并设置token_expiration时间,到期则率
    为了防止滥用,代码就不公开了,知道思路了,就可以自己动手操作了,是不是很简单

文章来源:https://blog.csdn.net/SquirrelPineal/article/details/133516404
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。