Как использовать Python для создания записи в WordPress?

10 февр. 2019 г., 09:02:02
Просмотры: 16.4K
Голосов: 0

Я нашел справочник API здесь: https://v2.wp-api.org/reference/posts/

На основе приведенного справочника API я написал этот код на Python:

from urllib.request import Request, urlopen
from datetime import datetime

import json

def create(wordpressUrl, content):
    # Параметры для создания записи
    params = {
        'date_gmt': datetime.now().replace(microsecond=0).isoformat() + "Z",
        'status': 'publish',  # Статус "опубликовано"
        'title': 'The Title',  # Заголовок записи
        'author': 'The Author',  # Автор записи
        'content': content  # Содержание записи
    }
    # Преобразуем параметры в JSON
    postparam = json.dumps(params).encode('utf-8')
    # Создаем POST-запрос
    req = Request(wordpressUrl + "/wp-json/wp/v2/posts", method='POST', data=postparam)
    # Добавляем заголовок
    req.add_header('Content-Type', 'application/json')
    r = urlopen(req)

    # Проверяем код ответа
    if(r.getcode() != 200):
        raise Exception("Ошибка при создании записи, код ответа=" + str(r.getcode()))

    return json.loads(r.read())

Почему при вызове этого кода API WordPress возвращает страницу "О сайте" вместо создания новой записи? Как еще можно создать запись в WordPress, используя Python для вызова API WordPress?

0
Все ответы на вопрос 2
0

как сказал @prathamesh patil, вы пропустили authentication = your jwt token

как сгенерировать jwt token ?

  • простой способ = основная логика
    • установите и активируйте плагин WordPress: JWT Authentication for WP REST API
    • включите HTTP:Authorization на сервере WordPress
      • цель: разрешить вызов API /wp-json/jwt-auth/v1
    • добавьте JWT_AUTH_SECRET_KEY в wp-config.php
    • вызовите POST https://www.yourWebsite.com/wp-json/jwt-auth/v1/token с username и password WordPress, в ответе будет ваш ожидаемый jwt token
      • выглядит так: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3LmNyaWZhbi5jb20iLCJpYXQiOjE1ODQxMDk4OTAsIm5iZiI6MTU4NDEwOTg5MCwiZXhwIjoxNTg0NzE0NjkwLCJkYXRhIjp7InVzZXIiOnsiaWQiOiIxIn19fQ.YvFzitTfIZaCwtkxKTIjP715795OMAVQowgnD8G3wk0
  • подробности

Python код для вызова REST API WordPress для создания записей

код:

    def createPost(self,
            title,
            content,
            dateStr,
            slug,
            categoryNameList=[],
            tagNameList=[],
            status="draft",
            postFormat="standard"
        ):
        """Создать стандартную запись WordPress
            через вызов REST API: POST /wp-json/wp/v2/posts

        Аргументы:
            title (str): заголовок записи
            content (str): содержимое записи в HTML
            dateStr (str): строка с датой
            slug (str): URL-адрес записи
            categoryNameList (list): список категорий
            tagNameList (list): список тегов
            status (str): статус, по умолчанию 'draft'
            postFormat (str): формат записи, по умолчанию 'standard'
        Возвращает:
            (bool, dict)
                True, информация о загруженной записи
                False, детали ошибки
        Вызывает:
        """
        curHeaders = {
            "Authorization": self.authorization,
            "Content-Type": "application/json",
            "Accept": "application/json",
        }
        logging.debug("curHeaders=%s", curHeaders)

        categoryIdList = []
        tagIdList = []

        if categoryNameList:
            # ['Mac']
            categoryIdList = self.getTaxonomyIdList(categoryNameList, taxonomy="category")
            # category nameList=['Mac'] -> taxonomyIdList=[1374]

        if tagNameList:
            # ['切换', 'GPU', 'pmset', '显卡模式']
            tagIdList = self.getTaxonomyIdList(tagNameList, taxonomy="post_tag")
            # post_tag nameList=['切换', 'GPU', 'pmset', '显卡模式'] -> taxonomyIdList=[1367, 13224, 13225, 13226]

        postDict = {
            "title": title, # '【记录】Mac中用pmset设置GPU显卡切换模式'
            "content": content, # '<html>\n <div>\n  折腾:\n </div>\n <div>\n  【已解决】Mac Pro 2018款发热量大很烫非常烫\n </div>\n <div>\n  期间,...performance graphic cards\n    </li>\n   </ul>\n  </ul>\n </ul>\n <div>\n  <br/>\n </div>\n</html>'
            # "date_gmt": dateStr,
            "date": dateStr, # '2020-08-17T10:16:34'
            "slug": slug, # 'on_mac_pmset_is_used_set_gpu_graphics_card_switching_mode'
            "status": status, # 'draft'
            "format": postFormat, # 'standard'
            "categories": categoryIdList, # [1374]
            "tags": tagIdList, # [1367, 13224, 13225, 13226]
            # TODO: featured_media, excerpt
        }
        logging.debug("postDict=%s", postDict)
        # postDict={'title': '【记录】Mac中用pmset设置GPU显卡切换模式', 'content': '<html>\n <div>\n  折腾:\n </div>\n <div>\。。。。<br/>\n </div>\n</html>', 'date': '2020-08-17T10:16:34', 'slug': 'on_mac_pmset_is_used_set_gpu_graphics_card_switching_mode', 'status': 'draft', 'format': 'standard', 'categories': [1374], 'tags': [1367, 13224, 13225, 13226]}
        createPostUrl = self.apiPosts
        resp = requests.post(
            createPostUrl,
            proxies=self.requestsProxies,
            headers=curHeaders,
            # data=json.dumps(postDict),
            json=postDict, # внутренне автоматически делает json.dumps
        )
        logging.info("createPostUrl=%s -> resp=%s", createPostUrl, resp)

        isUploadOk, respInfo = crifanWordpress.processCommonResponse(resp)
        return isUploadOk, respInfo
  • полный и актуальный код смотрите:
3 янв. 2021 г. 10:34:18
0

Думаю, вы упускаете часть, связанную с аутентификацией, проверьте это https://stackoverflow.com/questions/41532738/publish-wordpress-post-with-python-requests-and-rest-api

10 февр. 2019 г. 13:15:06