데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Golang과 텔레그램 봇(bot)을 활용한 전송 기능 개발기

      매직 24.03.20
      5,246 4 0
      DEVOTEE 요약
      블로그에서는 텔레그램 봇 생성과 Golang을 이용한 '오늘의 한마디' 전송 기능에 대해 설명한다. 이를 위해 먼저 텔레그램에서 @BotFather를 찾아 봇을 생성하고, 무료로 제공되는 오늘의 한마디를 랜덤으로 반환하는 openapi를 Golang으로 연동한다. 이렇게 연동한 '오늘의 한마디'를 가져와 텔레그램 채널로 전송하는 코드를 작성하면, 이 봇을 통해 매일 새로운 '오늘의 한마디'를 받을 수 있다.
      DEVOTEE 추천 블로그

      블로그 목적

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


      블로그 요약

      1. 텔레그램 봇(Bot)를 생성해본다.

      2. Golang 을 사용해서 오늘의 한마디 openapi 를 연동하고 텔레그램 봇을 통해 메시지를 전송해본다.


      블로그 상세내용

      우선, 텔레그램 봇 부터 생성해 볼께요~


      아래와 같이 텔레그램 검색창에 @BotFather 를 검색해봅니다. 


      검색하면요....


      위와 같이 유사한 bot이 많이 나오는데요...

      저는 가장 위에 나오는 @BotFather 를 선택해서 진행하도록 할께요~


      선택하면, 아래와 같이 나오고요..

      맨 하단의 START(시작) 을 클릭합니다. 



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

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

       - /newbot



      /newbot 이라는 명령어를 입력하면요.. 

      아래와 같이 메시지가 출력되고요...



      간단하게 번역하자면, 새로운 bot의 이름을 정하라는 메시지입니다.


      저는 magic118 을 입력하겠습니다. 

      그다음 bot의 이름을 정했으니, "bot"으로 끝나는 이름을 알려달라는 이야기고요..

      그래서 저는 magic118Bot 을 입력합니다.


      이제 정상적으로 bot 생성이 완료된건데요....


      그리고, HTTP API에 접근할 수 있는 토큰이 생성되었습니다.

      (참고로, 우리는 추후에 이 토큰을 활용할것이고요..저는 빨간색으로 감추어두었습니다. ㅎㅎ)


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


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

      이제부터는 해당 텔레그램 Bot 으로 많은 일들을 할 수 있는데요....


      그럼 본격적으로 오늘의 한마디 전송 기능을 위해서 가장 중요한 "오늘의 한마디" 을 매일 어떻게 구해올까? 가 고민인데요...


      이런저런 걱정을 하던중 직접 오늘의 한마디에 대해서 DB 에 저장하고 랜덤으로 불러올까하다가

      찾아보니 이미 무료로 오늘의 한마디를 랜덤으로 반환해주는 openapi 가 있더라고요..


      바로 아래 openapi 입니다.



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


      한번 방문에 보셔도 좋을것 같고요..


      아무튼 저는 해당 사이트의 무료 openapi 를 활용해서 오늘의 한마디를 가져오려고 합니다.


      우선 사전작업으로 브라우저를 통해서 테스트 해보니 아래와 같이 웹페이지에 출력이 되더라고요.


      그럼 오늘의 한마디 소스를 얻었겠다.

      바로 golang 으로 구현을 해봅니다.


      또한 해당 사이트의 특징은 한국어가 아니라 영어로 오늘의 한마디로 리턴을 해서, 

      반환된 영어로된 "오늘의 한마디" 를 한국어로 중간에 번역해서 한국어로 리턴을 하는 코드도 집어 넣었습니다.


      참고로, 번역라이브러리는 아래와 같이 gtranslate 를 활용합니다.


      설치도 go get 으로 설치가 참쉽죠?


      아래는 전체 소스 고요.


      참고로 저의 텔레그램 토큰과 채널ID 를 통해서 해당 "오늘의 한마디" 가 발송됩니다.


      토큰은 위의 과정으로 얻을 수 있었고요...채널ID는 예전에 python 프로그램으로 짜둔 코드가 있어서, 아래와 같이 얻을 수 있습니다.

      image.png

      그럼 아래와 같이 golang 으로 코딩하고요.

      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!")
      }

      go build 후 실행하시면 되는데요...


      참고로 저는 C++ 서버개발이 본업입니다.

      예전에 golang 을 잠시 공부하다가 너무 손을 놔버려(?)  리마인드차 요즘 golang 을 이용해서 서버구현을 하고 있습니다. 

      얼마전에 미국 백악관에서 C,C++ 쓰지마라고 해서;;  (제가 golang 을 다시 공부하게된것에 2% 영향을 끼쳤군요..ㅎㅎ)

      왠만해서는 이번 기회(?) 를 살려서 rust 와 golang 도 함께 공부해 보려고 합니다.


      그래서 이렇게 오늘도 공부하면서 저만의 방법으로 결과물로 블로그를 남기고 있지요~

      기존에 주로 C++ 로 코딩하다가 golang 으로 코딩하면서 느낀 생각은 와! 신세계구나 라는 점이죠....

      여러모로 C++ 보다는 간단하게 원하고자하는 서버 코드가 구현이 가능하더라고요...

      (요즘 신세계다 외치며, 놀라면서 코딩하고 있습니다. ㅎㅎ)


      아무튼 그럼 vscode 에서 go build 하고 실행을 해보겠습니다. 

      아래와 같이 go build 하시면 되고요. 바로 실행하면 텔레그램으로 잘 보냈다고 찍히네요.


      그럼 제 텔레그램이 어떻게 되었는지 볼께요~ 

      아래와 같이 해당 프로그램이 실행될때마다 잘오네요...



      맺음말

      간단하게 저만의 생각을 정리해보자면요.


      이 golang 프로그램을 잘이용하면 여러가지 정보들을 텔레그램 메시지로 주기적으로 받을 수 있을것 같아보이고요.

      여러모로 오늘의 한마디를 좋아하는 저로써는 서버에 크론탭에 걸든가 아니면

      따로 golang 로직상으로 특정시간대에 전송하게 구현해 둔다면 매일 새로운 오늘의 한마디로 삶의 인사이트를 얻을 수 있을것 같네요..


      그런데....위의 "오늘의 한마디" 를 유심히 보니깐..엘리어트가 말했군요.. 

      "서로의 삶을 덜 힘들게 하는 것이 아니라면, 우리는 무엇을 위해 사는가? "


      나이가 먹어가면서 요즘 들어 무엇을 위해 사는거지? 라는 고민을 많이 하는데요...

      딱맞는 오늘의 한마디가 왔군요..^^;


      오늘의 블로그는 여기까지고요

      항상 믿고 봐주셔서 감사합니다.


      그럼 오늘하루도 건강하시고 행복한 하루되세요~


      나의 목표 및 다짐을 항상 내곁에 두기

      • 목표

        • 나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.

        • 현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기

        • 나는 블로그 생태계에서 IT 테크관련 파워블로거가 반드시 된다!

        • 유튜브 시장(?)을 호령하는 100만 유튜버가 반드시 된다!! (feat. 100만 유튜버가 반드시 될 매직!!)

        • 나는 꾸준히 공부하고 공부한것을 실천하는 창의적인 개발자가 된다.! (feat. devocean 개발&운영자가될 매직!!)

      • 목표를 이루기 위한 실천방안

        • 꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.

        • 천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.

          • "천번 생각하는것보다 한번 행동하는 것이 더 중요하다."

        • 기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)

          • 천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.

        • 모든 실수에는 마술이 숨어 있다. 따라서 나는 실수하면 실수할수록, 그런 실수에서 더 많이 배울수록 삶에서 더 많은 마술을 갖는다.


      Advertising ...

      조금이나마 제 글이 도움이 되셨다면, 아래 배너 링크를 통해서 네이버인플루언서 팬이되주시면 제가 컨텐츠를 생산(?)하는데 큰 도움이 될것 같습니다. ^^;


      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      매직 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기