Post List

2019년 9월 6일 금요일

AWS를 이용한 투자 자동화 구축하기! (3) 스케쥴러를 이용한 텔레그램 자동 전송





'R을 이용한 퀀트 투자 포트폴리오 만들기'가 출간 되었습니다.
많은 관심 부탁드리겠습니다.

↓↓ 구매링크 ↓↓




먼저 텔레그램의 채널을 생성합니다. BotFather 계정을 검색한 후 /start를 입력합니다. 그 후 /newbot 을 입력하여 새로운 봇을 만들고, bot 이름과 username을 입력합니다. username의 경우 항상 ’bot’으로 끝나야 합니다.




Use this token to access the HTTP API 메세지 아래에 생성한 봇의 API Key가 출력됩니다. 만일 해당 값을 잊어버렸을 시 BotFather 계정에서 /mybots → API Token을 선택하여 찾을 수 있습니다.

get id 계정을 검색한 후 /start를 입력하면 Chat ID를 확인할 수 있습니다.



마지막으로 본인이 만든 채팅방을 검색한 후 [시작] 버튼을 눌러줍니다.



이제 R에서 텔레그램에 메세지를 전송하도록 합니다. 웹 브라우저에 서버주소(DNS:8787)를 입력하여 R Studio를 실행하며, 인스턴스 변경 과정에서 퍼블릭 DNS가 변경된 점을 고려해야 합니다. 그 후 위에서 발급받은 API Token과 Chat ID를 입력하여 다음 코드를 실행합니다.


library(telegram.bot)

bot = Bot(token = 'API Token')
chat_id = 'Chat ID'

bot$sendMessage(chat_id = chat_id, text = 'Hello World')

  1. root 계정을 통해 telegram.bot 패키지를 미리 설치해 두었으므로 패키지를 실행할 수 있습니다.
  2. Bot() 함수에 API Token 값을 입력합니다.
  3. chat_id에 본인의 Chat ID를 입력합니다.
  4. bot$sendMessage() 함수의 text 인자에 본인이 전송하고자 하는 내용을 입력합니다.

채팅방을 확인해보면 text 인자에 입력한 값이 전송되어 있습니다.



이번에는 네이버 금융 속보 제목을 크롤링 한 후 가장 최근 뉴스의 제목을 텔레그램에 전송하도록 하겠습니다. 세부사항은 웹북을 참조하시기 바랍니다.



library(rvest)
library(httr)
library(telegram.bot)

bot = Bot(token = 'API Token')
chat_id = 'Chat ID'

url = paste0('https://finance.naver.com/news/news_list.nhn?',
             'mode=LSS2D&section_id=101&section_id2=258')
data = GET(url)

top_title = data %>%
  read_html(encoding = 'EUC-KR') %>%
  html_nodes('dl') %>%
  html_nodes('.articleSubject') %>%
  html_nodes('a') %>%
  html_attr('title') %>%
  head(1)

bot$sendMessage(chat_id = chat_id, text = top_title)



스케쥴러를 이용하면 코드를 특정 시간마다 자동으로 실행할 수 있으며, 텔레그램에 자동으로 전송할 수도 있습니다. 먼저 위 코드를 ‘send_title.R’ 파일로 저장합니다.




윈도우에서는 taskscheduleR 패키지를 통해 스케쥴링 작업을 수행한 반면 Unix/Linux에서는 cronR 패키지를 이용해 해당 작업을 수행할 수 있습니다.

윈도우에서는 taskscheduleR 패키지를 통해 스케쥴링 작업을 수행한 반면 Unix/Linux에서는 cronR 패키지를 이용해 해당 작업을 수행할 수 있습니다.
cronR 패키지의 cron_add() 함수를 이용해 스케쥴링 작업을 추가할 수도 있지만 R Studio add-in을 이용할 경우 훨씬 쉽게 작업을 추가할 수 있습니다. R Studio add-in을 실행하기 위한 miniUI, shiny, shinyFiles 패키지를 미리 설치해 두어야 실행이 가능합니다.
add-in을 실행하기 위해 [Tools] → [Addinds] → [Browse Addins]를 선택한 후 [cronR]을 선택합니다. 혹은 cronR::cron_rstudioaddin() 함수를 통해 실행할 수 있습니다.



  1. [Select file]을 선택하여 자동으로 실행하고자 하는 R 스크립트를 선택합니다.
  2. 시작 일자인 Launch date와 시작 시간인 Launch hour를 각각 입력합니다.
  3. 원하는 스케쥴링 간격을 선택합니다. 매 분마다 크롤링 결과를 전송하기 위해 [Every MINUTE]을 선택합니다.
  4. Job identifier에서 스케쥴러 이름을 입력합니다.
  5. R 스크립트 파일 및 로그 파일이 저장될 폴더를 선택합니다.
  6. 하단의 [Create Job]을 눌러 스케쥴러를 생성합니다.
  7. 상단의 Done을 누릅니다.
이 외에도 ASIS cron schedule 부분에 다양한 표현식을 입력하여 복잡한 형태(예: 매월 5일과 20일에 8시부터 10시 까지 30분 간격으로 수행)의 스케쥴러도 생성할 수 있으며, 간단한 형태의 표현식은 cronmaker 웹사이트에서 클릭을 통해 생성할 수 있습니다.



네이버 금융 속보 중 가장 최근 제목을 텔레그램에 전송하는 스크립트(send_title.R)가 매분 실행되도록 스케쥴러를 입력하였으므로, 텔레그램에는 매분 해당 결과가 전송됩니다. 이러한 스케쥴링이 로컬 PC가 아닌 AWS 가상 서버에 등록되어 있으므로 로컬 PC가 종료된 상태에서도 작업은 계속해서 실행됩니다.



cronR 패키지의 주요 함수는 다음과 같습니다. 만일 위에서 실행한 스케쥴링 작업(send_title)을 중지하고자 할 경우 cron_rm(id = 'send_title')을 입력합니다.

함수 내용
cron_add() 스케쥴러 추가
cron_ls() 스케쥴 목록 확인
cron_rm() 특정 스케쥴(id) 삭제
cron_clear() 모든 스케쥴 삭제


이처럼 가상 서버에서 cronR 패키지를 이용해 스케쥴링 작업을 실행하면, 로컬 PC가 꺼진 상태에서도 24시간 쉬지않고 크롤링 결과를 텔레그램으로 전송할 수 있습니다.


관심종목의 DART 공시내역 전송은 아래 글을 참조하시기 바랍니다.

댓글 2개:

  1. 안녕하세요 글보고 텔레그램 메시지 보내는 것까진 따라했는데, 크론작업이 작동을 안하네요..ㅠ
    일단 miniUI, shiny 패키지가 설치되지 않고, cron_add()는 cron_add(command=cmd,frequency = 'minutely',id='test',description = 'test')이런 식으로 입력했는데도 매분 메시지 전달이 안되고 있습니다. 혹시 어떻게 해결하면 좋을까요?..

    답글삭제
    답글
    1. 헉 해결됐네요!! 미리 저장해놓는 R스크립트에 토큰이랑 chat_id를 고유값으로 적어놓으니 정상작동됩니다!! 귀중한 정보 공유해주셔서 정말 감사드려요 ㅠㅠ

      삭제