파이썬과 OpenAI API로 텔레그램 봇 개발하기

in SCT.암호화폐.Cryptolast year (edited)

소개

텔레그램은 전 세계적으로 많은 사용자들이 이용하는 메신저 앱 중 하나입니다. 파이썬을 이용하여 텔레그램 봇을 개발하면, 간단한 챗봇부터 복잡한 봇까지 다양한 형태의 봇을 만들 수 있습니다. 이번 글에서는 파이썬으로 텔레그램 봇 개발을 시작하는 방법에 대해 알아보도록 하겠습니다!

텔레그램 봇 API 토큰 발급받기

텔레그램 봇을 만들기 위해서는 봇 API 토큰이 필요합니다. 이를 위해서는 먼저 텔레그램 봇을 만들어야 합니다. 텔레그램 봇을 만들기 위해서는 먼저 텔레그램 앱에서 @BotFather 라는 봇을 검색하여 대화를 시작합니다.

그리고 /newbot 명령어를 입력하여 새로운 봇을 만듭니다. 이후 일련의 안내가 주어져 봇을 설정하는 과정을 진행하게 됩니다.

다음 단계에서는 봇의 이름을 입력합니다. 봇 이름은 한글로 입력할 수 있습니다.

다음으로 봇 아이디를 입력합니다. 봇 아이디는 영문으로 작성되며, 반드시 "bot"으로 끝나야 합니다. 예를 들어, "TetrisBot" 또는 "tetris_bot"과 같습니다. 또한, 기존에 있는 봇과 이름이 겹치지 않도록 주의해야 합니다.

봇 이름이 결정되면 API 토큰이 발급됩니다. 이 API 토큰은 봇과 텔레그램 서버 간의 인증을 위해 필요합니다.

봇 API에 대한 자세한 설명은 https://core.telegram.org/bots/api 페이지를 참조하실 수 있습니다. 해당 페이지에서는 텔레그램 봇 API에 대한 모든 정보를 확인하실 수 있습니다. 페이지 내에서는 API에 대한 설명 뿐만 아니라, 사용 가능한 기능들에 대한 예제 코드도 자세히 안내하고 있습니다. 또한, API를 사용하는 데 필요한 요건들과 주의사항도 알려주고 있으니, 봇 개발에 필수적인 정보를 모두 확인하시기 바랍니다.

텔레그램 봇 이미지 변경하기

이미지를 변경하려면 /setuserpic 명령어를 사용합니다. 이 명령어는 새로운 이미지를 업로드하고 봇 프로필 사진을 변경하는 데 사용됩니다. 또한, 새로운 이미지를 선택할 때는 이미지의 크기, 해상도, 파일 형식 등을 고려해야 하며, 이미지 크기가 너무 크면 업로드가 실패할 수 있습니다. 따라서, 이미지를 선택할 때는 사이즈가 적당한 이미지를 선택하는 것이 좋습니다.

telegram 파이썬 패키지 설치하기

python-telegram-bot 라이브러리를 설치해야합니다. 이 라이브러리는 텔레그램 봇 API를 직접 사용할 수 있도록 도와줍니다.

파이썬에서 라이브러리를 설치하는 방법은 여러 가지가 있지만, 가장 간단한 방법은 pip를 이용하는 것입니다. 아래와 같은 명령어를 입력하여 python-telegram-bot 라이브러리를 설치할 수 있습니다.

pip install python-telegram-bot --upgrade

위 명령어를 실행하면, python-telegram-bot 라이브러리가 설치됩니다. 이제 파이썬에서 텔레그램 봇을 만들 준비가 되었습니다.

파이썬으로 텔레그램 봇 만들기

API 토큰을 발급받았다면, 이제 파이썬으로 텔레그램 봇을 만들어보겠습니다.
python-telegram-bot 라이브러리를 사용하여 텔레그램 만드는 예제 코드는 아래 링크에서 볼 수 있습니다.

https://docs.python-telegram-bot.org/en/stable/examples.html

텔레그램 에코 봇 만들기

이것은 아마도 파이썬 텔레그램 봇으로 만들어진 대부분의 봇의 기반이 될 것입니다. 이 봇은 각 문자 메시지에 동일한 텍스트가 포함된 메시지로 간단히 답장합니다.

먼저, 몇 가지 핸들러 함수를 정의합니다. 그런 다음, 해당 함수를 애플리케이션에 전달하고 각각의 위치에 등록합니다. 그런 다음, 봇이 시작되고 명령줄에서 Ctrl-C를 누를 때까지 실행됩니다.

이제 봇으로부터 메시지를 받아서 처리하는 코드를 작성해보겠습니다.

import os
import logging
from telegram import ForceReply, Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, MessageHandler, filters

# 몇 가지 명령 핸들러를 정의합니다. 일반적으로 업데이트와 컨텍스트의 두 인수를 받습니다.
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """/start 명령이 실행되면 메시지를 보냅니다."""
    user = update.effective_user
    await update.message.reply_html(
        rf"Hi {user.mention_html()}!",
        reply_markup=ForceReply(selective=True),
    )

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """도움말 명령이 실행되면 메시지를 보냅니다."""
    await update.message.reply_text("Help!")

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """사용자 메시지를 에코합니다."""
    await update.message.reply_text(update.message.text)

# 애플리케이션을 생성하고 봇의 토큰을 전달합니다.
app = ApplicationBuilder().token(os.environ.get("TELEGRAM_BOT_TOKEN")).build()

# 다른 명령에 대해 - 텔레그램으로 답변하기
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))

# 텔레그램에서 메시지를 에코합니다.
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

# 사용자가 Ctrl-C를 누를 때까지 봇을 실행합니다.
app.run_polling()

위 코드는 간단한 echo 봇을 만드는 코드입니다. 봇이 메시지를 받으면, 받은 메시지를 그대로 다시 보내는 기능을 수행합니다.

OpenAI API로 AI와 대화하는 봇 만들기

OpenAI API를 사용하여 텔레그램 봇을 더욱 강화할 수 있습니다. 예를 들어, OpenAI API를 사용하면 봇이 사용자의 언어에 맞게 대화를 전개할 수 있습니다. 또한, OpenAI API를 사용하면 봇이 사용자의 의도를 파악하고, 그에 맞는 답변을 제공할 수 있습니다. 이를 통해 봇 사용자들이 보다 편리하고 빠르게 원하는 정보를 얻을 수 있게 됩니다. 또한, OpenAI API를 사용하면 텍스트 생성, 요약, 번역 등 다양한 자연어 처리 작업을 수행할 수 있습니다. 이러한 작업들은 봇의 기능을 확장할 수 있게 해주며, 봇 사용자의 만족도를 높여줄 수 있습니다. 따라서, OpenAI API를 활용하여 더욱 다양하고 효율적인 텔레그램 봇을 개발할 수 있습니다.

파이썬 패키지 openai 설치하기

OpenAI API를 사용하기 위해서는 openai 파이썬 패키지를 설치해야 합니다. 이 패키지는 OpenAI API와 상호 작용하기 위한 도구를 제공합니다. 아래 명령어를 입력하여 openai 패키지를 설치할 수 있습니다.

pip install openai --upgrade

OpenAI API를 사용하여 응답하기

OpenAI API는 API 키를 발급받아 사용할 수 있으며, openai 파이썬 패키지를 사용하여 API와 상호 작용할 수 있습니다. 예를 들어, openai.Completion.create() 함수를 사용하여 텍스트를 생성하거나, openai.Classification.create() 함수를 사용하여 텍스트를 분류할 수 있습니다.

이전에 작성한 echo 함수를 아래와 같이 수정합니다.

import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

# ... 코드 생략 ...

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """사용자 메시지에 대답합니다."""
    prompt = f"""다음은 AI 어시스턴트와의 대화입니다. 
어시스턴트는 도움이 되고, 창의적이며, 영리하고, 매우 친절합니다.

Human: 안녕하세요, 누구세요?
AI: 저는 OpenAI에서 만든 인공지능입니다. 오늘은 무엇을 도와드릴까요?
Human: {update.message.text} 
"""
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0.9,
        max_tokens=150,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0.6,
        stop=[f" Human:", " AI:"]
    )
    choices_text = response.choices[0].text.replace("AI: ", "")
    await update.message.reply_text(choices_text)

이전 대화 내용 기억해서 대화 이어가기

이전 대화 내용을 기억하고 다음 대화에서 활용하는 기능을 추가할 수 있습니다. 이를 위해서는 데이터베이스를 사용하여 이전 대화 내용을 저장하고, 새로운 대화에서 해당 내용을 불러와 활용해야 합니다. 이를 통해 봇과 사용자 간의 대화가 더욱 자연스러워지고, 봇의 인공지능 기능이 더욱 발전할 수 있습니다.

하지만, 데이터베이스를 사용하지 않고 대화 내용을 메모리에 간단하게 저장하여 구현해보겠습니다.

# 사용자 대화 내용을 저장하는 딕셔너리를 선언합니다.
history = dict()

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """사용자 메시지에 대답합니다."""
    user_id = update.message.from_user.id
    user_message = update.message.text

    # 이전 대화 내용을 가져옵니다.
    chat_history = '\n'.join(history[user_id]) if user_id in history else ''

    prompt = f"""다음은 AI 어시스턴트와의 대화입니다. 
어시스턴트는 도움이 되고, 창의적이며, 영리하고, 매우 친절합니다.

Human: 안녕하세요, 누구세요?
AI: 저는 OpenAI에서 만든 인공지능입니다. 오늘은 무엇을 도와드릴까요?
{chat_history}
Human: {user_message} 
"""

    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0.9,
        max_tokens=150,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0.6,
        stop=[f" Human:", " AI:"]
    )
    choices_text = response.choices[0].text.replace("AI: ", "")

    # 히스토리에 대화 내용 저장
    history[user_id] = (history[user_id] if user_id in history else [])[-9:] + [f'Human: {user_message}', f'AI: {choices_text}']

    await update.message.reply_text(choices_text)

history라는 딕셔너리를 초기화하여 다른 사용자와의 이전 대화를 저장합니다. 그런 다음 사용자로부터 들어오는 메시지에서 사용자 ID와 텍스트를 추출하여 user_iduser_message 변수에 담습니다.

그런 다음, 사용자 ID가 history 딕셔너리에 존재하는지 확인하고 존재하는 경우 채팅 히스토리를 가져옵니다. 그리고 채팅 히스토리는 개행 문자로 구분된 문자열로 변환하여 chat_history 변수에 담습니다.

프롬프트와 함께 chat_history 내용을 포함하여 OpenAI API에 요청합니다. 이렇게 함으로써 챗봇의 응답은 사용자의 이전 메시지를 기반으로 생성되며, 도움이 되고 친근하게 느껴지도록 설계되었습니다. 채팅 기록은 저장되어 보다 개인화되고 상황에 맞는 응답을 제공할 수 있습니다.

OpenAI API로 이미지 생성 봇 만들기

커맨드 핸들러를 정의하여 봇의 기능을 더욱 확장할 수 있습니다. 예를 들어, OpenAI API를 사용하여 이미지를 생성하는 기능을 추가할 수 있습니다. 이를 통해 사용자들은 봇을 통해 다양한 이미지를 생성할 수 있게 됩니다.

generate_image 이미지 생성 핸들러 함수를 작성한 후, 텔레그램 봇에 /image 커맨드를 추가합니다.

# 이미지 생성 커맨드 핸들러 함수를 정의합니다.
def generate_image(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    print(update)
    response = openai.Image.create(
        prompt=update.message.text,
        n=1,
        size="512x512"
    )
    image_url = response['data'][0]['url']
    await update.message.reply_photo(image_url)

# `/image` 커맨드를 추가합니다.
app.add_handler(CommandHandler("image", generate_image))

하지만 이미지 생성 API는 한글 요청을 이해하지 못합니다. 따라서, 한글을 영어로 번역한 후 요청해야 합니다.

API는 한글 요청에 대해 아래와 같이 엉뚱한 사진을 생성합니다.

영어로 번역하여 이미지 생성 요청하기

이미지 생성에는 한글을 처리하지 못하므로, 사용자의 입력을 영어로 번역해야 합니다. 이를 위해 translate 파이썬 패키지를 설치합니다.

pip install translate 

translate 패키지에서 Translator를 import하고, Translator 객체를 초기화합니다. 그 후, generate_image 함수를 아래와 같이 수정합니다.

from translate import Translator

translator = Translator(from_lang='ko', to_lang='en')

# ... 생략 ...

async def generate_image(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    # print(update)
    translated_message = translator.translate(update.message.text)
    response = openai.Image.create(
        prompt=translated_message,
        n=1,
        size="512x512"
    )
    image_url = response['data'][0]['url']
    await update.message.reply_photo(image_url)

이제 한글로 요청하면 영어로 번역되어 OpenAI API에서 원하는 이미지를 생성할 수 있게 되었습니다.

마무리

이번 글에서는 파이썬으로 텔레그램 봇을 개발하는 방법에 대해서 알아보았습니다. 텔레그램 봇은 간단한 챗봇부터 다양한 형태의 봇을 만들 수 있으며, 파이썬으로 쉽게 개발할 수 있습니다. 앞으로 더욱 다양한 기능을 추가한 텔레그램 봇을 만들어보세요!


이 글이 마음에 드셨다면 투표리블로그를 눌러 저의 글을 더 많은 분들과 공유해주세요. 그리고 이와 같은 콘텐츠를 더 보고 싶으시다면 @anpigon팔로우해주세요.

읽어주셔서 감사합니다!


티스토리에서 작성하였습니다.
원본 글: https://anpigon.tistory.com/257

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

좋은 정보 감사합니다.

천만에요! 언제든지 더 필요하신 정보가 있으면 말씀해주세요. 😊

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 62893.52
ETH 3354.14
USDT 1.00
SBD 2.47