我发现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时间,到期则率
为了防止滥用,代码就不公开了,知道思路了,就可以自己动手操作了,是不是很简单