본문 바로가기

좋아하는것_부자되는매직TV

Golang 과 텔레그램 봇을 활용한 오늘의 한마디 전송 로직 구축기

반응형

블로그 목적 

Golang 과 텔레그램 봇(bot)을 활용한 오늘의 한마디 전송 기능에 대해서 공부및 정리후 나만의 노하우와 지식을 공유한다.

블로그 요약

1. 텔레그램 봇(Bot)를 생성해본다.
2. Golang 으로 오늘의 한마디 api 를 연동해서 텔레그램 봇을 통해 메시지를 전송해본다.  


블로그 상세내용

우선, 텔레그램 봇 생성하기 입니다. 
아래와 같이 텔레그램 검색창에 @BotFather 를 검색해봅니다. 

검색하면요....위와 같이 유사한 bot이 많이 나오는데요...
저는 가장 위에 나오는 @BotFather 를 선택하려고 합니다. 

선택하면, 아래와 같이 나오고요..
맨 하단의 START(시작) 을 클릭합니다. 

시작버튼을 누르시면 아래와 같이 여러가지 명령어를 소개를 받게되고요..

그중에 "메시지를 작성하는 공간에 새로운 bot" 을 생성하겠다라는 의미로 아래 명령어를 입력합니다. 
 - /newbot

/newbot 이라는 명령어를 입력하면요.. 
아래와 같이 메시지가 출력되고요...

간단하게 번역하자면, 새로운 bot의 이름을 정하라는 메시지입니다. 
저는 magic118 을 입력하겠습니다. 
그다음 bot의 이름을 정했으니, "bot"으로 끝나는 이름을 알려달라는 이야기고요..
그래서 저는 magic118Bot 을 입력합니다. 

이제 정상적으로 bot 생성이 완료된건데요....
그리고, HTTP API에 접근할 수 있는 토큰이 생성되었습니다. (참고로, 우리는 추후에 이 토큰을 활용할것이고요..저는 빨간색으로 감추어두었습니다. ㅎㅎ)

그리고 해당 magic118Bot 찾아서  /start 명령을 통해서 활성화 해줍니다. 

여기까지가 텔레그램관련 Bot을 생성하는 방법이고요..(참쉽죠??)

그럼 본격적으로 오늘의 한마디를 어떻게 구해올까? 걱정을 하던중 직접 오늘의 한마디에 대해서 DB 저장하고 불러올까하다가 찾아보니 무료로 오늘의 한마디를 랜덤으로 반환해주는 openapi 가 있더라고요..

해당 사이트에 먼저 들어가보면..아래와 같이 나옵니다. 

아무튼 해당 사이트의 무료 openapi 를 활용해서 오늘의 한마디를 가져오려고 합니다. 
테스트 해보니 아래와 같이 웹페이지에 출력이 되더라고요.

그럼 오늘의 한마디 소스를 얻었겠다..바로 golang 으로 구현을 해봅니다. 
해당 사이트는 영어로 오늘의 한마디로 리턴을 해서,  한국어로 중간에 번역해서 리턴을 하는 코드도 집어 넣었습니다. 

참고로, 번역라이브러리는 gtranslate 를 활용합니다. 
설치도 go get 으로 설치가 참쉽죠?

아래는 전체 소스 고요. 참고로 자신의 텔레그램 토큰과 채널ID 는 넣어셔야 되겠죠?

package main

import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/bregydoc/gtranslate"
	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
)

// 오늘의 명언을 가져오기 위한 API URL
const quoteURL = "https://api.forismatic.com/api/1.0/?method=getQuote&format=json&lang=en"

// 텔레그램 봇 토큰
const telegramBotToken = "{자신의 텔레그램 봇토큰}"

// 텔레그램 채널 ID (봇을 초대한 채널 ID)
const telegramChannelID = {채널ID}

// 오늘의 명언을 나타내는 구조체
type QuoteResponse struct {
	QuoteText   string `json:"quoteText"`
	QuoteAuthor string `json:"quoteAuthor"`
}

// 오늘의 명언을 가져오는 함수
func getQuote() (string, string, error) {
	response, err := http.Get(quoteURL)
	if err != nil {
		return "", "", err
	}
	defer response.Body.Close()

	var quoteResp QuoteResponse
	err = json.NewDecoder(response.Body).Decode(&quoteResp)
	if err != nil {
		return "", "", err
	}

	return quoteResp.QuoteText, quoteResp.QuoteAuthor, nil
}

// 영어를 한글로 번역하는 함수
func translateToKorean(text string) (string, error) {
	translated, err := gtranslate.TranslateWithParams(
		text,
		gtranslate.TranslationParams{
			From: "en",
			To:   "ko",
		},
	)
	if err != nil {
		return "", err
	}
	return translated, nil
}

// 메시지를 텔레그램 채널로 전송하는 함수
func sendToTelegram(message string) error {
	bot, err := tgbotapi.NewBotAPI(telegramBotToken)
	if err != nil {
		return err
	}

	msg := tgbotapi.NewMessage(telegramChannelID, message)
	_, err = bot.Send(msg)
	return err
}

func main() {
	// 오늘의 명언 가져오기
	quote, author, err := getQuote()
	if err != nil {
		fmt.Println("Failed to get today's quote:", err)
		return
	}

	// 영어 명언을 한글로 번역
	translatedQuote, err := translateToKorean(quote)
	if err != nil {
		fmt.Println("Failed to translate quote:", err)
		return
	}

	// 오늘의 명언을 텔레그램 채널로 전송
	message := fmt.Sprintf("오늘의 명언\n\n%s\n\n- %s -", translatedQuote, author)
	err = sendToTelegram(message)
	if err != nil {
		fmt.Println("Failed to send message to Telegram:", err)
		return
	}

	fmt.Println("Quote sent to Telegram successfully!")
}

 

참고로 저는 C++ 서버개발이 본업인데요.. 
예전에 golang 을 잠시 공부하다가 너무 손을 놔버려(?)  리마인드차 요즘 golang 을 이용해서 서버구현을 하고 있습니다. 
얼마전에 미국 백악관에서 C,C++ 쓰지마라고 해서;;  (0.1% 영향을 끼쳤군요..ㅎㅎ)
왠만해서는 rust 와 golang 도 함께 공부해 보려고 합니다. 

그래서 이렇게 오늘도 공부하면서 저만의 방법으로 결과물로 블로그를 남기고 있지요~
C++ 로 코딩하다가 golang 으로 코딩하면서 느낀 생각은 와! 신세계구나 라는 점이죠....
여러모로 C++ 보다는 간단하게 원하고자하는 서버 코드가 구현이 가능하더라고요...
(요즘 신세계다 외치며, 놀라면서 코딩하고 있습니다. ㅎㅎ)

아무튼 그럼 vscode 에서 build 하고 실행을 해보겠습니다. 
go build 하시면 되고요. 바로 실행하면 아래와 같이 텔레그램으로 잘 보냈다고 찍히네요.

그럼 제 텔레그램이 어떻게 되었는지 볼께요~ 
아래와 같이 잘오네요...

이 프로그램을 잘이용하면 여러가지 정보들을 주기적으로 받을 수 있을것 같아보이고요.
여러모로 오늘의 한마디를 좋아하는 저로써는 서버에 크론탭에 걸든가 아니면
따로 golang 로직상으로 특정시간대에 전송하게 구현해 둔다면 매일 새로운 오늘의 한마디로 삶의 인사이트를 얻을 수 있을것 같네요..

엘리어트가 말했군요.. 
서로의 삶을 덜 힘들게 하는 것이 아니라면, 우리는 무엇을 위해 사는가? 

나이가 먹어가면서 요즘 들어 무엇을 위해 사는거지? 라는 고민을 많이 하는데요...
딱맞는 오늘의 한마디가 왔군요..^^;

오늘의 블로그는 여기까지고요
항상 믿고 봐주셔서 감사합니다. 

728x90
300x250