GCP/Apps Script

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

whistory 2024. 10. 4. 14:46
반응형

 

 

 

 

 

쿠팡 어필리에이트 API를 사용하려면

판매금액 150,000원을 채워야한다.

 

나는 이미 채웠고, API는 아래와 같이 사용한다.

 

 

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

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

whiseung.tistory.com

 

 

화면 구성 중 2번 화면을 설명해보겠다.

 

1. 쿠팡 API로 상품 HTML 만드는 화면

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

3. GPT 를 이용해 글을 작성하는 화면

 

 

 

이 화면을 사용하는 이유는

아래와 같이 따로따로 작성된 글들을 합치기 위함이다.

 

 

이런식으로 

상품명 > 설명 > 링크 > 가격

순서대로 정렬이되야 가독성이 좋기 때문이다.

 

 

 

[Merge]라는 별도의 버튼을 빼서 실행해도 되고

html을 생성하고, GPT로 상품정보들을 생성한 뒤

함수를 실행시켜도 된다.

 

createMergeBlogForUi() 라는 함수를 [Merge] 버튼에 할당시켜준다.

function createMergeBlogForUi() {
  const ss = SpreadsheetApp.getActive();
  ss.getRangeByName("merge_1").setValue(createMergeBlog4());
}

 

범위에 이름을 지정해놓았기 때문에

getRangeByName()  메서드를 이용해 범위를 가져온다.

 

 

 

createMergeBlog4() 라는 함수에서는

생성한 html과 상품정보를 GPT에 전달한다.

/**
 * html과 상품설명 merge (gpt-4o)
 */
function createMergeBlog4() {
  const ss = SpreadsheetApp.getActive();

  const html_text = ss.getRangeByName("item_html").getValue();
  const item_text = ss.getRangeByName("item_desc4").getValue();

  const content = `html : ${html_text} 
                   description : ${item_text}`;
  return processAzureOpenAi4(content, "merge");
}

 

 

merge_prompt 라는 함수에 병합용 프롬프트를 선언해주고,

processAzureOpenAi4() 함수에서 이 프롬프트를 사용해 병합을 진행해준다.

/**
 * 텍스트 병합용 프롬프트
 */
const merge_prompt =  `You are an assistant who merges html and description.
- Add product description between the product name and table of the input html.
- The existing html must be maintained.
- Print it as plain text instead of markdown.
`;

/**
 * 글 생성하기 (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}`;
  console.log(gubun)
  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 });
  }

  console.log(allContent);  // 전체 내용을 로그에 출력
  return allContent;  // 전체 답변 반환
}

 

 

 

이건 답변의 길이가 길기떄문에 그냥 실행하면 답변이 짤린다.

 

response 중 finishReason 란느 값을 확인해

다음답변이 더 존재하면 기존답변에 붙여서 전체답변을 완성해준다.

function processAzureOpenAi4(message, gubun) {
// ... 생략 ...

  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 });
  }
  
// ... 생략 ...
}

 

 

가끔  GPT 가 병합을 잘못해서 이미지가 누락되는 경우가 발생한다.

 

그래서 노란음영에 빨간 테두리를 강조해두었고, 한번정도 컨텐츠가 잘 생성되었는지 확인해주는게 좋다.

 

 

나는 귀찮지만 티스토리에 html로 글쓰기 화면에서 잘 작성되었는지 확인하고 진행한다.

 

 

 

 

원래 티스토리에 글을올릴때는 하루에 3개니깐 복사붙여넣기로 진행을 했으나

자동화라는 명분으로  GPT에게 업무를 하달하였다.

 

직접하는거보다 검수만 하는것이고, 잘못생성했을 경우 재지시를 하면되니 나의 업무가 줄어 좋은것 같다.

반응형