개발자's Life

[Python] ChatGPT 를 이용하여 워드프레스 게시글 자동업로드_키워드는 식품안전나라 API 사용 본문

Back-end/Python

[Python] ChatGPT 를 이용하여 워드프레스 게시글 자동업로드_키워드는 식품안전나라 API 사용

Rowen Jobs 2023. 8. 2. 06:53
728x90
반응형

ChatGPT API 와 식품안전나라 API 를 이용하여 워드프레스 게시글 업로드 진행하는 법에 대해 적어보려 한다. 

 

ChatGPT API 사용 방법에 대해서는 아래 글을 참고! 

2023.07.31 - [Back-end/Python] - [Python] ChatGPT API 를 이용하여 ChatGPT 사용해보기

 

[Python] ChatGPT API 를 이용하여 ChatGPT 사용해보기

파이썬 코드로 ChatGPT API 연결하여 사용하는 코드는 자바에 비해 아주 단순하다. 자바 코드로 작성된 ChatGPT API 가 궁금할 경우 아래 링크를 확인하면 된다. 2023.03.11 - [Back-end/Java] - [JAVA] ChatGPT API

rowen.tistory.com

 

식품안전나라 Open API

https://www.foodsafetykorea.go.kr/api/openApiAplcInfo.do

 

데이터활용서비스

3 INFO-100 인증키가 유효하지 않습니다. 인증키가 없는 경우, 홈페이지에서 인증키를 신청하십시오.

www.foodsafetykorea.go.kr

 

그리고 참고해야 하는 부분이 워드프레스 자동 업로드 방법이고 아래 글을 참고!

2023.07.28 - [Back-end/Python] - [Python] 워드프레스 자동 게시글 올리는 코드 작성(자동화)

 

[Python] 워드프레스 자동 게시글 올리는 코드 작성(자동화)

워드프레스에 생각보다 아주 간단하게 자동 포스팅을 할 수 있었다. import requests from urllib.parse import urljoin from datetime import datetime # 변수셋팅 ##도메인 주소 WP_URL = 'https://yourDomain.com/' ##추가 사용

rowen.tistory.com

 

위 두가지 API 를 이용하여 파이썬 코드에 주석을 달아 적어본다.

import json
import requests
import openai
import urllib.request
from urllib.parse import urljoin
from datetime import datetime

# 변수셋팅

##도메인 주소 
WP_URL = 'https://yourDomain.com/'  

##추가 사용자이름
WP_USERNAME = 'userName'  

##추가 된 사용자 편집 페이지에서 발급 받은 비밀번호
WP_PASSWORD = 'userPassword'

#publish(즉시발행), draft(임시저장)
status = 'draft' 

##슬러그
slug = 'auto-slug' 

##제목
title = '파이썬 자동포스팅' 

##본문내용을 html 로 적으면 된다
content = 'h1 태그 : <h1>H1 태그 테스트</h1>' 

##카테고리 아이디는 글 > 카테고리 > 카테고리 이름에 커서를 가져가면 카테고리 아이디값이 나온다.(tag_id로 되어 있다.)
category_id = [1] 

##카테고리 아이디 찾는 방법과 동일
tag_id = [6] 

## 변수 지정
user_ = WP_USERNAME
pass_ = WP_PASSWORD

# 이미지 다운로드 받을 파일 경로 지정
folder="/yourPath/"

# 식품안전나라에서 API 사용
# http://openapi.foodsafetykorea.go.kr/api/keyId/serviceId/dataType/startIdx/endIdx
url1 = 'http://openapi.foodsafetykorea.go.kr/keyId/serviceId/dataType/json/1/10'
headers1 = {'Authorization': 'Digest username="postman", realm="Users", nonce="ni1LiL0O37PRRhofWdCLmwFsnEtH1lew", uri="/digest-auth", response="254679099562cf07df9b6f5d8d15db44", opaque=""'}

# 아래와 같이 파라미터를 전달하는 값은 이번에 사용하지 않고 1 ~ 10 가지의 식품 내용을 가지고 오겠습니다.
params = {'param':'있을경우 사용'}
data1 = {'data':'있을 경우 사용'}

# API 반환된 값 변수에 담기
response = requests.get(url1,headers=headers1)
json2 = json.loads(response.content)

# 반환 된 값으로 반복문, 여기부터 Chat GPT API 사용
# Chat GPT 만 사용하실 분은 반복문 안 집중적으로 봐주시면 됩니다.
for idx, recipe in enumerate(json2["COOKRCP01"]["row"]):
	## chat GPT
    contentForGPT = ""
    
    # API KEY 를 넣어주세요
    openai.api_key = "Your Chat GPT API" 

    messages = []
	
    # 질문할 내용 데이터 가공
    contentForGPT = recipe["RCP_NM"] + "의 효능에 대해 알려줘"
    
    #질문 내용 확인
    print("content : ", contentForGPT)

	# 질문 내용 Message 변수에 추가
    messages.append({"role": "user", "content": contentForGPT})

	# 질문내용 답변 받기
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages
    )

	# 질문내용 답변 변수 삽입
    chat_response = completion.choices[0].message.content
    # finish Chat GPT
    # 여기까지 Chat GPT 반환내용
	
    # 식품안전나라에서 받은 Title 셋팅
    title = recipe["RCP_NM"]
	
    # 워드프레스 본문내용 셋팅
    html = f''' 
    <br>
    <h3>재료</h3>
    <br>
    {recipe["RCP_PARTS_DTLS"]}
    <hr>
    <h5>조리 순서</h5>
    <br>
    {recipe["MANUAL01"]}
    <br>
    {recipe["MANUAL02"]}
    <br>
    {recipe["MANUAL03"]}
    <br>
    {recipe["MANUAL04"]}
    <br>
    <br>
    <hr>
    <h5>
    About..
    </h5>
    <br>
    # Chat GPT 본문내용 삽입
    {chat_response}
    '''
    
    # 식품안전나라에서 받은 이미지 URL 변수에 담고 이미지 내 컴퓨터 파일 경로에 다운로드
    food_img_url = recipe["ATT_FILE_NO_MK"]
    filename = "food_" + str(idx) + ".jpg"
    filepath= folder + filename
    urllib.request.urlretrieve(food_img_url, "/yourPath/food_" + str(idx) + ".jpg")

#Finish API 셋팅

	# 저장된 파일 업로드할 이미지 셋팅
    url = urljoin(WP_URL, '/wp-json/wp/v2/media/')  
    f = open(filepath, 'rb')
    image_data = f.read()
    f.close()
    espSequence = bytes(filename, "utf-8").decode("unicode_escape")  

    headers = {
        'Content-Type': 'image/png',
        'Content-Disposition': 'attachment; filename=%s' % espSequence,                                 
    }
    
    res2 = requests.post(
        url,
        data=image_data,
        headers=headers,
        auth=(WP_USERNAME, WP_PASSWORD),
        )

    media_info = res2.json()

    media_id = media_info['id'] 
    media_url = media_info['source_url'] 
	
    # 업로드 된 파일 URL 변수 삽입
    img_contents = f'''[caption id="attachment_{media_id}" align="aligncenter" width="500"]<img class="size-full wp-image-{media_id}" src="{media_url}" alt="{title}" width="500" height="500"> {title}[/caption]
    <p> </p><br />
    <p> </p>
    '''

    # 위 내용의 html 삽입 및 data 셋팅
    content = html 
    payload = {"status": status,
                "slug": slug,
                "title": title,
                "content": content,
                # "date": now.isoformat(),            
                "categories": category_ids,
                "tags": tag_ids,
                }
    # 이미지 있을 경우 이미지 정보도 삽입
    if media_id is not None:
        payload['featured_media'] = media_id

	# 워드프레스 업로드 시작
    res = requests.post(urljoin(WP_URL, "/wp-json/wp/v2/posts"),
                        data=json.dumps(payload),
                        headers={'Content-type': "application/json"},
                        auth=(WP_USERNAME, WP_PASSWORD))
    if res.ok:
        print(f'''성공 code:{res.status_code}''')   
    else:
        print(f"실패 code:{res.status_code} reason:{res.reason} msg:{res.text}")

반복문을 통해 계속 업로드가 된다. 

 

진행 프로세스를 참고하여 다시 코드를 보면 이해하기 조금 더 쉬울것이다.

 

[프로세스]

식품안전나라 API 호출 -> 1 ~ 10 가지 레시피 정보를 가지고 반복문  -> 반복문 속에서 Chat GPT 에게 음식에 대한 효능 질문 호출 -> 식품안전나라 값과 ChatGPT 반환된값의 데이터를 가공하여 워드프레스 업로드

 

이미지 다운로드 후 워드프레스 재업로드와 식품안전나라 API 반환 값이 조금 혼동이 올 수 있으나 이전 게시글들을 이해하였으면 충분히 해당 내용들을 제거하고 사용할거라 예상합니다!!!!!

 

 

728x90
Comments