From 7f03ff861be4d16942302c205ebeff861735c38a Mon Sep 17 00:00:00 2001 From: icurfer Date: Fri, 4 Oct 2024 00:02:07 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8D=B0=EB=AA=A8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++- main.py | 33 ++++++++++++++++--- package/GetConfig.py | 2 +- package/MariaDB.py | 1 - package/OpenAI.py | 37 ++++++++++++++++++++++ package/Utility.py | 61 ++++++++++++++++++++++++++++++++++++ package/__init__.py | 7 +++-- package/convert_md.py | 2 +- package/get_url.py | 38 ---------------------- package/open_ai.py | 53 ------------------------------- package/translate_article.py | 30 ------------------ package/wp.py | 43 ------------------------- 12 files changed, 139 insertions(+), 174 deletions(-) create mode 100644 package/OpenAI.py create mode 100644 package/Utility.py delete mode 100644 package/get_url.py delete mode 100644 package/open_ai.py delete mode 100644 package/translate_article.py delete mode 100644 package/wp.py diff --git a/README.md b/README.md index 3598ade..818106e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,11 @@ make.com을 이용해서 만든 AutoMation Flow를 Python을 이용하여 변환 * OpenAI이용 코드 작성(완료)-비용 절감을 위하여 제목, 이미지 생성 제외. * HTML문서 변환 코드 작성(완료). * 워드프레스 등록 플로우 코드 작성(기능 테스트 완료 - 연결 필요). -* 코드 리팩토링. + +### 코드 리팩토링. +* 환경변수 호출 모듈분리(완료) +* 데이터베이스 조회 모듈분리(완료) +* OpenAI 모듈 ## 코드 이슈 ### 네이버 블로그 크롤링 diff --git a/main.py b/main.py index f380354..d66346b 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,37 @@ -from package import GetConfig -from package import MariaDB +import package as pkg +from package import GetConfig, MariaDB, ChangeTextToPost, WordPress +import markdown # 2024-10-03 환경 변수 호출 -config = GetConfig.GetConfig() +config = GetConfig() dict_data = config.get_config_as_dict() # 2024-10-03 db에서 url정보 호출 -db = MariaDB.MariaDB(dict_data) +db = MariaDB(dict_data) url = db.fetch_data_from_mariadb()['url'] +# 2024-10-03 url을 이용해서 text추출 +origin_content = pkg.getContents(url) +# 2024-10-03 openAI를 이용하여 게시글 스타일 변경 +openai_key = dict_data['openai_api_key'] +wp_reference_style = dict_data['wp_post_style'] + +open_ai = ChangeTextToPost(openai_key) +post_article = open_ai.generate_blog_post(origin_content, wp_reference_style) + +# 2024-10-03 Markdown을 HTML로 변환 +html = markdown.markdown(post_article) + +# 2024-10-03 워드프레스 포스팅 임시등록 +wp = WordPress(dict_data) +rs = wp.create_post(2,html) + +if __name__ == "__main__": + # print(post_article) + print("추가 확인을 위한 출력") + if rs.ok: + print(f"성공 code:{rs.status_code}") + else: + print(f"실패 code:{rs.status_code} reason:{rs.reason} msg:{rs.text}") + diff --git a/package/GetConfig.py b/package/GetConfig.py index 8dc35f3..d931a20 100644 --- a/package/GetConfig.py +++ b/package/GetConfig.py @@ -9,7 +9,7 @@ class GetConfig: self.db_user = os.getenv('DB_USER') self.db_pw = os.getenv('DB_PASSWORD') self.db_database = os.getenv('DB_NAME') - self.openai_api_key = os.getenv('OPEN_API_KEY') + self.openai_api_key = os.getenv('OPENAI_API_KEY') self.wp_url = os.getenv('WP_URL') self.wp_user = os.getenv('WP_USER') self.wp_api_key = os.getenv('WP_API_KEY') diff --git a/package/MariaDB.py b/package/MariaDB.py index 90a52a7..e507605 100644 --- a/package/MariaDB.py +++ b/package/MariaDB.py @@ -1,5 +1,4 @@ import mysql.connector -import os class MariaDB: diff --git a/package/OpenAI.py b/package/OpenAI.py new file mode 100644 index 0000000..d8fb40c --- /dev/null +++ b/package/OpenAI.py @@ -0,0 +1,37 @@ +from openai import OpenAI + +class ChangeTextToPost: + + def __init__(self, key): + self.client = OpenAI( + api_key=key, + ) + + def generate_blog_post(self, origin_content, wp_post_style): + + # ChatCompletion API를 사용하여 텍스트 변환 + prompt = ( + """ + 너는 대한민국에 거주하는 블로그 전문가이다. + 네가 작성한 블로그 글은 지난 3년간 높은 주목성, 관여도, 전환율을 만들었다. + 이 전문성을 이용해서 제공받는 기사를 블로그 형태로 변형하여 작성해야만 한다. + --- + 글을 작성하고 제목을 만들어서 맨 마지막 줄에 추가해줘. + """ + f"\n블로그 스타일은 아래 문서를 모방해줘. markdown형태로 작성되어야한다. 적절한 사례들이 들어가도 좋겠어.\n---\n{wp_post_style}\n" + f"제공된 기사 내용:\n{origin_content}" + ) + + response = self.client.chat.completions.create( + model="gpt-4o", + messages=[ + {"role": "system", "content": "너는 대한민국에 거주하는 블로그 전문가이다."}, + {"role": "user", "content": prompt} + ], + max_tokens=2000, + temperature=0.7, # 창의성을 위한 적절한 값 조정 + ) + + # 응답에서 텍스트 추출 + blog_post = response.choices[0].message.content + return blog_post \ No newline at end of file diff --git a/package/Utility.py b/package/Utility.py new file mode 100644 index 0000000..4ffc832 --- /dev/null +++ b/package/Utility.py @@ -0,0 +1,61 @@ +import requests, json +from urllib.parse import urljoin +from bs4 import BeautifulSoup +from datetime import datetime + +def getContents(url): + # HTTP GET 요청으로 페이지 가져오기 + response = requests.get(url) + + # 응답 상태 확인 + if response.status_code == 200: + # HTML 파싱 + soup = BeautifulSoup(response.text, 'html.parser') + + # HTML 태그를 제거 후 페이지의 모든 텍스트 가져오기 (전체 내용) + page_content = soup.get_text() + + # 빈 줄을 제거하고 텍스트만 출력 (줄바꿈 문자를 기준으로 필터링) + lines = [line.strip() for line in page_content.splitlines() if line.strip()] + + # 결과 출력 + contents = "\n".join(lines) + return contents + else: + print(f"Failed to fetch the URL. Status code: {response.status_code}") + +class WordPress(): + + def __init__(self, dict): + self.wp_url = dict['wp_url'] + self.wp_user = dict['wp_user'] + self.wp_user = dict['wp_user'] + self.wp_api_key = dict['wp_api_key'] + + def create_post(self, category_id, content, media_id = None, status = "draft", title="파이썬 자동 포스팅"): + payload = { + "status": status, # publish / draft + "title": title, + "content": content, + "date": datetime.now().isoformat(), # YYYY-MM-DDTHH:MM:SS + "categories": category_id + } + if media_id is not None: + payload['featured_media'] = media_id + + + + return requests.post(urljoin(self.wp_url, "wp-json/wp/v2/posts"), + data=json.dumps(payload), + headers={'Content-type': "application/json"}, + auth=(self.wp_user, self.wp_api_key)) + # if result.ok: + # print(f"성공 code:{result.status_code}") + # else: + # print(f"실패 code:{result.status_code} reason:{result.reason} msg:{result.text}") + +if __name__ == "__main__": + # url = 'example_url' + # tmp = getContents(url) + # print(tmp) + pass \ No newline at end of file diff --git a/package/__init__.py b/package/__init__.py index ce27c6e..bc08572 100644 --- a/package/__init__.py +++ b/package/__init__.py @@ -1,2 +1,5 @@ -from . import GetConfig -from . import MariaDB \ No newline at end of file +from .Utility import getContents +from .Utility import WordPress +from .GetConfig import GetConfig +from .MariaDB import MariaDB +from .OpenAI import ChangeTextToPost \ No newline at end of file diff --git a/package/convert_md.py b/package/convert_md.py index 6f9ecf0..3ac03b1 100644 --- a/package/convert_md.py +++ b/package/convert_md.py @@ -2,7 +2,7 @@ import os from dotenv import load_dotenv import markdown import package.translate_article as ta -import package.open_ai as oa +import package.OpenAI as oa # .env 파일에서 API 키 로드 load_dotenv(r'./.env.dev') diff --git a/package/get_url.py b/package/get_url.py deleted file mode 100644 index 6c259b5..0000000 --- a/package/get_url.py +++ /dev/null @@ -1,38 +0,0 @@ -import mysql.connector -import os - - -# MariaDB에 연결하는 함수 -def fetch_data_from_mariadb(): - try: - # 데이터베이스 연결 - connection = mysql.connector.connect( - host=host, - user=user, - password=password, - database=database - ) - - # 커서 생성 - cursor = connection.cursor(dictionary=True) - - # 쿼리 실행 - query = "SELECT * FROM healty_url_source ORDER BY idx DESC LIMIT 1;" - cursor.execute(query) - - # 결과 가져오기 - result = cursor.fetchone() - return result - - except mysql.connector.Error as err: - print(f"Error: {err}") - finally: - if connection.is_connected(): - cursor.close() - connection.close() - -if __name__ == "__main__": - # 결과 확인 - data = fetch_data_from_mariadb() - print(data['url']) - diff --git a/package/open_ai.py b/package/open_ai.py deleted file mode 100644 index ea9a03e..0000000 --- a/package/open_ai.py +++ /dev/null @@ -1,53 +0,0 @@ -import os -from openai import OpenAI -from dotenv import load_dotenv -import package.translate_article as ta - -# .env 파일에서 API 키 로드 -load_dotenv() -client = OpenAI( - api_key=os.getenv("OPENAI_API_KEY"), -) - -def generate_blog_post(article_text, style_reference): - - # ChatCompletion API를 사용하여 텍스트 변환 - prompt = ( - """ - 너는 대한민국에 거주하는 블로그 전문가이다. - 네가 작성한 블로그 글은 지난 3년간 높은 주목성, 관여도, 전환율을 만들었다. - 이 전문성을 이용해서 제공받는 기사를 블로그 형태로 변형하여 작성해야만 한다. - --- - 글을 작성하고 제목을 만들어서 맨 마지막 줄에 추가해줘. - """ - f"\n블로그 스타일은 아래 문서를 모방해줘. 적절한 사례들이 들어가도 좋겠어.\n---\n{style_reference}\n" - f"제공된 기사 내용:\n{article_text}" - ) - - response = client.chat.completions.create( - model="gpt-4o", - messages=[ - {"role": "system", "content": "너는 대한민국에 거주하는 블로그 전문가이다."}, - {"role": "user", "content": prompt} - ], - max_tokens=2000, - temperature=0.7, # 창의성을 위한 적절한 값 조정 - ) - - # 응답에서 텍스트 추출 - blog_post = response.choices[0].message.content - return blog_post - -if __name__ == "__main__": - # 예시 기사 텍스트 (text 파싱 결과로 제공된 텍스트를 사용할 수 있습니다) - article_text = ta.getContents() - - # 블로그 스타일 참고 텍스트 - style_reference = os.getenv("reference_style") - - # 블로그 포스트 생성 - blog_post = generate_blog_post(article_text, style_reference) - - # 결과 출력 - print(">>>>\n" * 3) - print(blog_post) \ No newline at end of file diff --git a/package/translate_article.py b/package/translate_article.py deleted file mode 100644 index 3245de8..0000000 --- a/package/translate_article.py +++ /dev/null @@ -1,30 +0,0 @@ -import requests -from bs4 import BeautifulSoup -import db_ctr.get_url as get_url - - -url = get_url.fetch_data_from_mariadb()['url'] - -def getContents(): - # HTTP GET 요청으로 페이지 가져오기 - response = requests.get(url) - - # 응답 상태 확인 - if response.status_code == 200: - # HTML 파싱 - soup = BeautifulSoup(response.text, 'html.parser') - - # HTML 태그를 제거 후 페이지의 모든 텍스트 가져오기 (전체 내용) - page_content = soup.get_text() - - # 빈 줄을 제거하고 텍스트만 출력 (줄바꿈 문자를 기준으로 필터링) - lines = [line.strip() for line in page_content.splitlines() if line.strip()] - - # 결과 출력 - contents = "\n".join(lines) - return contents - else: - print(f"Failed to fetch the URL. Status code: {response.status_code}") - -tmp = getContents() -print(tmp) \ No newline at end of file diff --git a/package/wp.py b/package/wp.py deleted file mode 100644 index 4d2a2ae..0000000 --- a/package/wp.py +++ /dev/null @@ -1,43 +0,0 @@ -import os -from dotenv import load_dotenv -import json -import requests -from urllib.parse import urljoin -from datetime import datetime - -# .env 파일에서 API 키 로드 -load_dotenv(r'./.env.dev') - -wp_url = os.getenv('WP_URL') -wp_usr = os.getenv('WP_USERNAME') -wp_key = os.getenv('WP_API_KEY') -status = 'draft' # 즉시발행 publish, 임시저장 draft -# slug = 'input your slug' - -title = '파이썬 자동포스팅' -content = 'html 호출 연동 필요.' # 연결만하면됨 테스트 완료. -category_id = [2] # 카테고리 아이디 -# tag_ids = [21] #태그아이디 -media_id=None #이미지 업로드를 제외 None - -payload = { - "status": status, - "title": title, - "content": content, - "date": datetime.now().isoformat(), # YYYY-MM-DDTHH:MM:SS - "categories": category_id -} -if media_id is not None: - payload['featured_media'] = media_id - - - -result = requests.post(urljoin(wp_url, "wp-json/wp/v2/posts"), - data=json.dumps(payload), - headers={'Content-type': "application/json"}, - auth=(wp_usr, wp_key)) - -if result.ok: - print(f"성공 code:{result.status_code}") -else: - print(f"실패 code:{result.status_code} reason:{result.reason} msg:{result.text}") \ No newline at end of file