wordpress_xmlrpc模块
Client类是连接登录WordPress的接口,使用该类就初始化一个wp的客户端。然后就可以通过这个客户端对wp进行相关的操作。
class Client(url, username, password[, blog_id, transport])
参数说明:
url:WordPress站点的xmlrpc文件所在的url
username: 站点后台用户名
password: 站点后台的密码
blog_id:博客的id(WordPress会忽略这个值)(不需要填)
transport: 自定义XML-RPC传输实现(不需要填)
Client类:返回wordpress_xmlrpc.base.Client对象。如果返回了wordpress_xmlrpc.base.Client对象则可以表明登录成功了。
Client对象还有一个call方法,该方法用来调用xml-rpc的方法的,也就是说所有的xml-rpc方法都是要通过call方法调用才能执行。
WordPress_xmlrpc对象
登录成功后我们就可以对WordPress_xmlrpc的一些对象进行操作了,这里有一份官方文档,列举了WordPress的所有可操作对象及其属性。官方文档:http://python-wordpress-xmlrpc.readthedocs.io/en/latest/ref/wordpress.html
WordPress_xmlrpc方法
官方文档:http://python-wordpress-xmlrpc.readthedocs.io/en/latest/ref/methods.html。这里需要重点说明Methods类,我们的发文工具主要就是运用这个类的多种方法来实现的。Methods类中有几个常用的方法:
GetPosts方法(获取文章信息)
class wordpress_xmlrpc.methods.posts.GetPosts([filter, fields])
获取所有文章,返回WordPressPost实例,以文章列表形式。我们可以通过下面的代码简单测试一下,获取WordPress文章的标题,内容,content,但是不是所有的,好像是最近更新的吧!
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.exceptions import ServerConnectionError
from wordpress_xmlrpc.methods import posts
from wordpress_xmlrpc.methods.posts import GetPosts
try:#检测登录是否成功,我们登录WordPress后台
#前提不要禁用xmlrpc
# url=input('输入你的xmlrpc地址(XX/xmlrpc.php):')
# wordpress_admin=input('输入WordPress后台用户名:')
# wordpress_password=input('输入WordPress后台密码:')
# client=Client(url,wordpress_admin,wordpress_password)
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登陆成功')
#获取所有文章,返回WordPressPost实例,文章列表
post_list=client.call(posts.GetPosts())
#from wordpress_xmlrpc.methods import posts
#from wordpress_xmlrpc.methods.posts import GetPosts
#所有的xml_rpc方法都需要通过call方法调用
for i in post_list:
print(i.title)#打印标题
#print(i.content)
print(i.link)#打印链接
NewPost()方法(发布文章)
class wordpress_xmlrpc.methods.posts.NewPost(content)
创建一篇新文章。需要用到WordPressPost实例的至少两个参数:title和content。但是我们发现NewPost()方法将文章发布到了后台保存的是草稿,这是因为发布状态默认选择的是草稿。如果需要更改发布状态,可以通过修改WordPressPost()实例post_status属性的值:
publish:已发布
pending:等待复审
draft:草稿
from wordpress_xmlrpc import Client
from wordpress_xmlrpc import WordPressPost
from wordpress_xmlrpc.methods import posts
from wordpress_xmlrpc.exceptions import ServerConnectionError
try:
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登录成功')
#NewPost()方法,新建一篇文章
newpost=WordPressPost() #创建类实例
newpost.title='hello wordpress' #文章标题
newpost.content='这是你的第一篇WordPress文章,你可以编辑或者发布它'#文章内容
#设置发布状态,默认是草稿
newpost.post_status='publish'
#发布新建的文章,返回的是文章id,自己尝试
print(client.call(posts.NewPost(newpost)))
这个时候我们又发现,所有的文章都是发布到默认的“未分类”目录下,那我们想将发布到指定目录下该如何操作呢?WordPressPost类有一个属性是terms_names ,通过设置这里的值(字典格式:来指定栏目目录,因为一篇文章可以属于多个栏目,所以字典的值是一个列表,里面包含了所选栏目。当然了有了分类目录肯定还有标签了,WordPressPost类的terms_names 属性不仅可以指定栏目目录,还可以指定文章标签,在字典内新增标签的键值对就好了,多个标签用英文逗号分隔
{'category': ['栏目名 1','栏目名 2','栏目名 3',...],
'post_tag':['tag1','tag2','tag3',...]})
那么具体代码可参考:
from wordpress_xmlrpc import Client
from wordpress_xmlrpc import WordPressPost
from wordpress_xmlrpc.methods import posts
from wordpress_xmlrpc.exceptions import ServerConnectionError
try:
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登录成功')
#NewPost()方法,新建一篇文章
newpost=WordPressPost() #创建类实例
newpost.title='hello wordpress' #文章标题
newpost.content='这是你的第一篇WordPress文章,你可以编辑或者发布它'#文章内容
#设置发布状态,默认是草稿
newpost.post_status='publish'
#设置发布目录(一篇文章可以属于多个分类目录)
newpost.terms_names={
'category':['Python3教程'],#我这里就添加一个,可以参考添加多个分类目录
'post_tag':['tag1','tag2'],#添加多个标签
}
#发布新建的文章,返回的是文章id,自己尝试
print(client.call(posts.NewPost(newpost)))
wordpress-xmlrpc里Methods类的taxonomies()方法。taxonomies方法主要用于获取文章分类,当然,这个分类不是指文章的栏目分类,具体是什么分类呢?我们使用taxonomies方法的GetTaxonomies()属性来获取一下所以分类试试,看获取到的分类是什么内容:
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.methods import taxonomies
from wordpress_xmlrpc.exceptions import ServerConnectionError
try:
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登录成功')
for i in client.call(taxonomies.GetTaxonomies()):
print(i)
#打印结果如下:
#category
#post_tag
#post_format
发现跟我们之前写的文章发布分类字典内的键是一致的,所以GetTaxonomies()获取到的分类是指写文章发布代码时用到的分类变量名。
taxonomies方法还有一个比较重要的属性是GetTerms(),这个属性可以获取到某个分类下所有的值,这里的分类就是我们刚才用GetTaxonomies()获取到的“category、post_tag、post_format”三个分类。怎么应用呢?比如我们想知道网站总共有哪些标签,就可以使用GetTerms(‘post_tag’)来获取:
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.methods import taxonomies
from wordpress_xmlrpc.exceptions import ServerConnectionError
try:
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登录成功')
for i in client.call(taxonomies.GetTerms('category')):
print(i.name)#打印所有的分类目录,标签同理
同样能查看所有的分类目录,我们也可以使用NewTerms()来创建一个新的分类目录,参考代码:
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.methods import taxonomies
from wordpress_xmlrpc import WordPressTerm
from wordpress_xmlrpc.exceptions import ServerConnectionError
try:
client=Client(url,wordpress_admin,wordpress_password)
except ServerConnectionError as e:
print('登录失败',e)
else:
print('登录成功')
#NewTerms()属性,创建一个新的分类
cate=WordPressTerm() #实例化
cate.name='小说'
cate.slug='novel'#别名就是在url显示的内容
cate.taxonomy='category'#指定新建到哪个分类下
print(client.call(taxonomies.NewTerm(cate)))# 返回新创建的分类栏目id,已经新建成功!
封装函数
当然了,我们发布一篇正常的文章出了需要分类目录和标签,还是需要添加描述符的,那么具体代码可参考:
from wordpress_xmlrpc import Client
from wordpress_xmlrpc import WordPressPost
from wordpress_xmlrpc.methods import posts
def post(client,title,content,category):
newpost = WordPressPost()
newpost.title = title# 标题
newpost.content = content# 正文
newpost.terms_names = {
'category':[category]} # 分类目录
newpost.post_status = 'publish'# 发布状态设置为已发布
try:
pid = client.call(posts.NewPost(newpost))
purl = 'XXX/?p=%s' % pid# 发布的文章url
except:
return False
else:
return purl
if __name__== '__main__':
try:
client=Client(url,wordpress_admin,wordpress_password)
except:
print('登录失败')
else:
#print('登录成功')
print('文章发布成功:{0}'.format(post(client,title,content,'休闲文章')))# 传入post()函数
一般来说我们发布的内容可能你是采集到本地的文件夹中,这里直接提取带标签的内容,我们直接就可以在WordPress后台使用代码编辑发布。那么我们可以使用下面的代码进行遍历读取,然后发布,具体的内容可以设置不同的正则提取出来,比方说标签,可以提取strong标签(观察数量是否合适),描述符的话随便提取能概括的一段吧!这个比较困难。
def read_text():
path='E:/休闲文章'
files=os.listdir(path)#返回文件夹下所有的文件名字
for file in files: #遍历
if not os.path.isdir(file): #判断是否是文件
with open(path+'/'+file,'r',encoding='utf-8') as f:
iter_i=f.read()
#通过具体的正则,提取相关内容
pattern=re.compile('(.*?)
data=pattern.match(iter_i)
title=data.group(1)
content=re.sub(title,'',iter_i)
content_list={}
content_list['title']=title
content_list['content']=content
yield content_list