Ошибка WordPress при загрузке изображения: скрипт API 401 Python

Вопрос или проблема

У меня есть этот скрипт на 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, что требует корректной авторизации для выполнения операции.

Возможные Причины и Решения

  1. Некорректные учетные данные:

    • Проверьте имя пользователя и пароль приложения. Убедитесь, что вы используете правильный логин admin и пароль приложения, который сгенерирован специально для этой задачи.
  2. Ошибки в заголовке авторизации:

    • Формирование заголовка авторизации в коде выполнено некорректно. Вместо ручного формирования Authorization требуется использовать метод HTTPBasicAuth.
    • Исправьте код:
      auth = HTTPBasicAuth(WP_USER, WP_APPLICATION_PASSWORD)
      response = requests.post(url, files=file_data, auth=auth, headers=additional_headers)
  3. Проблема с правами пользователя:

    • Убедитесь, что пользователь admin обладает необходимыми правами для загрузки медиафайлов.
    • Войдите в админ-панель WordPress и проверьте роль и привилегии пользователя.
  4. Настройки 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. Убедитесь, что все изменения учтены, и повторите попытку загрузки.

Оцените материал
Добавить комментарий

Капча загружается...