一、
今天使用python-wordpress-xmlrpc的时候遇到了一个大坑,在这里记录一下。
首先通过pip install python-wordpress-xmlrpc命令安装,虽然提示:Successfully installed python-wordpress-xmlrpc-2.3,但是同时又有如下的警告信息。
distributed 1.21.8 requires msgpack, which is not installed.
twisted 17.5.0 has requirement Automat>=0.3.0, but you'll have automat 0.0.0 which is incompatible.
这个错误没有关系,继续使用。然后在向wordpress网站提交内容的时候,老是出现如下的错误:
Traceback (most recent call last):
File "test.py", line 5, in
wp = Client('http://www.xxx.cc/xmlrpc.php', 'username', 'password')
File "C:\ProgramData\Anaconda3\lib\site-packages\wordpress_xmlrpc\base.py", li
ne 24, in __init__
self.supported_methods = self.server.mt.supportedMethods()
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1112, in __call__
return self.__send(self.__name, args)
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1452, in __request
verbose=self.__verbose
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1154, in request
return self.single_request(host, handler, request_body, verbose)
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1170, in single_req
uest
return self.parse_response(resp)
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1336, in parse_resp
onse
p.feed(data)
File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 439, in feed
self._parser.Parse(data, 0)
xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: li
ne 2, column 0
开始以为是自己的代码问题,用官方的示例代码,同样的出错提示。
解决方案一:
后来换了一个网站试试,竟然成功了,应该不是代码的问题。
解决方案二:
怀疑是wordpress版本的问题(也许最新版本禁用了xmlrpc),下载了一个“Control XML-RPC publishing”插件,手动开启了xmlrpc,还是不行。
解决方案三:
之前在百度没有找到网上有关“xml.parsers.expat.ExpatError: XML or text declaration not at start of entity”、"C:\ProgramData\Anaconda3\lib\xmlrpc\client.py"的消息,改用google搜索。在github找到了有人碰到同样的情况。然后依上面的方法,打开C:\ProgramData\Anaconda3\Lib\xmlrpc下面的client.py文件,将其中的:
def feed(self, data): self._parser.Parse(data, 0)
改成如下的代码:
def feed(self, data): self._parser.Parse(data.strip(), 0)
然后再次测试,终于成功了。
附最简单的测试代码如下:
from wordpress_xmlrpc import Client, WordPressPost from wordpress_xmlrpc.methods.posts import GetPosts, NewPost from wordpress_xmlrpc.methods.users import GetUserInfo wp = Client('http://www.xxx.cc/xmlrpc.php', 'username', 'passowrd') """ 发表博文 """ post = WordPressPost() post.title = "this is test" post.content = "this is content" post.post_status = 'publish' post.terms_names = { 'post_tag': ['test', 'firstpost'], 'category': ['test'] } wp.call(NewPost(post))
小提示:
1、wordpress后台并没有test这个分类,python脚本可以自动建立这个分类。
2、标签也测试添加成功。
3、如果要插入文章摘要,应该用post.excerpt = article_desc,详细的用法可以看这里:
https://python-wordpress-xmlrpc.readthedocs.io/en/latest/ref/wordpress.html#wordpresspost
二、如何向子目录中插入文章?
如果要向子目录中插入文章,先建立好子目录,然后在代码中的category那里直接填子目录的名称就可以了。
post.terms_names = { 'post_tag': ['招商', '加盟'], 'category': ['child-01'], }
三、xmlrpc更新wordpress的功能
今天试用了xmlrpc更新wordpress的功能,备忘一下。
#!/usr/bin/env python #-*- coding: utf-8 -*- from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm from wordpress_xmlrpc.methods.posts import GetPosts, NewPost from wordpress_xmlrpc.methods.users import GetUserInfo from wordpress_xmlrpc.methods import taxonomies import csv wp = Client('http://127.0.0.1/xmlrpc.php', 'root', '123456') tag = WordPressTerm() tag.taxonomy = 'category'#这里为category的话插入的是category,为post_tag的话插入的是tag tag.name = 'My New Tag' tag.id = wp.call(taxonomies.NewTerm(tag))
我用的是中文测试,执行python文件之后,没有任何提示,但是看wordpress博客,文章已经发布成功了,标题、内容、标签、文章分类一个也没有错。
而且它有一个功能,可以将文章的发布状态设置为“draft”,这正是我十分需要的一个功能。
真的非常方便与简单。
四、新建分类
from wordpress_xmlrpc import Client, WordPressPost from wordpress_xmlrpc import WordPressTerm from wordpress_xmlrpc.methods.posts import GetPosts,NewPost from wordpress_xmlrpc.methods import taxonomies wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234') #新建分类 cat = WordPressTerm() cat.taxonomy = 'category' cat.name = 'cat1'#分类名称 # cat.slug = 'bieming2'#分类别名,可以忽略 cat.id = wp.call(taxonomies.NewTerm(cat))#新建分类返回的id print("发布成功!新建设的分类ID为{}".format(cat.id))
新建子分类:
from wordpress_xmlrpc import Client, WordPressPost from wordpress_xmlrpc import WordPressTerm from wordpress_xmlrpc.methods import taxonomies wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234') #新建子分类 parent_cat = wp.call(taxonomies.GetTerm('category', 13))#20是父分类的id child_cat = WordPressTerm() child_cat.taxonomy = 'category' child_cat.parent = parent_cat.id child_cat.name = 'My Child Category'#分类名称 child_cat.id = wp.call(taxonomies.NewTerm(child_cat))#新建分类返回的id print("发布成功!新建设的子分类ID为{}".format(child_cat.id))
其实第一行可以不用。
成果展示:
五、如何插入自定义字段的数据以及如何插入图片
请看这里
可以参考的网站:
http://xiaohost.com/1802.html
https://www.168seo.cn/jianzhan/wordpress/1970.html