텔레그램으로 공탐지수 봇 만들기
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회)
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
golang으로 아침 9시마다 공탐지수를 알려주는 봇을 만들었다. golang 연습겸 써봤는데 패키지나 버전관리가 편한 것 같다
구현 귀찮으면 포크떠서 secret만 넣으면 된다