我發現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時間,到期則率
為了防止濫用,代碼就不公開了,知道思路了,就可以自己動手操作了,是不是很簡單