AI

n8n 카카오톡으로 매일 영어신문 학습 콘텐츠 수집 자동화

cloudlim 2025. 10. 7. 18:26

노드 구성 및 설명

- Schedule Trigger: 트리거 노드이다. 매일 특정 시간에 해당 Work flow가 실행되도록 한다.

- RSS Read: 영어 신문을 수집하는 노드다. 해당 프로젝트에서는 The Guardian의 RSS 주소를 기반으로 영어 신문을 수집하도록 하였다.

- Limit: RSS로 영어 신문을 불러오면 너무 많은 기사를 불러온다. 본인이 했을 때는 115개의 Item, 그러니깐 115개의 기사를 불러왔다. 이 Item 개수를 제한하는 노드이다. 이번 프로젝트에서는 3개로 제한했다.

- Message a model: 수집된 기사를 학습용 콘텐츠로 변환하는 노드이다. 이번 프로젝트에서는 Gemini-2.0-flash 모델을 사용했다. 해당 모델을 사용한 이유는 무료이기 때문이다.

- Code in Javascript: Message a model 노드에서 작업한 결과 JSON 문자열 하나가 출력된다. 근데 나는 해당 문자열에서 Content와 URL를 분리하고 싶었다. 그래서 하나의 문자열 내에서 Content와 URL을 파싱하는 노드를 하나 추가했다. 

- HTTP Request: 위에 작업된 결과를 카카오톡으로 발송하는 노드이다.

 

 

Schedule Trigger

하루에 한번 발송하는 걸로 설정했다.

해당 노드에서는 시간대도 설정할 수 있는데, 중요한 점이 아마 컨테이너 이미지 다운로드할 때 그냥 다운로드 받았으면, 미국 뉴욕 시간대로 설정될 것이다. 

n8n Docs > Integrations > Built-in nodes > Core nodes > Schedule Trigger에서 Timezone settings에 대한 설명

서울 시간대로 할려면, 컨테이너 이미지를 다운로드할 때 환경변수로 설정이 필요하다.

- 도커 데스트탑으로 n8n 컨테이너 다운로드 시 설정하는 방법은 Environment variables에서 GENERIC_TMIEZONE으로 Asia/Seoul를 입력하는 것이다. (참고)

- 파워쉘로 다운로드할 때도 마찬가지이다. (참고)

docker run --rm `
  --name 이미지 이름 `
  -p 5678:5678 `
  -v 파일 경로:/home/node/.n8n `
  -e WEBHOOK_URL=<n8n URL> `
  -e GENERIC_TIMEZONE=Asia/Seoul `
  n8nio/n8n:latest

 

RSS Read

신문사의 RSS 주소를 가져와서 붙여넣으면 된다.

The Guardian이라는 신문사를 선택한 이유는 바로 이 RSS 주소를 찾을 수 있었기 때문에 해당 신문사로 정했다. (BBC는 안됐음)

RSS 주소를 볼 수 있는 크롬 확장 프로그램 https://chromewebstore.google.com/detail/get-rss-feed-url/kfghpdldaipanmkhfpdcjglncmilendn

 

Get RSS Feed URL - Chrome 웹 스토어

Retreive RSS feeds URLs from Website

chromewebstore.google.com

 

 

Message a model

Limit 노드는 간단하니깐 건너뛰고.

가장 중요한 노드 중 하나다.

프롬프트를 작성하는데 여기서 Role을 설정할 수 있다.

Role이 User일 경우의 Prompt는 모델에게 직접적으로 요청하는 Prompt이다.

Role이 Model일 경우의 Prompt는 모델이 사용자에게 응답하는 메시지라고 한다.

Options로 가보면 System Message를 추가할 수 있다. 여기서는 배경, 역할, 지침 등을 설정한다. 그니깐 User에서 명령문을 작성하는데 System Message 따라 작성해달라고 하면 AI가 여기에 작성된 내용을 기반으로 결과를 출력한다.

나는 System Message를 아래와 같이 작성했다.

You are an **expert ESL Instructor** tasked with analyzing an English news article and extracting key learning elements for Korean students. Given the full content of one RSS feed item, generate a **high-quality, self-study educational material**.

[INPUT]
The full content of one RSS feed item, including article text, title, and URL.

[TASK INSTRUCTIONS]
1. **Role Confirmation:** You are an **expert ESL Instructor**.
2. **Summarize the Article** summarize the article's core information. Be factful and clear. **No hallucinations**
3. **Extract Key Sentences (3):** Identify the 3 most important sentences that summarize the article's core information. Be factful and clear. **No hallucinations**
4. **Extract Key Vocabulary (3):** Select the **3 most essential and reusable vocabulary words/phrases** for an ESL learner. Provide concise Korean definitions (한글 뜻). Be factful and clear. **No hallucinations**
5. **Character Limit:** The **VISIBLE text content** within the 'Text' field (i.e., the Article Title, all English sentences, all Korean translations, all Vocabulary, and all Korean definitions) **must not exceed 200 characters** (including spaces). **Exclude all Markdown formatting characters** (`#`, `*`, `-`, `\n`) from this character count. **Exclude all JSON formatting characters** ('{', '}','"Text"') from this character count. The 'URL' field content does not count toward this limit.
6. **Output Format:** Output the extracted content **ONLY** in the following JSON structure. The educational material must be strictly within the "Text" field. **The entire output must be wrapped in a JSON markdown code block.**

[OUTPUT FORMAT (JSON, wrapped in ```json ... ```)]
```json
{
   "Text": "[Article Title]\n\n Summary: [Summary]\n\n- S1: [Sentence 1]. (Translation 1)\n- S2: [Sentence 2]. (Translation 2)\n- S3: [Sentence 3]. (Translation 3)\n\n- V1: [Vocab 1] (한글 뜻 1)\n- V2: [Vocab 2] (한글 뜻 2)\n- V3: [Vocab 3] (한글 뜻 3)",
   "URL": "[Extracted Article URL]"
}

 

*200자로 글자수 제한하는 정책을 두었다. 이유는 카카오톡 메시지 API 정책 중 내용의 길이가 200자까지만이기 때문이다.

kakao developers > 문서 > 메시지 템플릿 > 기본 템플릿 > 텍스트 템플릿

 

그리고 User 역할의 Prompt는 다음과 같이 작성했다.

아래는 The Guardian에서 가져온 기사 내용입니다.

title: {{ $json.title }}
pubDate: {{ $json.pubDate }}
link: {{ $json.link }}
content: {{ $json.content}}

위 기사를 읽고, **System Message**에 따라 작성해 주세요.

 

 

Code in Javascript

Message a model 노드에서는 JSON 형식으로 반환하는데 처리 결과는 Text라는 하나의 문자열로 반환한다. 근데 나는 기사의 URL은 따로 HTTP Request 노드에서 사용하고 싶었고, 그래서 문자열에서 Content와 URL을 분리하기 위해 해당 노드를 추가했다. Set Node는 JSON 형식의 문자열 파싱 기능을 제공하지 않기 때문에 Code in Javascript 노드로 추가했다.

추가로, Limit 노드에서 Item을 3개로 설정했고, 따라서 Message a model에서도 Model에게 요청이 총 3번 간다. 그 결과 출력 Item도 3개로 유지된다. 따라서 해당 노드에서 Mode는 Run Once for Each Item으로 하여 각 Item에게 해당 코드를 따르도록 하였다.

// AI 모델의 출력 문자열을 가져옵니다.
const resultString = $json.candidates[0].content.parts[0].text;

// 1. 문자열에서 JSON 코드 블록 마크다운을 제거합니다.
let jsonString = resultString.trim();

if (jsonString.startsWith('```json\n')) {
    jsonString = jsonString.substring('```json\n'.length);
}
if (jsonString.endsWith('\n```')) {
    jsonString = jsonString.substring(0, jsonString.length - '\n```'.length);
}
jsonString = jsonString.trim();

let parsedJson;
try {
    // 2. 정리된 JSON 문자열을 JavaScript 객체로 파싱합니다.
    parsedJson = JSON.parse(jsonString);
} catch (error) {
    console.error("Critical JSON Parsing Error (Code Block Cleaned):", error);
    // 파싱 오류 발생 시 오류 메시지를 담아 반환합니다.
    // 이 경우에도 단일 객체 반환 규칙을 지킵니다.
    return { json: { Text: "Error: JSON Parsing Failed", URL: "N/A" } }; 
}

// 3. 파싱된 객체에서 'Text'와 'URL' 필드만 추출하여 다음 노드로 전달합니다.
const output = {
    Text: parsedJson.Text,
    URL: parsedJson.URL
};

// 4. 다음 노드로 전달합니다. (Run Once for each item 모드에 맞게 단일 객체 반환)
return {
    json: output
};

 

 

HTTP Request

위 노드들에서 작업한 결과를 카카오톡으로 발송하는 노드이다. Header Parameter와 Body Parameter는 카카오톡 디벨로퍼스에서 제공하는 양식을 따라 작성하면 된다. 왠만한 내용은 유튜버 시민개발자 구씨의 영상(카톡으로 자동화 가능?! n8n으로 카카오톡 연동 방법 공개)을 따라가면 된다. (최고의 Hands-on 영상이다 👍) 근데 버튼 커스터마이징을 원한다면 알아둬야 하는게 있다. 바로 플랫폼 등록할 때 URL이다. 앱 > 일반에서 플랫폼 > Web URL을 등록할 수 있는데, 이게 왜 중요하냐? 이거 등록 안해두면 HTTP Request로 button URL을 정상적으로 보내줘도 카카오톡에서는 해당 URL로 바로가기가 안된다. 결국 도메인을 카카오톡 디벨로퍼스의 앱 설정에서 등록해 놔야지 카카오톡 메신저 안에서 해당 URL로 보내준다는 것이다.

kakao developers > 문서 > 메시지 템플릿 > 기본 템플릿 > Link
이 URL이 카카오톡 디벨로퍼스 앱 설정에 등록되어 있어야 한다.
카카오톡 디벨로퍼스 > 앱 > 일반 여기에 등록되어 있어야 한다.

 

 

카카오톡 수신 결과

- 스케줄에 따른 메시지 정상 수신: 확인

- 메시지 내용: 확인

- 메시지 개수: 3개

- 메시지 버튼: 확인

- 메시지 버튼 클릭 시 리다이렉트 URL: 해당 기사로 이동 확인