GCP/Apps Script

Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #3

whistory 2024. 10. 8. 14:45
반응형

 
 
 
 
화면 구성 중 2번 화면을 설명해보겠다.
 
1. 쿠팡 API로 상품 HTML 만드는 화면
 

 

Apps Script로 쿠팡 어필리에이트 상품 HTML 만들기

알리익스프레스의 어필리에이트는 승인받는 절차가 많아서 그렇지, 시간이 지나면 API를 사용할수 있다. 하지만 쿠팡은 15만원이상 구매실적이 충족되어야 최종 승인이 진행되고 API를 사용할수

whiseung.tistory.com

 
2. 쿠팡 상품명을 기반으로 GPT 를 이용해 설명을 만들고, HTML과 병합하는 화면
 

 

Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #2

쿠팡 어필리에이트 API를 사용하려면판매금액 150,000원을 채워야한다. 나는 이미 채웠고, API는 아래와 같이 사용한다.  Apps Script로 쿠팡 어필리에이트 상품 HTML 만들기알리익스프레스의 어필리

whiseung.tistory.com

 
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에서 함수실행하면 아래와 같이 로그를 확인할수있고,

화면에서 실행하면 우측하단에 토스트창에서 상태를 확인할수있다.

반응형