Вопрос или проблема
У меня есть этот скрипт на Python для попытки загрузки изображения. Но сначала я добавил один “Пароль приложения” в своем профиле WordPress. У меня есть ключ, и имя пользователя — “admin”.
Тем не менее, скрипт выдает мне эту ошибку:
‘Ошибка загрузки изображения: 401 - {"code":"rest_cannot_create","message":"Извините, вам не разрешено создавать записи как этому пользователю.","data":{"status":401}}
Не удалось загрузить изображение.’
Что может быть не так или что я забыл настроить?
Вот скрипт:
import requests
from requests.auth import HTTPBasicAuth
import os
import base64
# Учётные данные WordPress API
WP_USER = 'admin' # Ваше имя пользователя WordPress
WP_APPLICATION_PASSWORD = 'xxx' # Ваш пароль приложения WordPress
WP_URL = "https://xxx.xxx.com" # URL Вашего сайта WordPress
def upload_image_to_wp(imgPath):
"""
Загрузить изображение на WordPress через REST API, используя аутентификацию паролем приложения.
:param imgPath: Локальный путь к изображению для загрузки.
:return: ID изображения и URL, если успешно, иначе None.
"""
url = f'{WP_URL}/wp-json/wp/v2/media'
# Создать заголовок авторизации вручную
auth = HTTPBasicAuth(WP_USER, WP_APPLICATION_PASSWORD)
auth_header = {
'Authorization': 'Basic ' + WP_USER + ':' + WP_APPLICATION_PASSWORD,
'Content-Type': 'image/jpeg' if imgPath.endswith('.jpg') or imgPath.endswith('.jpeg') else 'image/png',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/39.0.2171.95 Safari/537.36',
'Content-Disposition': f'attachment; filename={os.path.basename(imgPath)}',
'Cache-Control': 'no-cache',
}
with open(imgPath, 'rb') as file:
file_data = {
'file': (os.path.basename(imgPath), file, 'image/jpeg' if imgPath.endswith('.jpg') or imgPath.endswith('.jpeg') else 'image/png')
}
# Добавление заголовка Content-Disposition
headers = {
'Content-Disposition': 'attachment; filename="image.jpg"' # Измените имя файла при необходимости
}
try:
response = requests.post(url, files=file_data, headers={**auth_header, **headers})
if response.status_code == 201:
new_dict = response.json()
image_id = new_dict.get('id')
image_url = new_dict.get('guid', {}).get('rendered')
return image_id, image_url
else:
print(f"Ошибка загрузки изображения: {response.status_code} - {response.text}")
return None
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
return None
# Пример использования
image_path = r"C:/jpg.jpg" # Замените на фактический путь к изображению
upload_response = upload_image_to_wp(image_path)
if upload_response:
image_id, image_url = upload_response
print(f"Изображение успешно загружено! ID: {image_id}, URL: {image_url}")
else:
print("Не удалось загрузить изображение.")
Ответ или решение
При загрузке изображения в WordPress с использованием указанного Python-скрипта появляется ошибка "401 – Не удается создать ресурс". Это говорит о проблемах с авторизацией или правами доступа. Разберем возможные причины и пути их решения:
Понимание Ошибки 401
Ошибка 401, известная как "Unauthorized", возникает, когда сервер не может подтвердить подлинность предоставленных учетных данных. В данном случае проблема связана с использованием REST API WordPress, что требует корректной авторизации для выполнения операции.
Возможные Причины и Решения
-
Некорректные учетные данные:
- Проверьте имя пользователя и пароль приложения. Убедитесь, что вы используете правильный логин
admin
и пароль приложения, который сгенерирован специально для этой задачи.
- Проверьте имя пользователя и пароль приложения. Убедитесь, что вы используете правильный логин
-
Ошибки в заголовке авторизации:
- Формирование заголовка авторизации в коде выполнено некорректно. Вместо ручного формирования
Authorization
требуется использовать методHTTPBasicAuth
. - Исправьте код:
auth = HTTPBasicAuth(WP_USER, WP_APPLICATION_PASSWORD) response = requests.post(url, files=file_data, auth=auth, headers=additional_headers)
- Формирование заголовка авторизации в коде выполнено некорректно. Вместо ручного формирования
-
Проблема с правами пользователя:
- Убедитесь, что пользователь
admin
обладает необходимыми правами для загрузки медиафайлов. - Войдите в админ-панель WordPress и проверьте роль и привилегии пользователя.
- Убедитесь, что пользователь
-
Настройки REST API:
- Проверьте, что REST API разрешен в настройках вашего WordPress сайта.
- Если используется плагин безопасности, убедитесь, что он не блокирует REST API.
Доработка Кода
Ниже приведен исправленный фрагмент вашего скрипта, который учитывает вышеперечисленные моменты:
import requests
from requests.auth import HTTPBasicAuth
import os
# WordPress API credentials
WP_USER = 'admin'
WP_APPLICATION_PASSWORD = 'ваш_пароль_приложения'
WP_URL = "https://ваш_сайт.com"
def upload_image_to_wp(imgPath):
url = f'{WP_URL}/wp-json/wp/v2/media'
auth = HTTPBasicAuth(WP_USER, WP_APPLICATION_PASSWORD) # Используем стандартный метод авторизации
headers = {
'Content-Disposition': f'attachment; filename={os.path.basename(imgPath)}',
'Content-Type': 'image/jpeg' if imgPath.endswith('.jpg') or imgPath.endswith('.jpeg') else 'image/png'
}
with open(imgPath, 'rb') as file:
response = requests.post(url, headers=headers, files={'file': file}, auth=auth)
if response.status_code == 201:
new_dict = response.json()
image_id = new_dict.get('id')
image_url = new_dict.get('guid', {}).get('rendered')
return image_id, image_url
else:
print(f"Error uploading image: {response.status_code} - {response.json().get('message')}")
return None
image_path = r"C:/jpg.jpg"
upload_response = upload_image_to_wp(image_path)
if upload_response:
image_id, image_url = upload_response
print(f"Image uploaded successfully! ID: {image_id}, URL: {image_url}")
else:
print("Image upload failed.")
Заключение
Проблема с ошибкой 401 часто связана с авторизацией и неправильными учетными данными. Проверка и корректировка этих параметров, а также корректное использование методов библиотеки requests
помогут успешно загрузить изображение через WordPress REST API. Убедитесь, что все изменения учтены, и повторите попытку загрузки.