一、
今天使用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文件,将其中的:
2 |
self._parser.Parse(data, 0) |
改成如下的代码:
2 |
self._parser.Parse(data.strip(), 0) |
然后再次测试,终于成功了。
附最简单的测试代码如下:
1 |
from wordpress_xmlrpc import Client, WordPressPost |
2 |
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost |
3 |
from wordpress_xmlrpc.methods.users import GetUserInfo |
10 |
post.title = "this is test" |
11 |
post.content = "this is content" |
12 |
post.post_status = 'publish' |
14 |
'post_tag' : [ 'test' , 'firstpost' ], |
18 |
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那里直接填子目录的名称就可以了。
2 |
'post_tag' : [ '招商' , '加盟' ], |
3 |
'category' : [ 'child-01' ], |
三、xmlrpc更新wordpress的功能
今天试用了xmlrpc更新wordpress的功能,备忘一下。
4 |
from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm |
5 |
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost |
6 |
from wordpress_xmlrpc.methods.users import GetUserInfo |
7 |
from wordpress_xmlrpc.methods import taxonomies |
14 |
tag.taxonomy = 'category' #这里为category的话插入的是category,为post_tag的话插入的是tag |
15 |
tag.name = 'My New Tag' |
16 |
tag.id = wp.call(taxonomies.NewTerm(tag)) |
我用的是中文测试,执行python文件之后,没有任何提示,但是看wordpress博客,文章已经发布成功了,标题、内容、标签、文章分类一个也没有错。
而且它有一个功能,可以将文章的发布状态设置为“draft”,这正是我十分需要的一个功能。
真的非常方便与简单。
四、新建分类
1 |
from wordpress_xmlrpc import Client, WordPressPost |
2 |
from wordpress_xmlrpc import WordPressTerm |
3 |
from wordpress_xmlrpc.methods.posts import GetPosts,NewPost |
4 |
from wordpress_xmlrpc.methods import taxonomies |
10 |
cat.taxonomy = 'category' |
11 |
cat.name = 'cat1' #分类名称 |
12 |
# cat.slug = 'bieming2' #分类别名,可以忽略 |
13 |
cat.id = wp.call(taxonomies.NewTerm(cat))#新建分类返回的id |
14 |
print ( "发布成功!新建设的分类ID为{}" .format(cat.id)) |
新建子分类:
1 |
from wordpress_xmlrpc import Client, WordPressPost |
2 |
from wordpress_xmlrpc import WordPressTerm |
3 |
from wordpress_xmlrpc.methods import taxonomies |
8 |
parent_cat = wp.call(taxonomies.GetTerm( 'category' , 13))#20是父分类的id |
10 |
child_cat = WordPressTerm() |
11 |
child_cat.taxonomy = 'category' |
12 |
child_cat.parent = parent_cat.id |
13 |
child_cat.name = 'My Child Category' #分类名称 |
14 |
child_cat.id = wp.call(taxonomies.NewTerm(child_cat))#新建分类返回的id |
15 |
print ( "发布成功!新建设的子分类ID为{}" .format(child_cat.id)) |
其实第一行可以不用。
成果展示:
五、如何插入自定义字段的数据以及如何插入图片
请看这里
可以参考的网站:
http://xiaohost.com/1802.html
https://www.168seo.cn/jianzhan/wordpress/1970.html