ChatGPT로 텔레그램 챗봇 만들기 -1. 챗봇 코드 작성

오늘은 ChatGPT를 활용해서 텔레그램 챗봇을 만들어보는 과정을 알아보겠습니다.

 

정말 이제 구글 검색을 통하지 않고도, ChatGPT를 통해서 프로그램 만드는건 참 쉬운일이 되었는데요.

 

텔레그램 챗봇 제작하기

프로그램 코드를 하나도 몰라도 간단하게 만들 수 있는데요.

 

제가 사용한 프롬프트는 아래처럼 간단하게 /search 명령어로 네이버 검색을 해주는 챗봇을 제작하였습니다.

 

파이썬으로 /search 검색어 명령어를 입력하면 네이버에서 검색어를 찾아주는 텔레그램 챗봇 코드를 짜줘

 

 

ChatGPT가 짜준 처음 코드입니다. 이 자체도 충분히 좋은 코드이고, 여기에서 몇개만 수정하면 됩니다.

 

import logging
import requests
from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext

# 네이버 API 인증 정보
NAVER_CLIENT_ID = 'YOUR_NAVER_CLIENT_ID'
NAVER_CLIENT_SECRET = 'YOUR_NAVER_CLIENT_SECRET'

# 텔레그램 봇 토큰
TELEGRAM_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'

# 로깅 설정
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

def start(update: Update, context: CallbackContext) -> None:
    update.message.reply_text('안녕하세요! 검색어를 입력하시면 네이버에서 검색해드립니다.')

def search(update: Update, context: CallbackContext) -> None:
    query = ' '.join(context.args)
    if not query:
        update.message.reply_text('검색어를 입력해주세요.')
        return

    headers = {
        'X-Naver-Client-Id': NAVER_CLIENT_ID,
        'X-Naver-Client-Secret': NAVER_CLIENT_SECRET,
    }
    params = {
        'query': query,
        'display': 5,  # 검색 결과를 5개만 표시
    }
    response = requests.get('https://openapi.naver.com/v1/search/webkr.json', headers=headers, params=params)
    result = response.json()

    if 'items' in result:
        message = ''
        for item in result['items']:
            title = item['title'].replace('<b>', '').replace('</b>', '')
            link = item['link']
            message += f'{title}\n{link}\n\n'
        update.message.reply_text(message.strip())
    else:
        update.message.reply_text('검색 결과가 없습니다.')

def main() -> None:
    updater = Updater(TELEGRAM_TOKEN)
    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("search", search))

    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

 

ChatGPT가 기본적인 코드 설명도 해주는데요.

 

생소한 문법이 몇개 있는데요. 

def main() -> None: 이 것은 리턴 값이 없다는 주석을 ->을 통해 입력한 것이라고 합니다. 없애도 되는 코드입니다.

 

 

여기에서 폴링 방식은 사용자가 입력한 입력값을 기다렸다가 처리하는 형태가 되는 것입니다.

텔레그램 봇의 실행 순서를 보시면 아래와 같은데요.

 

사용자가 입력한 값을 업데이터가 가지고 있고, 그것을 큐에 넣어서 디스패처가 각각 명령어를 순차적으로 처리하고, 이 명령어는 핸들러라는 값에서 동작시키게 됩니다. 그리고 최종적으로 핸들러가 사용자에게 아웃풋을 내는 형태입니다.

이 구조를 생각하시고 다시 코드를 보면 좀 더 이해가 쉬울 것 같습니다.

 

단 한 줄의 프롬프트로 이정도의 양질의 코드를 만들 수 있다니 참 신기합니다.

 

그리고 이걸 사용하다 보면

텔레그램의 메시지가 4096자까지만 전송할 수 있기 때문에

 

아래처럼 결과 값의 크기에 따라서 전송시키는 방법을 수정할 필요가 있습니다.

    if len(result) == 0:
        update.message.reply_text("CSV 파일에 '제목', '신문사', '링크' 열이 없습니다.")
    else:
        # 총 행의 수를 포함한 메시지 생성
        row_count = len(df)
        message = f"총 {row_count}개의 행이 있습니다.\n\n{result}"
        
        # 메시지가 너무 길면 4095자까지만 잘라서 전송
        if len(message) > 4095:
            message = message[:4095] + "..."
        update.message.reply_text(message)

 

그리고 텍스트를 강조해서 출력하려면 메시지에서 , parse_mode='MarkdownV2'를 추가해줘야 하는데요.

 

그리고 이때 특수문자 처리가 안되므로, 이스케이프 처리를 해야합니다.

 

 

def escape_markdown_v2(text):
    """
    텔레그램 MarkdownV2에서 특수 문자를 이스케이프 처리
    
    Parameters:
    text (str): 입력 문자열
    
    Returns:
    str: 이스케이프 처리된 문자열
    """
    escape_chars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
    for char in escape_chars:
        text = text.replace(char, f'\\{char}')
    return text

 

여기까지하면 추가되는데요.  그럼 잘 사용하시기 바랍니다.