首页 > 编程问答 >为什么用于 POST REQUEST 的标头不起作用,但使用 Auth 却可以工作? (WordPress)

为什么用于 POST REQUEST 的标头不起作用,但使用 Auth 却可以工作? (WordPress)

时间:2024-07-24 04:31:03浏览次数:12  
标签:python wordpress api

我正在尝试将数据库(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) 有效,而使用自定义标头无效的原因:

  1. WordPress REST API 身份验证: WordPress REST API 主要依赖于身份验证方案,如 Cookie 身份验证 用于常规登录和 OAuth 1.0a 用于第三方应用。当你使用 auth=(username, password) 时, requests 库会自动处理发送凭据并获取 WordPress Cookie 的过程。后续请求使用此 Cookie 进行身份验证。

  2. 基本身份验证和安全风险: 直接在标头中发送用户名和密码(基本身份验证)存在安全风险,尤其是在没有 HTTPS 保护的情况下。WordPress REST API 默认禁用此功能以防止潜在的漏洞。

你需要使用应用程序密码的原因:

为了安全地访问 WordPress REST API,你需要使用 应用程序密码 。应用程序密码本质上是为你的第三方应用生成的唯一密码。此方法使用 OAuth 1.0a 协议,该协议比基本身份验证更安全。

如何解决问题:

  1. 继续使用 auth=(username, password) 如果你不想处理应用程序密码,并且你的 Python 脚本和 WordPress 网站在同一服务器上运行,则可以继续使用 auth=(username, password) 方法。它依赖于 Cookie 身份验证,只要你的脚本可以访问 WordPress 会话 Cookie,它就会起作用。

  2. 使用应用程序密码和 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

相关文章

  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......
  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......
  • 仅需增加2行代码,Python量化策略速度提升20+倍!
    今天分享一个Python量化策略加速的小技巧,不用修改原有代码,只需在原有代码里新增2行,策略执行速度便可能提高20+倍,正文开始~现如今,无论是入门量化投资,还是做数据分析、机器学习和深度学习,Python成为了首选编程语言,直观的原因就是容易上手和资源丰富,但Python有个根深蒂固的标签,......