텔레그램으로 공탐지수 봇 만들기

종이비행기 날리는 로봇

BotFather(https://t.me/botfather)를 이용해 텔레그램 봇을 쉽게 만들 수 있다.

공탐지수를 매일 메시지로 보내주는 봇을 만들어보자

BotFather 친구추가 및 봇 추가

만드는건 쉬우니 넘어간다. HTTP API 토큰은 유출되면 안되니 조심하자.

bot api는 https://core.telegram.org/bots/api 여기서 확인할 수 있고, 이중에서 sendMessage를 이용해보자

# 기본 형식
https://api.telegram.org/{bot 토큰}/{메소드 명}

telegram bot api는 GET, POST를 모두 지원하고, 파라미터는

  • URL query string
  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data (파일 업로드용)

형식을 모두 지원한다

# 메시지 전송
https://api.telegram.org/{bot 토큰}/sendMessage

메시지 전송 메소드는 sendMessage고 필수 파라미터는 chat_id, text다

Rapidapi

http api로 메시지를 보낼 수 있는 건 확인했으니 외부 API를 연동하고, github actions로 트리거를 해보자

공포탐욕 지수는 CNN에서 발표하며 https://edition.cnn.com/markets/fear-and-greed 이 페이지에서 확인할 수 있다.

스크래퍼를 직접 구현해도 되지만, API 장터인 Rapidapi를 써보자. 공탐지수 api는 무료다 (rate limit은 분당 30회)

Fear and greed index API Documentation (rpi4gx) | RapidAPI
Index calculated by https://money.cnn.com/data/fear-and-greed/ ![](https://tip.ep-proxy.net/t/ra-fgi)

API 명세는 위 페이지에서 확인하면 되고, 각 언어별 Code snippet도 제공한다

package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {
	url := "https://fear-and-greed-index.p.rapidapi.com/v1/fgi"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-RapidAPI-Key", "내 API 키")
	req.Header.Add("X-RapidAPI-Host", "fear-and-greed-index.p.rapidapi.com")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))
}

예시 코드는 이렇고, response를 받아서 telegram api를 적절히 호출하면 된다

{
  "fgi": {
    "now": {
      "value": 0,
      "valueText": ""
    },
    "previousClose": {
      "value": 0,
      "valueText": ""
    },
    "oneWeekAgo": {
      "value": 0,
      "valueText": ""
    },
    "oneMonthAgo": {
      "value": 0,
      "valueText": ""
    },
    "oneYearAgo": {
      "value": 0,
      "valueText": ""
    }
  },
  "lastUpdated": {
    "epochUnixSeconds": 0,
    "humanDate": ""
  }
}

Response 형식은 위와 같다. fgi 안에 공탐지수 값이 지금, 직전, 일주일 전 등으로 들어있다.

GitHub Actions

이제 외부 api 연동도 했으니 트리거를 주기적으로 해보자. github actions에서 cron으로 주기적으로 트리거를 할 수 있다.

name: Check and send message

on:
  schedule:
    - cron: '0 0 * * *'

  workflow_dispatch:

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v4
        with:
          go-version: '1.20'
      - run: go run .
        env:
          TELEGRAM_APITOKEN: ${{ secrets.TELEGRAM_APITOKEN }}
          CHATID: ${{ secrets.CHATID }}
          RAPIDAPI_KEY: ${{ secrets.RAPIDAPI_KEY }}

예를 들면 go로 짠 경우엔 위처럼 github actions 워크플로를 만들 수 있다. 각종 키들은 secret에 넣어서 사용한다

telegram chatId는 공개되도 되는지 아닌지 몰라서 일단 넣었다

⚠️

주의: 각종 API 키는 절대 github에 올리면 안된다. git에 커밋도 하면 안되며, 푸시까지 해버렸다면 API 키를 전부 Revoke를 해야 한다

완성 예) fear-and-greed-notifier

GitHub - sh-cho/fear-and-greed-notifier: Deliver fear and greed index by BBC, at 9am KST
Deliver fear and greed index by BBC, at 9am KST. Contribute to sh-cho/fear-and-greed-notifier development by creating an account on GitHub.

golang으로 아침 9시마다 공탐지수를 알려주는 봇을 만들었다. golang 연습겸 써봤는데 패키지나 버전관리가 편한 것 같다

구현 귀찮으면 포크떠서 secret만 넣으면 된다