나만의 뉴스봇을! – 모각에서 팀원들과 함께한 메신저봇 제작기

💠 소개

제가 자주 참여하는 카카오톡 오픈채팅방 중, 에듀테크 스터디장님들이 운영하시는 "윤스케어&도로시J의 재미나게 Gemini(GPTers)" 방에서는 항상 ‘솔론봇’이라는 요약 챗봇이 작동하고 있어요. 이 봇이 대화 내용을 깔끔하게 요약해주는 것이 신기하고 유용해서, 언젠가 저도 제 채팅방에 나만의 맞춤 챗봇을 만들고 싶다는 생각을 하게 되었습니다.

그런데 6월 7일 토요일, 16기 마지막 모각 주제가 "메신저봇 실습"이라는 소식을 들었고, 연휴임에도 가족들의 뜨거운 시선을 뚫고(!) 기꺼이 참여하게 되었습니다. 😅 이번 기회에 꼭 저만의 봇을 만들어보리라 다짐했죠.

💠 사전 준비 (Window 사용자 기준)

■ 안드로이드 스튜디오(에뮬레이터) 설치
https://developer.android.com/studio?hl=ko
(스크롤 내리면 하단에 단말기별 다운로드 메뉴 보임)
———
Windows .exe: 설치 마법사로 간편 설치(권장)

한국어 텍스트가있는 웹 사이트의 스크린 샷

■ 노트북 (안드로이드폰)에서 최신 메신저봇 다운로드 하기
https://download.msgbot.app/ (다운로드 후 압축풀지 말고 Android Studio에서 안드로이드 에뮬레이터 실행 후 에뮬레이터 화면에 다운로드 받은 파일을 바로 드래그&드랍 하면 바로 설치됨)

MessengerBot- MessengerBot을 사용하는 방법

■ Android Studio 실행 후 Virtual Device Manger 로 안드로이 에뮬레이터 실행

Adobe Adobe Studio의 스크린 샷

■ 안드로이 에뮬레이터에 최신 메신저봇 설치하기

안드로이 에뮬레이터 실행 후 화면에 다운로드 받아두었던 최신 메신저봇 압축파일을 그대로 드래그&드랍하여 자동 설치합니다. (처음 에뮬레이터 실행 시 로딩이 오래 걸려서 검은색 화면으로 나오니 참을성을 가지고 기다리시기 바랍니다.)

안드로이드 에뮬레이터 - 스크린 샷 1

■ 실습환경 구축 (파이썬 설치 및 가상환경 구축)
* Windows PowerShell 실행 ( 마우스 오른쪽 버튼 눌러서 관리자 권한으로 실행)
- 파이썬 설치: 실습자료 (슬라이드 24~25 참조)
- 가상환경 및 서버 설치: 실습자료 (슬라이드 28 참조)

Fastap 유니콘


■ 예제 코드 main.py 가상환경 폴더에 다운로드 (실습자료 슬라이드 37)
- 공유된 예제 코드에서 하나를 선택해서 main.py를 본인이 만든 가상환경 폴더로 다운로드 또는 복사해서 VScode 와 같은 에디터 툴을 열어서 저장하기( 이때 Window 환경이라면 에디터를 열어서 오류가 있는지 확인하고 저장하기. 맥과 자판이의 형식이 틀려서 인지 오류가 나는 부분이 있어 수정 후 실행. 특히 00_서버 첫 코딩 main.py 파일)

이후 과정은 아래 진행 방법 및 실습자료 참고 바랍니다.


💠 진행 방법

이번 실습에서는 FastAPI로 백엔드 서버를 구축하고, msgbot.app으로 메신저 봇을 실행하여 키워드를 입력하면 관련 최신 뉴스를 3개까지 요약해주는 '뉴스봇'을 만들었습니다. (김현우님이 제공해주신 예제 코드를 사용하였습니다.)

사용한 도구는 다음과 같아요:

  • Android Studio: 안드로이드 기기 관리 및 에뮬레이터 실행

  • msgbot.app: 나만의 메신저봇

  • VScode: 파이썬(FastAPI: main.py) 및 자바스크립트(msgbot: serpAPIbot.js ) 코드 작성 및 수정

  • Windows PowerShell: 파이썬 서버 실행(FastAPI) 및 IP 주소 확인

  • Gemini: 코드 분석, 오류 해결



1단계: 뉴스 검색 API 서버 만들기 (Python & FastAPI)

먼저 뉴스 검색 요청을 처리하고 결과를 반환할 백엔드 서버가 필요했습니다. FastAPI를 이용해 특정 키워드를 받으면 SerpApi로 구글 뉴스를 검색하고, 그 결과를 JSON 형태로 반환하는 간단한 서버를 만들었습니다.

사용한 코드 (main_news.py : 김현우님의 예제 코드 뉴스봇의 main.py 파일이름 수정)

# main_news.py - serpAPI 서버 코드
from fastapi import FastAPI, HTTPException
import requests
import os
from pydantic import BaseModel
import google.generativeai as genai
from dotenv import load_dotenv
import asyncio
from functools import lru_cache
import time
import logging

# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# .env 파일 로드
load_dotenv()

app = FastAPI()

# 환경변수에서 API 키 가져오기
SERPAPI_KEY = os.getenv("SERPAPI_KEY")
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")

💡 사용한 프롬프트 (Gemini에게 질문)

질문1: "내가 현재 다른 main.py로 FastAPI 서버를 실행하고 있는데 위의 main.py를 같은 디렉토리에 넣고 실행시킬 수 있어?"

답변: Gemini는 포트 충돌 문제를 알려주며, uvicorn main:app --port 8001 처럼 다른 포트로 실행하는 방법을 알려주었습니다.

질문2: 그럼 위의 main.py 파일명을 main_news.py로 바꾸고 이걸 python main_news.py를 실행하고 나서 uvicorn 을 실행하면 될까?

답변 :[ uvicorn main_news:app --reload ]로 실행할 수 있다고 알려주었습니다.

2단계: 프로젝트 환경 설정하기

API 키 같은 민감한 정보를 안전하게 관리하고, 프로젝트에 필요한 라이브러리를 명시하기 위해 환경 설정이 필요했습니다.

  • API 키 관리 (.env 파일)
    Gemini의 안내에 따라 SERPAPI_KEY와 GEMINI_API_KEY를 코드에 직접 넣는 대신, .env 파일을 VScode에서 만들어 안전하게 관리했습니다.
    # .env 파일 (VScode 에서 새파일 열어서 복사해서 본인의 실제 사용키 입력)
    SERPAPI_KEY="실제_SerpApi_키"
    GEMINI_API_KEY="실제_Gemini_API_키"

  • 라이브러리 관리 (requirements.txt 파일)
    이 프로젝트에 필요한 라이브러리 목록을 requirements.txt로 정리하여 다른 환경에서도 동일하게 설정할 수 있도록 했습니다.

    💡 사용한 프롬프트 (Gemini에게 질문)

    # requirements.txt
    fastapi==0.104.1
    uvicorn==0.24.0
    google-search-results==2.4.2
    google-generativeai==0.3.1
    python-dotenv==1.0.0
    requests==2.31.0
    ----------------------
    질문: "위와 같이 requirements.txt 가 있는데 이건 뭘 의미하는 거야?"
    
    답변 : Gemini는 우선 이 파일을 설치할 수 있는 명령어를 알려주었습니다.(cmd를 열어서 명렁어 입력 : pip install -r requirements.txt ) 그리고 이 파일이 프로젝트의 '준비물 목록'과 같다고 설명하며, 각 라이브러리의 역할을 하나씩 알려주었습니다. 

3단계: 뉴스봇 만들기 (msgbot & JavaScript)

이제 msgbot에서 "뉴스 [키워드]" 메시지를 감지하고, 위에서 만든 파이썬 서버에 요청을 보낼 봇 스크립트를 작성했습니다.

사용한 코드 (serpAPIbot.js : 김현우님의 제공해주신 뉴스봇 예제 코드)

JavaScript

// serpAPIbot.js - SerpAPI를 통한 뉴스 검색
var bot = BotManager.getCurrentBot();

bot.on("message", function(msg) {
    var content = msg.content.trim();
    var keyword = "";

    // ... (키워드 추출 로직) ...

    // 먼저 처리 중임을 알림
    msg.reply("🔍 뉴스를 검색 중이니 기다려주세요");

    try {
        // 🚨 여기가 가장 중요했던 부분!
        var serverUrl = "http://본인 PC IP:8000";  // 내 PC IP 주소로 수정!
        var url = serverUrl + "/news?keyword=" + encodeURIComponent(keyword);

        var response = org.jsoup.Jsoup.connect(url)
            .ignoreContentType(true)
            .timeout(60000)
            .get().text();

        var data = JSON.parse(response);
        // ... (결과 메시지 포맷팅 및 전송) ...
    } catch (e) {
        msg.reply("⚠️ 서버 연결 중 오류가 발생했습니다: " + e.message);
    }
});

4단계: 봇과 서버 연결 (가장 중요했던 과정!)

가장 큰 난관은 안드로이 에뮬레이터에서 실행되는 뉴스봇이 내 PC에서 실행되는 서버를 찾아가게 만드는 것이었습니다. 이 부분을 김현우님이 설명해 주셔서 집에와서 헤매지 않고 간단하게 Gemini에게 물어보고 해결할 수 있었습니다.

💡 사용한 프롬프트 (Gemini에게 질문)

우선 김현우님이 제공해주신 serpAPIbot.js 를 Gemini 에 복사해서 넣고
질문 : "이게 msgbot에 넣을 내용인데 이걸 그냥 복사해서 넣으면 될까요?" (코드를 넣기 전에 문제 발생부분을 확인하기 위해 질문)

대답 : Gemini는 코드를 검토한 뒤 serverUrl의 IP 주소를 실제 PC의 내부 IP로 변경해야 한다고 알려주었습니다. 그리고 IP를 확인하는 방법까지 친절하게 안내해주었죠.

PowerShell에서 ipconfig 명령어로 내 PC의 IP 주소 확인

💡 사용한 프롬프트 (Gemini에게 질문)

질문 : (위 ipconfig 캡처 이미지를 올리며) 수정할 코드부분 확인

답변 : Gemini는 이미지를 분석해서 제 IP가 17*.3*.1.7*임을 정확히 알려주었고, 자바스크립트 코드를 어떻게 수정해야 하는지, 그리고 파이썬 서버를 켤 때 uvicorn main_news:app --reload --host 0.0.0.0 처럼 --host 0.0.0.0 옵션을 붙여야만 외부 접속이 허용된다는 결정적인 팁까지 주었습니다.

이 과정을 거쳐 제가 좋아하는 손흥민 선수 관련 뉴스를 검색하고 요약까지 해주는 결과를 직접 확인했을 때, 너무 감격스러웠습니다! ⚽🤖

한국 뉴스 봇 - 스크린 샷

💠 결과와 배운 점

혼자였다면 IP 주소 문제에서 막혀 결코 쉽게 도전하지 못했을 뉴스봇 만들기… 하지만 김현우님의 설명을 듣고 스터디 팀원들과 함께하고, Gemini라는 든든한 페어 프로그래머의 도움을 받으며 직접 구동에 성공하고 뉴스봇을 구현해 볼 수 있었습니다.

이번 실습을 통해 배운 점은 다음과 같습니다.

  • Client-Server 구조의 이해: 스마트폰(클라이언트)과 PC(서버)가 어떻게 통신하는지, 내부 IP의 개념과 포트의 역할을 몸으로 체감했습니다.

  • 환경 변수의 중요성: .env 파일을 이용해 API 키를 안전하게 관리하는 방법을 배웠습니다.

  • 명령어 옵션의 힘: --host 0.0.0.0 옵션 하나가 로컬 환경과 네트워크 환경을 가르는 중요한 스위치라는 것을 깨달았습니다.

언제나 모각을 진두지휘하는 닿님, 오늘 모각을 리딩해주신 김현우님, 항상 따뜻하게 챙겨주시는 윤스케어님, 그리고 부족한 부분을 채워주신 에듀테크 팀원분들께 정말 감사드립니다 🙇‍♀️ 이번 실습을 통해 혼자서는 어려운 일도, 함께라면 가능하다는 확신을 다시금 얻었어요. 이런 따뜻한 협업의 순간들이 모여 저를 더 성장하게 만들어 주는 것 같아요. 💛
다음 번에는 예제코드가 아닌 제가 직접(???) 작성한 코드(AI와 함께)로 메신저봇을 만들기에 도전해보려고 하는데 잘 될지는 모르겠네요. ^^.

💠 도움 받은 글 (옵션)

  • 김현우님이 공유해주신 모각 실습 자료 ( 6/7(토) 모각 실습 자료 )

  • Gemini와의 대화를 통한 코드 수정 피드백과 문제 해결 과정 전체

2
2개의 답글

👉 이 게시글도 읽어보세요