반응형
화면 구성 중 2번 화면을 설명해보겠다.
1. 쿠팡 API로 상품 HTML 만드는 화면
2. 쿠팡 상품명을 기반으로 GPT 를 이용해 설명을 만들고, HTML과 병합하는 화면
3. GPT 를 이용해 글을 작성하는 화면
상품설명과 상품 이미지, 금액정보들을 HTML 로 만들어봤다.
이제 GPT를 이용해 메인 글을 작성해보겠다.
GPT에게 블로그 글을 써달라고 할것이다.
패션, 자동차용품, 전자제품 등 다양한 제품군들을 GPT에게 블로그 글을 써달라고 할건데, 패션, 자동차용품, 전자제품 등 다양한 제품군들을 다룰 수 있는 주제로 독창적이고 유익한 정보를 제공받아 많은 독자들에게 흥미롭고 유용한 콘텐츠를 만들어낼 계획이다.
너는 파워블로거이고, "${keyword}" 키워드를 가지고 사람들이 관심가질수 있는 블로그글을 써줘.
이런식으로 질문을 작성해주면, GPT는 어떻게든 다양한 주제로 10개의 블로그 글을 만들어줄것이다.
[글 작성하기] 버튼 눌렀을 때 함수 실행부
/**
* 블로그 본문 작성 (gpt-4o)
*/
function createContent4() {
const ss = SpreadsheetApp.getActive();
const content = ss.getRangeByName("content_message").setValue(content_message);
for ( i = 1; i<=10; i++ ){
ss.getRangeByName('content_desc_' + (parseInt(i)+1)).setValue(processAzureOpenAi4(content, "content"));
}
}
실제 함수 실행부
/**
* 컨텐츠 생성 프롬프트
*/
const content_prompt = `You are an assistant who writes blog posts. Write the following:
1. Click people and write interesting content.
2. Write in Korean.
3. Write in a way that people will find interesting.
4. Write content as long as possible.
5. The output format should always be output like this.
Format:
- [title] = string
- [content] = string
6. Enter the title of your blog in the title.
7. Enter the blog you wrote in content html format.
Always create content inside <body>.
Format :
\\`\\`\\`
<body>
{content}
</body>
\\`\\`\\`
`;
/**
* 글 생성하기 (gpt-4o)
*/
function processAzureOpenAi4(message, gubun) {
var prompt = '';
if (gubun == null) {
prompt = AOAI4.env.AZURE_OPENAI_SYSTEM_MESSAGE;
} else if (gubun == "content") {
prompt = content_prompt;
} else if (gubun == "merge") {
prompt = merge_prompt;
}
const url = `${AOAI4.env.AZURE_OPENAI_ENDPOINT}openai/deployments/${AOAI4.env.AZURE_OPENAI_MODEL}/chat/completions?api-version=${AOAI4.env.AZURE_OPENAI_PREVIEW_API_VERSION}`;
var formData = {
"max_tokens": AOAI4.env.AZURE_OPENAI_MAX_TOKENS,
"messages": [
{ "role": "system", "content": prompt },
{ "role": "user", "content": message }
]
};
var allContent = ""; // 전체 답변을 저장할 변수
var finishReason = "length"; // 처음에는 길이 초과를 가정
while (finishReason === "length") {
const response = UrlFetchApp.fetch(url, {
method: "POST",
headers: {
"api-key": AOAI4.env.AZURE_OPENAI_KEY,
"Content-Type": "application/json"
},
payload: JSON.stringify(formData)
});
const json = response.getContentText();
const returnData = JSON.parse(json);
const currentContent = returnData.choices[0].message.content;
// 응답의 현재 내용을 추가
allContent += currentContent;
// finish_reason이 length인지 확인
finishReason = returnData.choices[0].finish_reason;
// 대화를 이어받기 위해 이전 내용을 추가하고 메시지 재구성
formData.messages.push({ "role": "assistant", "content": currentContent });
}
return allContent; // 전체 답변 반환
}
[글 올리기] 버튼 눌렀을 때 함수 실행부
/**
* 글들을 모아서 워드프레스 글쓰기
*/
function createContent() {
const ss = SpreadsheetApp.getActive();
// 범위이름 선언
const item_merge = ss.getRangeByName("merge_1").getValue();
const item_desc = ss.getRangeByName("item_desc4").getValue();
const concat_text = ss.getRangeByName("concat_text").getValue();
var dummy_style = ss.getRangeByName("dummy_style").getValue();
// 시트에서 입력한 글쓰기순번
const index_arr = ss.getRangeByName("index_arr").getValue();
var work_arr = rotateArray(index_arr);
// 글쓰기
for ( i in work_arr ) {
var contentDesc = ss.getRangeByName('content_desc_' + (parseInt(i)+1)).getValue();
var title = contentDesc.match(/- \\[title\\] = (.+)/)[1] == null ? contentDesc.match(/- \\[title\\] = "(.*?)"/)[1]: contentDesc.match(/- \\[title\\] = (.+)/)[1];
var content = contentDesc.match(/```([\\s\\S]*?)```/)[1];
content += `<br/><br/>${concat_text}<br/><br/>${item_merge}`;
if ( i == 0 ) {
postToWordpress(work_arr[i], title, (content+dummy_style));
} else {
postToWordpress(work_arr[i], title, (content+dummy_style), (parseInt(i))*3);
}
}
}
/**
* 워드프레스 글쓰기
*/
function postToWordpress(domain, title, content, gap) {
var url = `https://${domain}.whistory.co.kr/wp-json/wp/v2/posts`;
var username = '사용자 이메일';
var password = '워드프레스 암호';
var auth = "Basic " + Utilities.base64Encode(username + ':' + password);
var postData;
if ( gap == null || gap == "" ) {
// 작성할 포스트 데이터
postData = {
"title": title,
"content": content,
"status": "publish" // 공개 설정 (미리보기로 저장하려면 'draft' 사용)
};
} else {
postData = {
"title": title,
"content": content,
"status": 'future', // 예약 게시를 위한 상태
"date": calcPublishDate(gap), // n일 후의 날짜를 설정
};
}
var options = {
"method" : "post",
"muteHttpExceptions" : true,
"headers": {
"Authorization": auth,
"Content-Type": "application/json"
},
"payload" : JSON.stringify(postData)
};
try {
var response = UrlFetchApp.fetch(url, options);
var success_message = `[${domain}] 도메인에 "${title}" 글 작성 성공`;
console.log(success_message);
openToastWriteEnd(success_message);
} catch (e) {
Logger.log("Error: " + e.message);
}
}
/**
* 작성완료 메시지 표출
*/
function openToastWriteEnd(text) {
SpreadsheetApp.getActiveSpreadsheet().toast(text, '글 업로드 성공', 1);
}
IDE에서 함수실행하면 아래와 같이 로그를 확인할수있고,
화면에서 실행하면 우측하단에 토스트창에서 상태를 확인할수있다.
반응형
'GCP > Apps Script' 카테고리의 다른 글
Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #2 (2) | 2024.10.04 |
---|---|
Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #1 (3) | 2024.10.02 |
Apps Script 디버그 하기 (4) | 2024.09.12 |
[도서] 앱스 스크립트 관련 도서 소개 (5) | 2024.09.03 |
Apps Script에서 GPT를 이용해 구글 시트의 데이터 분석하기 (0) | 2024.07.10 |