메뉴 닫기

워드프레스 자동 등록 : 파이썬, ChatGPT API, 워드프레스 Rest API 태그 활용 #4

워드프레스 자동등록 - 파이썬, ChatGPT API, 워드프레스 Rest API #4

머리말

지난 포스팅에서는 ChatGPT 를 이용하여 워드프레스 자동 등록 하는 기능을 구현 하였다. 하지만 그 과정에서 한가지 기능이 누락 된 기능이 있다.

그것은 바로 태그 기능이다. 이 기능을 별도의 포스팅으로 빼낸 것은 이전 편에서 포스팅 할때 데이턴 입력 하는 것 처럼 간단하게 해결이 되는 것이 아니라 조금 심도 있게 고민하고 기능을 만들어야 하기 때문이다.

이를 다루기 위해서는 아무래도 설명이 길어지다 보니 이렇게 별도로 다루게 되었다.

https://github.com/mymizze/Class.wp.auto-post.git

참고용 강의 자료 소스

Summary

  • 사용자 정의 변수 외부 파일로 이동
  • 워드프레스 태그 등록 기능 구현
  • ChatGPT 로 부터 태그 추천 받기

사용자 정의 변수 외부 파일로 이동

곰곰히 생각을 하다보니 매번 사용자가 값을 변경해야 하는 주제 라던가 카테고리등의 값을 코드 내부로 들어와서 수정하는 것은 별로 좋은 그림은 아니라는 느낌이 들어서 설정 파일을 별도 파일로 분리 하고 처리 페이지는 손을 대지 않도록 하는 것이 좋아 보여서 태그 작업에 앞서서 간단하게 진행 하려고 한다.

파일명: config.py 신규 생성

#==========================================
#           검색어 지정
#==========================================
# 글의 주제, 카테고리
topic = "전라남도 갈만한 곳 나만의 숨겨진 추천 여행지"
category = "여행"

# 태그 생성 갯수
numTags = 5

# 포스팅 공개여부 (draft: 임시 저장, publish: 즉시 발행)
status = "draft"

#==========================================
#           WordPress 접속 정보
#==========================================
url = "ecat.kr"
id = "워드프레스 아이디"
pw = "워드프레스 비밀번호"

#==========================================
#         ChatGPT API 접속 정보
#==========================================
openai_organization = "나의 ChatGPT 조직 ID: org-euZ0s47nUy...."
openai_apiKey = "나의 ChatGPT API Key: sk-1tfTO3fW..."

앞으로는 이 설정 파일을 열어서 주제 라던가 카테고리 등등… 설정이 필요한 부분들은 이 설정 파일에서만 수정 해주면 된다. 처리 페이지 소스를 실수로라도 건들일 없어 보이고 시인성 역시 더욱 좋아서 훨씬 정돈되고 깔끔해졌다는 느낌이 든다.😊😊

파일명: post.requests.py 자동 포스팅 처리 페이지 변수 수정

config.py 를 처리 페이지에서 사용하기 위해 문서 상단에 import 구문을 추가 해준다.

import config

사용법은 간단하다. config.변수명 형태로 사용하면 된다.
예를들면 주제, 카테고리 값을 가져다 쓰겠다 하면, 다음과 같이 사용하면 된다.

config.topic
config.category

이것을 기반으로 지난 포스팅에서 마무리 되었던 소스에서 사용자 정의 변수로 모두 수정 해주자.



태그 기능 살펴보기

워드프레스 Rest API: Posts 편 글 생성 인자 값 공식문서 를 보면 tags 라는 인자 값이 있다.

“post_tag 분류체계에서 글에 할당된 용어입니다.” 라고 설명을 하고 있는데… 대체 뭔 소리냐… 너무 알쏭달쏭한 설명이다… (설명이 너무 불친절 한거 아니냐?? 😤😤)

느낌상 “tags” s 가 붙었으니 복수형 이라는 건데 기존에 워드프레스에서 글 작성할 때 태그 부분을 보면,

쉼표로 구분하여 다중 등록이 했던 것이 기억이 났다.

‘오오… 뭔가 풀릴 것 같은 미스테리… 근데 이걸 왜 공식 문서를 보면서 추리하고 있어야 하냐…😭😭’

일단 느낌상 인자 값으로 “태그1,태그2,태그3” 이런 방식으로 전달 해주면 될 것 같은 예감이 든다.

일단은 불필요하게 ChatGPT 를 돌릴 필요는 없으니 모두 주석처리 한 후 테스트용 글 등록을 해보자.

"""
    메인 프로세스
"""
if __name__ == "__main__":
    # # ChatGPT 새 글 생성
    # response = generateChatGPT(config.topic, config.category, config.numTags)

    # # 워드프레스 포스팅
    # postInfo = {
    #     'title' : response['title'],
    #     'contents' : response['contents'],
    #     'category' : response['category'],
    #     'tags' : response['tag'],
    #     'status' : 'draft'
    # }

    # 태그 테스트를 위한 포스팅
    postInfo = {
        'title': '글 제목 테스트..',
        'slug': '글 제목 테스트..'.replace(' ', '-'),
        'content': '글 작성 테스트..',
        'meta': {
            'category': '여행'
        },
        'tags': '태그1,태그2,태그3',
        'status': 'draft'
    }
    createPost(postInfo)

테스트 글 등록 결과 새로운 글이 등록은 되었지만 태그가 적용 되지 않았다.

후우… 실제 글 등록 화면과 동일하게 “태그1,태그2,태그3” 라고 입력하면 알아서 등록이 되었으면 좋으련만 호락호락하게 놔두질 않는다.

그래서 구글링도 하고 스택 오버도 찾아보았지만 태그 등록 기능에 대해서 질문 글은 많았지만 대답에 대해서는 쉽사리 찾아지지 않았다. 왜지… 느낌이 쎄..하다…😨😨

그렇다면 일단 tags 에 대해서 공식 문서를 조금 더 살펴보자.

Posts | REST API 스키마를 조금 들여다 보니 tags 가 보이는데 어떤 형태로 주고 있는지가 궁금 해졌다.

https://ecat.kr/wp-json/wp/v2/posts

이 주소를 브라우저로 실행 해보자.

어? 이 주소는 분명 포스팅 된 글의 정보를 주는 url 인데 여기서 tags 정보를 array 형식으로 주는데 문제는 문자가 아닌 id 값으로 보이는 값으로 주고 있다는 것이다.

이걸 보고 갑자기 이런 생각이 들었다. 이 태그 정보들은 분명 DB 상으로 유추 해보면 포스팅 된 글과 다른 태그 테이블에 다중 등록이 되어 있을 것이다.

그럼 태그 테이블에 등록 된 태그들 중 어떤 태그들이 이 글과 연결이 되어 있는지 어딘가 접점이 있을 것이다.

즉, 포스팅 데이터 컬럼중 하나에 태그 id 값들을 집어 넣어놨던지 아니면 또 다른 테이블에 포스팅 id 값, 태그 id 등이 등록 되어 있다던가 등등… 뭔가 포스팅 – 태그 간의 접점이 있을 것인데 이걸 찾아야 한다.

구조를 이해하기 위해 DB 를 잠시 열어 보자.

DB 테이블을 살펴본 결과 wp_post (글 데이터), wp_terms (태그 데이터) 에서 각각 생성된 ID 값들을 wp_term_relationships 테이블에서 연결 시켜주고 있는 것을 확인 했다.

흠.. 이걸 유추 해보면 글과 태그간의 연결이 되기 위해선 필수적으로 글 ID, 태그 ID 가 필요 하다는 건데… 글 ID 를 알기 위해서는 글이 일단 DB상 등록이 되어야 ID 값을 가져 올 수 있다는 이야기가 된다.

이 말인 즉, 우리는 위에서 Rest API 를 이용하여 글을 신규 등록 할때 태그 정보를 넣으려고 시도 했지만 이 플로우를 곰곰히 생각해보면,

  • 신규 글 등록완료 -> 신규 글 ID 값 가져오기
  • 사용자 요청 태그 DB 검색 -> 없을 경우 태그 등록 후 태그 ID 값 가져오기 / 이미 존재할 경우 ID 정보 가져오기
  • 신규 글 ID 기준으로 글 정보 업데이트 -> 태그 ID 값들 정보 입력

이런 형태의 프로세스가 필요하게 된다는 것을 뜻한다.

신규 글 등록시에 문자로 태그 정보를 던지면 알아서 등록 해주고 글 신규 생성시 태그 정보를 처리 하도록 워드프레스 측에서 기능을 얼마든지 만들어 줄수 있었을 것 같은데…

후우 결론은 태그 기능 만들어 놨으니 너희가 알아서 잘 응용해서 만들어 쓰렴~ 이라는 것이다. 😡😡

이러니 태그 기능 구현에 대해서 글을 올린 사람들이 없지… 이 귀찮은 작업을 후우… 그래 까짓꺼 칼 뽑은 김에 가보자.

⚠ 시간 절약을 위해 미리 여러 테스트를 해본 결과 포스팅 정보 업데이트시 태그 값은 배열 이라던가 같은 형식으로 등록 되는 것이 아니라 쉼표(,) 를 구분자로 하여 id 값을 문자열 형태로 던져 주면 알아서 등록이 되는 것을 확인 했다.
(ex. "14,15,16,17")

태그 기능 구현

우선 사용자 지정 태그 값을 위와 같이 리스트 형태 수정 해주자.

리스트 형태로 입력 한 이유는 태그 기능을 완료 한 이후에는 이 태그를 ChatGPT 에게 추천 받아서 생성하는 형태로 진행이 될 예정인데 이때 이 리스트 형태로 만들어지기 때문이다.

# 워드프레스 포스팅 생성 요청 보내기
response = requests.post(postURL, json=postData, headers=headers)

# 응답 결과 확인
if response.status_code == 201:
    # 워드프레스 포스팅 ID
    postedID = response.json().get('id')

생성 요청 된 신규 글이 정상 처리 되었는지 status_code 조건이 들어 갔다. 글이 정상적으로 생성되지 않았다면 태그 프로세스를 진행 할 이유가 없기 때문이다.

7 라인에서 우리의 첫번째 목표인 신규 글의 ID 값을 손쉽게 얻어 왔다.

다음으로 얻을 값은 각 태그의 ID 값들인데,

  • 이미 존재 하는 태그 -> 기존 ID 값을 가져오기
  • 미등록 신규 태그 -> 태그 등록 후 생성 된 태그 ID 값 가져오기

이와 같이 분류를 해서 각각의 태그 ID를 가져 오자.

# 태그 설정
arrTags = list()
for item in postInfo.get('tags'):
    # 태그 신규 생성 및 태그 Relationships 테이블에 등록할 id 값 구하기
    url = f"https://{config.url}/wp-json/wp/v2/tags"
    params = {
        'search': item
    }
    res = requests.get(url, params=params).json()

    if len(res) < 1:
        # 태그 신규 등록 후 id 값 수집
        tagData = {
            'name': item
        }
        tagsURL = 'https://'+config.url+'/wp-json/wp/v2/tags'
        resTag = requests.post(tagsURL, json=tagData, headers=headers).json()
        arrTags.append(resTag.get('id'))
    else:
        # 이미 등록 된 태그 id 값 수집
        arrTags.append(res[0].get('id'))

요청 태그 만큼 반복문을 돌려서 각각 체크를 하고 있으며, 4~9 라인에서 기존에 존재하는 태그인지 체크를 하고 있으며 11 라인에서 보면,

if len(res) < 1:

기존에 존재하는 태그 수가 1 보다 작다는 뜻은 미등록 태그라는 것을 의미하며 신규 등록 해야 할 대상이라는 것이다. 12~17 라인이 태그를 신규 등록한 후 태그 ID 값을 가져오는 코드이며, 18 라인을 보면 2라인에서 미리 준비 해둔 리스트형 변수 arrTags 에 태그 ID 값을 담고 있다.

21 라인은 이미 등록 된 태그라는 뜻이므로 바로 태그 ID 값을 리스트 변수 arrTags 에 담아 준다.

우선 현재까지의 코드를 확인 삼아 arrTags 값이 잘 나오는지 돌려 보면

arrTags = [99, 100, 101] 과 같이 값을 잘 가져오고 있으며, 실제로 DB를 확인 해보면 Tags 테이블인 wp_terms 에 “태그1, 태그2, 태그3” 이 잘 등록 된 것을 확인 할 수 있다.

그럼 이제 우리가 할 일은 딱 한가지다. 신규 등록 된 글 정보를 업데이트 하는데 이 태그 ID 값들을 넣어 주는 것이다.

위에서 시간 관계상 미리 진행해보고 전달 한 것 처럼 포스팅 업데이트시 태그 정보는 쉼표로 구분해서 넣어주면 된다.

그런데 태그 ID 값들이 담겨져 있는 arrTags 는 데이터 타입이 리스트 형태이다.

arrTags = [99, 100, 101] 이런 형태인데, 우리가 필요한 것은 쉼표로 구분된 문자열 arrTags = “99,100,101” 이런 형태로 수정을 해줘야 한다.

strTags = ','.join(map(str, arrTags))

map 을 이용하여 각각을 쉼표(,) 문자와 함께 재맵핑을 해주자.

우리가 원하는 형태로 잘 수정이 되었다. 이젠 이 값을 글 업데이트시 넣어주자.

updatePostData = {
    'tags': strTags
}
postURL = f"https://{config.url}/wp-json/wp/v2/posts/{postedID}"
response = requests.post(postURL, json=updatePostData, headers=headers).json()

포스팅 업데이트는 비교적 쉽다. 포스팅 신규 등록과 동일한데 endpoint URL 끝에 포스팅 ID 값만 넣어주면 된다. 그럼 현재까지 작성 된 소스를 실행 해보자.

import config
import requests, openai
from bs4 import BeautifulSoup
from time import sleep

# ChatGPT 컨텐츠 생성 함수
def generateChatGPT(topic, category, numTags, model='text-davinci-003', maxTokens=3900):
    # ChatGPT API 인증
    openai.organization = config.openai_organization
    openai.api_key = config.openai_apiKey

    # 타이틀 생성
    prompt = f"""
        As a very proficient SEO writer, I am writing a blog about {category}.
        Here are 1 potential blog subjects that would fit well with the topic name "{topic}",
        recommend a sentimental title.
    """
    res = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
    title = res["choices"][0]["text"]
    title = title.replace('\n','').replace('\"','').replace('-','').strip()
    print('타이틀 생성 완료')

    # 본문 응답 프롬프트
    try:
        prompt = f"""
            As a very proficient SEO writer, I am writing a blog about {category}.

            Create a blog for "{topic}". Its category is {category}.

            Write a 2000 word blog article except H1 tag in body tag of html format.
            Contains subtitles and detailed descriptions.
        """
        body = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
        body = body["choices"][0]["text"]

        # 특정 html H1 태그 행 삭제
        soup = BeautifulSoup(body, 'html.parser')
        for row in soup.select('h1'):
            row.decompose()
        body = str(soup)

        # 불필요 글자 제거
        body = body.replace('#', '')

        # 본문 목차 포함하여 문자열 조합 완성
        contents = f"<!-- wp:luckywp/tableofcontents /-->\n{body}"

        print('본문 생성 완료')
    except Exception as e:
        print(e)
        return ""

    # 반환 값 설정
    response =  {
        'title': title,
        'tag' : '',
        'category' : category,
        'contents' : contents
    }

    print('ChatGPT 프로세스 완료')

    return response



# 워드프레스 자동 포스팅 함수
def createPost(postInfo):
    try:
        print('워드프레스 포스팅 중...')

        # 워드프레스 JWT 인증 토큰 얻기
        url = f"https://{config.url}/wp-json/jwt-auth/v1/token"
        data = {
            'username': config.id,
            'password':config.pw
        }
        res = requests.post(url, data=data).json()
        token = res.get('token')

        # 헤더에 JWT 인증 토큰 데이터 추가
        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Authorization': f'Bearer {token}'
        }

        # 워드프레스 포스팅 데이터 설정
        postURL = f"https://{config.url}/wp-json/wp/v2/posts"
        postData = {
            'title': postInfo.get('title'),
            'slug': postInfo.get('title').replace(' ', '-'),
            'content': postInfo.get('contents'),
            'meta': {
                'category': postInfo.get('category')
            },
            'status': postInfo.get('status')
        }

        # 워드프레스 포스팅 생성 요청 보내기
        response = requests.post(postURL, json=postData, headers=headers)

        # 응답 결과 확인
        if response.status_code == 201:
            # 워드프레스 포스팅 ID
            postedID = response.json().get('id')

            # 태그 설정
            arrTags = list()
            for item in postInfo.get('tags'):
                # 태그 신규 생성 및 태그 Relationships 테이블에 등록할 id 값 구하기
                url = f"https://{config.url}/wp-json/wp/v2/tags"
                params = {
                    'search': item
                }
                res = requests.get(url, params=params).json()

                if len(res) < 1:
                    # 태그 신규 등록 후 id 값 수집
                    tagData = {
                        'name': item
                    }
                    tagsURL = 'https://'+config.url+'/wp-json/wp/v2/tags'
                    resTag = requests.post(tagsURL, json=tagData, headers=headers).json()
                    arrTags.append(resTag.get('id'))
                else:
                    # 이미 등록 된 태그 id 값 수집
                    arrTags.append(res[0].get('id'))

            # 태그를 쉼표 구분자로 이용해 한 문장으로 변경 (ex. 태그1,태그2,태그3)
            strTags = ','.join(map(str, arrTags))

            # 워드프레스 신규 포스팅에 태그 값 업데이트
            updatePostData = {
                'tags': strTags
            }
            postURL = f"https://{config.url}/wp-json/wp/v2/posts/{postedID}"
            response = requests.post(postURL, json=updatePostData, headers=headers).json()

        print('워드프레스 포스팅 완료')

    except Exception as e:
        print(e)
        return ""


"""
    메인 프로세스
"""
if __name__ == "__main__":
    # # ChatGPT 새 글 생성
    # response = generateChatGPT(config.topic, config.category, config.numTags)

    # # 워드프레스 포스팅
    # postInfo = {
    #     'title' : response['title'],
    #     'contents' : response['contents'],
    #     'category' : response['category'],
    #     'tags' : response['tag'],
    #     'status' : 'draft'
    # }

    # 태그 테스트를 위한 포스팅
    postInfo = {
        'title': '글 제목 테스트..',
        'slug': '글 제목 테스트..'.replace(' ', '-'),
        'content': '글 작성 테스트..',
        'meta': {
            'category': '여행'
        },
        'tags': ['태그1','태그2','태그3'],
        'status': 'draft'
    }
    createPost(postInfo)

이젠 새로운 글이 생성 되면서 태그도 정상적으로 등록이 되는 것을 확인 할 수 있다.

이제 큰 산은 넘었다. 태그 기능이 완료 되었다면 이제 남은 건? ChatGPT 로 태그를 추천 받아서 방금 만든 기능에 값을 전달만 해주면 끝이다.

ChatGPT 추천 태그 포스팅에 태그 추가

ChatGPT 프로세스를 동작해야 하기 때문에 위에서 주석처리 했던 메인 프로세스 영역 코드들을 원상 복구 하자.


# ChatGPT 컨텐츠 생성 함수
def generateChatGPT(topic, category, numTags, model='text-davinci-003', maxTokens=3900):
    # ChatGPT API 인증
    openai.organization = config.openai_organization
    openai.api_key = config.openai_apiKey

    # 타이틀 생성
    prompt = f"""
        As a very proficient SEO writer, I am writing a blog about {category}.
        Here are 1 potential blog subjects that would fit well with the topic name "{topic}",
        recommend a sentimental title.
    """
    res = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
    title = res["choices"][0]["text"]
    title = title.replace('\n','').replace('\"','').replace('-','').strip()
    print('타이틀 생성 완료')

    # 태그 조합
    prompt = f"""
        Generate {str(numTags)} hashtags fit to this blog title, {title} using Korean.
        Don't use "#" in front of each tag, connect each hashtag with comma.
    """
    res = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
    tag = res["choices"][0]["text"]

    print(title)
    print(tag)
    exit()

ChatGPT 프로세스인 generateChatGPT() 함수 상단에서 ChatGPT 가 생성해준 글 제목을 기준으로 추천 태그를 생성 해달라고 해보자.

Generate {str(numTags)} hashtags fit to this blog title, {title} using Korean.
Don't use "#" in front of each tag, connect each hashtag with comma.

위 구문은 프롬프트를 발췌 한 것이고 numTags 는 config.py 에서 설정한 변수 이며 그대로 따라 했다면 아마 config 에는 numTags = 5 으로 설정이 되어 있을 것이다. 태그를 5개 생성 할 것이라는 뜻이다.

프롬프트 내용은 ChatGPT 로 생성 된 제목(타이틀)에 딱 맞는 해시 태그를 한국어로 생성 해달라고 요청 하였으며, 해시태그 생성시 특수문자 # 은 붙이지 말고, 각 해시태그를 콤마(,)로 연결 해서 작성 해달라고 요청 하였다.

글 제목과 추천 태그가 잘 생성 된 것을 볼 수 있다.

위의 예문에서는 그나마 깔끔하게 태그 값을 가져왔지만 실제로 여러번 돌려 봤을때 간혹 불필요한 문자인 쌍따옴표(“) 라던가 다음줄(\n) 로 내려가 있다거나 하는 경우들이 발생하였다.

스크린 샷을 찍어 놨어야 했는데 아쉽게도 보여줄 수가 없다…😭😭

여튼 이런 값들은 모두 제거 해버리자.

tag = tag.replace('\n','').replace('\"','').strip()

그리고 태그 값들을 자세히 보면 한가지 문제가 발생하는데 추천 태그 값들을 보면 “꿈과추억, 나만의꿈, 전라남도, 발견하다, 나의여정” 쉼표와 다음 태그 사이에 공백이 들어가 있다.

이렇게 공백이 들어가게 되면 나중에 쉼표(,) 를 기준으로 split 을 하던 반복문을 돌리던 할때 첫 태그를 제외하고 두번째 태그 부터는 앞에 공백이 들어간 태그가 될 우려가 있다.

이 공백을 모두 제거 해주고 공백 없이 깔끔하게 태그 단어 값만 가져 오도록 하자.

# 태그 공백제거 후 리스트 타입
arrTags = tag.split(',')
listTags = list()
for item in arrTags:
    listTags.append(item.strip())

공백까지 완벽하게 제거 되어 리스트 타입의 변수 listTags 에 모든 태그 데이터를 담았다.

이 리스트 타입의 변수를 리턴 값으로 설정 해주기만 하면 된다.

# 반환 값 설정
response =  {
    'title': title,
    'tag' : listTags,
    'category' : category,
    'contents' : contents
}

이렇게 설정 하게 되면 이미 위에서 만들어 둔 워드프레스 자동 등록 프로세스에서 신규 글 등록시 자연스럽게 ChatGPT 로 생성 된 태그가 등록이 될 것이다.

이젠 모든 테스트 코드등을 제거 하고 최종 소스를 실행 시켜 보자.

전체 적용 및 실행 결과 확인

import config
import requests, openai
from bs4 import BeautifulSoup
from time import sleep

# ChatGPT 컨텐츠 생성 함수
def generateChatGPT(topic, category, numTags, model='text-davinci-003', maxTokens=3900):
    # ChatGPT API 인증
    openai.organization = config.openai_organization
    openai.api_key = config.openai_apiKey

    # 타이틀 생성
    prompt = f"""
        As a very proficient SEO writer, I am writing a blog about {category}.
        Here are 1 potential blog subjects that would fit well with the topic name "{topic}",
        recommend a sentimental title.
    """
    res = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
    title = res["choices"][0]["text"]
    title = title.replace('\n','').replace('\"','').replace('-','').strip()
    print('타이틀 생성 완료')

    # 태그 조합
    prompt = f"""
        Generate {str(numTags)} hashtags fit to this blog title, {title} using Korean.
        Don't use "#" in front of each tag, connect each hashtag with comma.
    """
    res = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
    tag = res["choices"][0]["text"]
    tag = tag.replace('\n','').replace('\"','').strip()

    # 태그 공백제거 후 리스트 타입
    arrTags = tag.split(',')
    listTags = list()
    for item in arrTags:
        listTags.append(item.strip())

    print('태그 조합 완료')

    # 본문 응답 프롬프트
    try:
        prompt = f"""
            As a very proficient SEO writer, I am writing a blog about {category}.

            Create a blog for "{topic}". Its category is {category}.

            Write a 2000 word blog article except H1 tag in body tag of html format.
            Contains subtitles and detailed descriptions.
        """
        body = openai.Completion.create(model=model, prompt=prompt, max_tokens=maxTokens)
        body = body["choices"][0]["text"]

        # 특정 html H1 태그 행 삭제
        soup = BeautifulSoup(body, 'html.parser')
        for row in soup.select('h1'):
            row.decompose()
        body = str(soup)

        # 불필요 글자 제거
        body = body.replace('#', '')

        # 본문 목차 포함하여 문자열 조합 완성
        contents = f"<!-- wp:luckywp/tableofcontents /-->\n{body}"

        print('본문 생성 완료')
    except Exception as e:
        print(e)
        return ""

    # 반환 값 설정
    response =  {
        'title': title,
        'tag' : listTags,
        'category' : category,
        'contents' : contents
    }

    print('ChatGPT 프로세스 완료')

    return response



# 워드프레스 자동 포스팅 함수
def createPost(postInfo):
    try:
        print('워드프레스 포스팅 중...')

        # 워드프레스 JWT 인증 토큰 얻기
        url = f"https://{config.url}/wp-json/jwt-auth/v1/token"
        data = {
            'username': config.id,
            'password':config.pw
        }
        res = requests.post(url, data=data).json()
        token = res.get('token')

        # 헤더에 JWT 인증 토큰 데이터 추가
        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Authorization': f'Bearer {token}'
        }

        # 워드프레스 포스팅 데이터 설정
        postURL = f"https://{config.url}/wp-json/wp/v2/posts"
        postData = {
            'title': postInfo.get('title'),
            'slug': postInfo.get('title').replace(' ', '-'),
            'content': postInfo.get('contents'),
            'meta': {
                'category': postInfo.get('category')
            },
            'status': postInfo.get('status')
        }

        # 워드프레스 포스팅 생성 요청 보내기
        response = requests.post(postURL, json=postData, headers=headers)

        # 응답 결과 확인
        if response.status_code == 201:
            # 워드프레스 포스팅 ID
            postedID = response.json().get('id')

            # 태그 설정
            arrTags = list()
            for item in postInfo.get('tags'):
                # 태그 신규 생성 및 태그 Relationships 테이블에 등록할 id 값 구하기
                url = f"https://{config.url}/wp-json/wp/v2/tags"
                params = {
                    'search': item
                }
                res = requests.get(url, params=params).json()

                if len(res) < 1:
                    # 태그 신규 등록 후 id 값 수집
                    tagData = {
                        'name': item
                    }
                    tagsURL = 'https://'+config.url+'/wp-json/wp/v2/tags'
                    resTag = requests.post(tagsURL, json=tagData, headers=headers).json()
                    arrTags.append(resTag.get('id'))
                else:
                    # 이미 등록 된 태그 id 값 수집
                    arrTags.append(res[0].get('id'))

            # 태그를 쉼표 구분자로 이용해 한 문장으로 변경 (ex. 태그1,태그2,태그3)
            strTags = ','.join(map(str, arrTags))

            # 워드프레스 신규 포스팅에 태그 값 업데이트
            updatePostData = {
                'tags': strTags
            }
            postURL = f"https://{config.url}/wp-json/wp/v2/posts/{postedID}"
            response = requests.post(postURL, json=updatePostData, headers=headers).json()

        print('워드프레스 포스팅 완료')

    except Exception as e:
        print(e)
        return ""


"""
    메인 프로세스
"""
if __name__ == "__main__":
    # ChatGPT 새 글 생성
    response = generateChatGPT(config.topic, config.category, config.numTags)

    # 워드프레스 포스팅 데이터 설정
    postInfo = {
        'title' : response['title'],
        'contents' : response['contents'],
        'category' : response['category'],
        'tags' : response['tag'],
        'status' : 'draft'
    }

    # 워드프레스 포스팅 등록 요청
    createPost(postInfo)

워드프레스 자동 등록이 되면서 ChatGPT 로부터 추천 받은 5개의 태그 역시 정상적으로 등록이 되었다.

마치며

이번 포스팅은 구글링 해도 쉽게 보지 못할 워드프레스 Rest API Tags 기능에 대한 포스팅 이였다.😎😎😎

사실상 이정도면 모든 기능을 거의 다 만든 거라고 볼 수 있겠지만 한 가지 더 다뤄 보려고 한다. 뭐 대단히 특별한 기능을 다루려는 것은 아니고 현재는 글 한개만 발행하도록 되어 있는데, 주제를 5개 던져주면 글 5개를 생성 해주도록 하는 기능을 다음 포스팅에서 다뤄 보도록 하겠다.

이전 편: 워드프레스 자동 등록 : 파이썬, ChatGPT API, 워드프레스 Rest API 활용 #3

다음 편: 워드프레스 자동 등록 : 파이썬, ChatGPT API, 워드프레스 Rest API #5

Posted in 강의

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다