AI/생성형AI

[GPT업무자동화](7)GPTs로 실시간 뉴스 보기(Cloudflare Workers)

CodeMasterSong 2025. 5. 8. 19:01
반응형

🌐 NewsAPI + Cloudflare Workers로 GPT 뉴스 요약 시스템 만들기 (한글 번역 포함)

이 글에서는 GPTs에서 실시간 뉴스 요약을 받을 수 있도록 NewsAPI.org와 Cloudflare Workers를 활용한 프록시 서버를 만드는 과정을 안내합니다. 이를 통해 GPT와 외부 뉴스 API를 안정적으로 연동하며, 사용자 요청에 따라 최신 헤드라인을 한글 요약 형태로 반환할 수 있습니다.


✅ 프로젝트 개요

  • 목표: GPTs를 통해 “비즈니스” 또는 “기술” 같은 카테고리를 입력하면 NewsAPI로부터 최신 헤드라인 5개를 받아 한글로 요약된 형태로 반환합니다. NewsAPI에서 제공하는 카테고리 종류를 쉽게 선택할 수 있도록 GPTs 메인 화면에 구성하며 영문으로 사용하거나 한글로 사용해도 NewsAPI 서버 전송에 문제가 없도록 하는 것을 포함합니다.
  • 구성:
    • NewsAPI: 뉴스 데이터 제공
    • Cloudflare Workers: 프록시 서버 역할
    • GPTs: 사용자 질의 및 요약 출력 담당

1. 🔑 NewsAPI 키 발급 및 설정

  1. NewsAPI.org 회원가입: Google 계정 등으로 가입을 쉽게 할 수 있습니다. 
  2. 이메일 등록 후 무료 Developer 키 확인
  3. 발급된 API 키 예시: 6aaacee4321df4ba590a53cac6f1f0430과 같은 형식의 API 키를 발급 받습니다. 

📋 무료 요금제 제한 사항

  • 일일 최대 요청 수: 100회
  • top-headlines, everything 엔드포인트 사용 가능 (실시간 스트리밍은 불가)

⚠️ GPTs 내 Action 스키마로 키를 전달하면 오류가 날 수 있으므로, Cloudflare Workers에 하드코딩하는 방식이 가장 안정적입니다.


2. ⚙️ Cloudflare Workers 설정 및 코드 작성

2-1. 계정 및 프로젝트 생성

  1. Cloudflare 가입
  2. 좌측 메뉴 → Workers & PagesCreate Application 클릭
  3. 템플릿 중 Start with Hello World! 선택
  4. 편집 화면에서 아래 코드로 대체(worker.js 코드로 대체)

d1
d2
lh
lk

  • Deploy 버튼을 클릭하면 오른쪽 상단에 Edit code를 다시 한번 클릭하면 편집 화면을 볼 수 있으며 필요한 코드를 입력합니다.

2-2. worker.js 전체 코드

export default {
  async fetch(request, env, ctx) {
    try {
      const contentType = request.headers.get("Content-Type") || "";
      if (!contentType.includes("application/json")) {
        return new Response(JSON.stringify({
          articles: [],
          error: "Invalid Content-Type. application/json expected."
        }), {
          status: 400,
          headers: { "Content-Type": "application/json" }
        });
      }

      const raw = await request.text();
      let reqBody;
      try {
        reqBody = JSON.parse(raw);
      } catch {
        return new Response(JSON.stringify({
          articles: [],
          error: "Invalid JSON format."
        }), {
          status: 400,
          headers: { "Content-Type": "application/json" }
        });
      }

      const category = reqBody.category || 'general';
      const apiKey = 'NewsAPI Your Key';

      const url = `https://newsapi.org/v2/top-headlines?category=${encodeURIComponent(category)}&country=us&pageSize=5&apiKey=${apiKey}`;
      const res = await fetch(url, {
        headers: {
          'User-Agent': 'GPTNewsBot/1.0',
          'Content-Type': 'application/json'
        }
      });
      const news = await res.json();

      if (!news.articles || !Array.isArray(news.articles)) {
        return new Response(JSON.stringify({
          articles: [],
          error: "NewsAPI 응답에서 articles 항목이 누락되었습니다."
        }), {
          status: 200,
          headers: { 'Content-Type': 'application/json' }
        });
      }

      const articles = news.articles.map(a => ({
        title: a.title,
        description: a.description,
        source: a.source.name
      }));

      return new Response(JSON.stringify({ articles, fetchedAt: new Date().toISOString() }), {
        headers: { 'Content-Type': 'application/json' }
      });
    } catch (err) {
      return new Response(JSON.stringify({
        articles: [],
        error: err.message
      }), {
        status: 500,
        headers: { 'Content-Type': 'application/json' }
      });
    }
  }
};

2-3. 배포 및 테스트

  • Deploy 클릭 → 예: https://small-sunset-33ff.username.workers.dev 형식을 제공합니다. 
  • Postman에서 다음 JSON으로 테스트를 진행하면 서버 연동의 문제점이 있는지 체크 가능합니다. 
{
  "category": "technology"
}

3. 🤖 GPTs에 연동하기 (요약 프롬프트)

3-1. GPTs  구성하기

  • GPTs의 이름, 설명, 대화 스타터 등을 꾸밉니다.
  • GPTs의 지침 용으로 System Prompt에 아래처럼 입력합니다. (예시이므로 원하는 형태로 변경 가능합니다.)
당신은 “실시간 뉴스 알리미”입니다.
사용자가 “technology” 혹은 “business” 등 카테고리를 입력하면,
NewsAPI.org에서 최신 헤드라인 5개를 읽어와
제목·요약·출처를 표 형태로 반환하세요.

입력: business
출력:
| № | 제목                        | 출처       |
|---|-----------------------------|------------|
| 1 | "AI 혁신, 새로운 장 열리다" | TechDaily  |
| 2 | …                           | …          |

3-2. GPTs  Action Schema 작성

{
  "openapi": "3.1.0",
  "info": {
    "title": "뉴스 프록시",
    "version": "1.0.0"
  },
  "servers": [
    { "url": "https://small-sunset-3f89.yourname.workers.dev/" }
  ],
  "paths": {
    "/": {
      "post": {
        "operationId": "getNews",
        "summary": "카테고리별 뉴스",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "category": { "type": "string" },                  
                },
                "required": ["category"]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "뉴스 결과"
          }
        }
      }
    }
  }
}

3-2. 테스트

  • NewsAPI에서 원하는 카테고리의 최신 뉴스를 가져오는지 확인합니다.
  • Postman을 통해 URL과 통신을 확인할 수 있습니다.(선택)
  • GPTs 미리보기 또는 만들어진 Apps을 통해 카테고리 입력을 합니다. 

[Postman에서 서버 연동 확인 결과]

ll

 

[GPTs에서 서버 연동 확인]

ss

 

 

 

💡 캐싱 방지를 위해 worker.js 응답에 fetchedAt 타임스탬프를 추가합니다. 

 

⚠️ 오류 방지 팁 및 FAQ

  • Postman에서는 되는데 GPTs에서 안 되는 경우: GPTs 캐싱 or timeout 문제일 수 있음
  • 데모 키로 간주되는 경우: GPTs가 apiKey를 전달하지 못했을 수 있음 → Worker에서 하드코딩이 안전
  • 영문 카테고리만 허용됨: "business", "technology", "health" 등으로만 지원되므로 한글 사용부분 추가되어야 함.
  • API 일일 제한 초과: NewsAPI 대시보드에서 사용량 확인 가능함.

여기까지 이제 GPTs를 통해 사용자가 카테고리를 입력하면 Cloudflare Workers가 NewsAPI에 연결해 최신 뉴스 5개를 가져오고, 이를 요약한 형태로 출력할 수 있는 시스템이 완성되었습니다. GPT 자동화, 외부 API 연동, 한글 요약 등 다양한 GPT 프로젝트에 이 구조를 이해하는 일은 본 주제에서 사용한 뉴스에 국한된 것은 아니므로 외부 API 자원 연동에 대한 의미와 필요한 절차들이 이해될 수 있도록 반복해서 만들어 보길 바랍니다. 

반응형