为了验证 WordPress 实例的安装,我们正在编写 Python 单元测试。其中一项测试应执行以下操作:将图像上传到 WordPress。
为了做到这一点,我正在使用 Requests 库。
当我通过 Firebug 检查 /wp-admin/media-new.php 页面中的表单时(表单信息,我得到以下信息): 形式 ID:文件格式 姓名 方式:邮寄 操作:http://localhost:8000/wp-admin/media-new.php
元素 id: plupload-浏览按钮 类型:按钮 值:选择文件
id:异步上传 名称:异步上传 类型:文件 标签: 上传
id:html-上传 名称:html上传 类型: 提交 值:上传
id:post_id 名称:帖子 ID 类型:隐藏 值:0
id:_wpnonce 名称:_wpnonce 类型:隐藏 值:c0fc3b80bb
id:文件格式 名称:_wp_http_referer 类型:隐藏 值:/wp-admin/media-new.php
我相信 _wpnonce 是为每个会话生成的唯一值。因此,在尝试上传文件之前,我会获取 media-new.php 页面并获取表单中的 _wpnonce(因此是我的代码中的变量)。
我的代码如下:
with open('1.jpg', 'rb') as f:
upload_data = {'post_id': '0',
'_wp_http_referer': '/wp-admin/media-new.php',
'_wpnonce': wp_nonce,
'action': 'upload_attachement',
'name': '1.jpg',
'async-upload': f,
'html-upload': 'Upload'}
upload_result = session.post('http://localhost:8000/wp-admin/media-new.php', upload_data)
代码运行良好,upload_result.status_code 等于 200。
但是,该图像从未出现在 WordPress 的媒体库中。
我相信这是一个简单的错误,但我不知道我错过了什么。
提前感谢您的帮助。
如果您想发布文件,您应该使用
files
参数。另外 '_wpnonce'
值不足以获得身份验证,您需要有 cookie。
url = 'http://localhost:8000/wp-admin/media-new.php'
data = {
'post_id': '0',
'_wp_http_referer': '/wp-admin/media-new.php',
'_wpnonce': wp_nonce,
'action': 'upload_attachement',
'html-upload': 'Upload'
}
files = {'async-upload':('1.jpg', open('1.jpg', 'rb'))}
headers = {'Cookie': my_cookies}
upload_result = session.post(url, data=data, files=files, headers=headers)
我假设您已从浏览器获取有效的 cookie。如果您想通过
requests
进行身份验证,请查看我对这篇文章的回答:login-wordpress-with-requests
您可以直接使用 WordPress REST API,而不是模仿客户端中发生的情况:
在这里您可以看到如何实现文件上传:https://gist.github.com/florian-glombik/c2e71fa2128fa1a69bb39aa61fadf3bd