我正在尝试将数据库(SQLite)作为 JSON 文件发送并将其发布在 Wordpress 中(我还想编辑行和列等),但是当我这样做时,在 python 中使用请求库做一个简单的帖子会抛出这个问题当我使用这行代码时出错:
header = {"user": username, "password": password}
response = requests.post(url, headers=header, json=data)
{"code":"rest_cannot_edit","message":"Lo siento, no tienes permisos para editar esta entrada.","data":{"status":401} }
但是,当我在这个 requests.post 函数中使用 auth 时,它可以工作,它仅使用以下命令发送信息:
response = requests.post(url, auth=(username, password), json=data)
而且我的 response.status 是 200(发布正确完成!)
根据所有我发现的论坛,我需要插件应用程序密码,是的,我已经创建了我的令牌密码并且就像上面一样工作,为什么?
所有代码:
import requests
#PAGE WHERE I WANT TO SEND INFO
url = "https://dca-mx.com/wp-json/wp/v2/pages/362"
username = 'Fabian'
# The application password you generated
password = 'XXXX XXXX XXXX XXXX XXXX'
# The post data
data = {
'title': 'DCA DB',
'content': 'HELLO FROM PYTHON.',
'status': 'publish'
}
header = {"user": username, "password": password}
# Send the HTTP request THIS WORKS
response = requests.post(url, auth=(username, password), json=data)
#THIS DOES NOT WORKS WHY??????!!!!!!!!!!!
response = requests.post(url, headers=header, json=data)
# Check the response
if response.status_code == 201:
print('Post created successfully')
elif response.status_code == 200:
print('Posteado Correctamente!')
else:
print(response.text)
你遇到的问题与 WordPress REST API 处理身份验证的方式有关。虽然你可以在自定义应用中使用用户名和密码作为标头进行基本身份验证,但 WordPress REST API 默认不接受这种方式出于安全考虑。
以下是使用
auth=(username, password)
有效,而使用自定义标头无效的原因:
-
WordPress REST API 身份验证: WordPress REST API 主要依赖于身份验证方案,如 Cookie 身份验证 用于常规登录和 OAuth 1.0a 用于第三方应用。当你使用
auth=(username, password)
时,requests
库会自动处理发送凭据并获取 WordPress Cookie 的过程。后续请求使用此 Cookie 进行身份验证。 -
基本身份验证和安全风险: 直接在标头中发送用户名和密码(基本身份验证)存在安全风险,尤其是在没有 HTTPS 保护的情况下。WordPress REST API 默认禁用此功能以防止潜在的漏洞。
你需要使用应用程序密码的原因:
为了安全地访问 WordPress REST API,你需要使用 应用程序密码 。应用程序密码本质上是为你的第三方应用生成的唯一密码。此方法使用 OAuth 1.0a 协议,该协议比基本身份验证更安全。
如何解决问题:
-
继续使用
auth=(username, password)
: 如果你不想处理应用程序密码,并且你的 Python 脚本和 WordPress 网站在同一服务器上运行,则可以继续使用auth=(username, password)
方法。它依赖于 Cookie 身份验证,只要你的脚本可以访问 WordPress 会话 Cookie,它就会起作用。 -
使用应用程序密码和 OAuth 1.0a: 这是更安全、更推荐的方法,尤其是在处理外部应用程序时。你需要安装 "应用程序密码" 插件(如果尚未安装)。然后,你可以为你的用户生成一个应用程序密码,并在你的 Python 脚本中使用它以及 OAuth 1.0a 库(如
requests_oauthlib
)对你的请求进行签名。
以下是如何使用
requests_oauthlib
和应用程序密码访问 WordPress REST API 的示例:
import requests
from requests_oauthlib import OAuth1
# WordPress REST API endpoint
url = "https://dca-mx.com/wp-json/wp/v2/pages/362"
# Your WordPress username and application password
username = 'Fabian'
app_password = 'XXXX XXXX XXXX XXXX XXXX' # Replace with your application password
# WordPress website URL
wp_url = "https://dca-mx.com"
# OAuth 1.0a authentication
auth = OAuth1(
'oauth1', # Hardcoded for WordPress
client_key='your_consumer_key', # Not used by WordPress, set any value
client_secret='your_consumer_secret', # Not used by WordPress, set any value
resource_owner_key=username,
resource_owner_secret=app_password,
)
# Data to be sent
data = {
'title': 'DCA DB',
'content': 'HELLO FROM PYTHON.',
'status': 'publish'
}
# Send the request
response = requests.post(url, auth=auth, json=data)
# Check the response
if response.status_code == 201:
print('Post created successfully')
elif response.status_code == 200:
print('Post updated successfully')
else:
print(f'Error: {response.status_code}')
print(response.text)
请记住将示例中的占位符替换为你的实际凭据和网站 URL。
标签:python,wordpress,api From: 78785452