티스토리 뷰

 텔레그램 봇을 만들자

사용자에게 메세지를 푸시해 줄 수 있고 API를 쉽게 사용할 수 있는 텔레그램을 택했다.

https://telegram.me/botfather

 

BotFather

BotFather is the one bot to rule them all. Use it to create new bot accounts and manage your existing bots.

telegram.me

우선 갓파더 말론 브란도 닮은 봇파더로 들어가 텔레그램으로 봇을 만든다.

그럼 Bot Token을 발급해 주는데, 이 토큰으로 봇을 요리볶고 조리볶고 할 수 있다.

일반적인 봇 처럼 대화형식으로 만들려면 여기에 친절하게 설명되어 있다.

하지만 대화하는 봇이 아닌 단순 알리미 봇이기에 조금 다른 방법으로 접근해야 했다.

 

https://api.telegram.org/bot + (봇 토큰)/sendMessage?chat_id=(채팅아이디)&text=(보낼 텍스트)

이런 식으로 포스트맨 혹은 URL 창에 입력해주면 지정된 채팅아이디로 보낼 텍스트가 보내진다.

그럼 채팅 아이디를 얻어야하는데, 

https://api.telegram.org/bot111:AACC(봇 토큰)/getUpdates 를 통해 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    "ok"true,
    "result": [
        {
            "update_id"000000000,
            "message": {
                "message_id"000,
                "from": {
                    "id"0000000000,
                    "is_bot"false,
                    "first_name""name",
                    "last_name""Lee",
                    "language_code""ko"
                },
                "chat": {
                    "id": 0000000000,
                    "first_name""name",
                    "last_name""Lee",
                    "type""private"
                },
                "date": 0000000000,
                "text""ㅇ"
            }
        }
    ]
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

해당 봇으로 채팅을 한 번 입력하면 이렇게 방금 채팅한 사람의 정보를 얻을 수 있는데, 여기서 chat id를 가져온다.

이제 모든 준비는 끝났으니 텔레그램 메세지를 보내는 클래스를 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.springframework.stereotype.Component;
 
 
@Component
public class TelegramMsgUtil {
 
    @Value("${bot.token}")
    private String botToken;
 
    @Value("${bot.chatId}")
    private String botChatId;
 
    String message = "떴다!!! 예매하러 가자ㅏㅏㅏㅏㅏㅏㅏㅏㅏ";
 
    public void sendMsg() throws Exception  {
        HttpClient client = HttpClients.custom().build();
 
        UriBuilder builder = UriBuilder
                .fromUri("https://api.telegram.org/")
                .path("bot" + botToken)
                .path("/sendMessage")
                .queryParam("chat_id", botChatId)
                .queryParam("text", message);
        
        client.execute(new HttpGet(builder.build()));
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

나는 resource/application.properties에 token과 chat id를 저장해서 받아왔다.

(처음엔 형상관리 할 때 보안상의 이유로 따로 관리하기 위한 목적으로다가 하지만 git private으로 돌려서 무의미...)

이전에 HttpURLConnection을 이용해 API를 송신 테스트를 해본 적이 있다. (이전글)

그 때 이렇게 즐비하게 쓸게 아니라 아예 유틸을 만들어서 사용하면 어떨까... 만들어서 메이븐에 올려볼까?

생각도 했었는데, 역시나 선배 개발자들은 미리 다 개발을 해놓았다.

우선 메이븐 레파지토리 사이트에서 httpClients 의존성을 추가해주고 UriBuilder로 송신할 URI를 만든다.

(JAVA 8 API Docs - UriBuilder)

httpClients.execute로 만든 URI를 호출하면 끝!

 

스케줄링을 하자
1
2
3
4
5
@Service
public class TheaterService {
 
    @PostConstruct
    public void getMovieListAtCineNForet() {

이전 작업에서 테스트 용도로 @PostConstruct를 사용했었다.

이젠 서버가 올라갈 때 한번 돌릴게 필요한게 아니라, 주기적으로 돌려야한다.

1
2
3
4
5
@Service
public class TheaterService {
 
   @Scheduled(cron="0 0/15 07-23 * * *")
    public void getMovieListAtCineNForet() {

@Sceduled과 cron 표현식을 활용해 스케줄링 작업을 시켜준다.

0 : 0초마다

0/15 : 0분부터 15분마다 (그냥 15분마다)

07-23 : 7시부터 23시까지 (어차피 잘 때 예매 알림 울린다한들 예매 못할거니깐!!!)

* : 매일 매달 매년

1
2
3
4
5
6
    //떴으면 알림
    if(line.contains("info-movie")) {
        System.out.println("Give Me The Alert!!!");
        telegramMsgUtil.sendMsg();
        break;
      }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

그리고 이전 소스에 영화가 뜬 부분에, 방금 만든 텔레그램 유틸을 넣어주면 끝!

(@Autowired로 유틸 클래스를 의존성 주입해서 사용)

댓글