我发现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 = titlepost.content = contentpost.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 = titlepost.content = contentpost.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 = 0self.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': []}@propertydef post_status(self):return self._post_status@post_status.setterdef post_status(self, value):valid_statuses = ['private', 'draft', 'publish']if value in valid_statuses:self._post_status = valueelse: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时间,到期则率
为了防止滥用,代码就不公开了,知道思路了,就可以自己动手操作了,是不是很简单