주식의 주목표를 통지해 주는 LINE Bot
주식에서 자주 사용되는 이동평균선의 75일과 200일의 이동평균선이 골든 크로스한 종목을 LINE으로 통지해주는 BOT을 만들었습니다.
어째서 「75일」과「200일」인가는 note 쪽으로 기재하고 있으므로 좋으면 봐 주세요.
여기에서는 어떻게 구현했는지 써 갑니다. 소스 코드는 GitHub 으로 공개하고 있습니다.
다른 쪽과의 차이는, Bot측으로부터의 메세지 송신 기능에 짜고 있으므로 소스 코드가 매우 간단하게 되어 있습니다.
하고 싶었던 일
골든 크로스한 유명 상표는 주식 기술 에서 공개됩니다.
주식 시장의 영업일은 매일 갱신됩니다만, 보러 가는 것을 그만 잊어 버리므로 자동으로 통지해 주는 Bot가 있으면 편리하다고 생각했습니다.
흐름은
1. 주식 기술 을 스크래핑하여 취득한다.
2. LINE에서 메시지를 보냅니다.
입니다.
방치하고 운용하고 싶었기 때문에, Heroku로 움직이기로 했습니다.
소스 코드
코드는 파이썬으로 구현되었습니다.
크게 "스크래핑"과 "LINE에서 메시지 전송"으로 나뉘어 있습니다.
스크래핑은 주식시장은 토일요일축이 휴업일이므로 그 판정을 넣고 있습니다.
import os
import datetime
import re
from bs4 import BeautifulSoup
import jpholiday
from linebot import LineBotApi
from linebot.exceptions import LineBotApiError
from linebot.models import TextSendMessage
import requests
KABUTEC_GC_URL = "https://www.kabutec.jp/contents/compare/com.php?col1=8&scol1=0&col2=26&scol2=0&col3=27&scol3=0&market=0"
def get_today_list():
"""
株テクからGC銘柄を取得する。
"""
res = requests.get(KABUTEC_GC_URL)
soup = BeautifulSoup(res.text, "html.parser")
li = soup.find_all(href=re.compile("kabutec.jp/company/fs_"))
company_list = list(map(lambda item: item.contents[0], li))
return company_list
def get_weekday():
"""
平日の判定を行う。
Returns
-------
ret : boolean
True : 平日
False : 休日
"""
dt_jst = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
if dt_jst.weekday() == 5 or dt_jst.weekday() == 6:
ret = False
else:
if jpholiday.is_holiday(dt_jst.date()):
ret = False
else:
ret = True
return ret
if __name__ == "__main__":
if get_weekday():
li = get_today_list()
line_bot_api = LineBotApi(os.environ["LINE_CHANNEL_ACCESS_TOKEN"])
msg = "本日のGC銘柄は{num}銘柄です。\n{li}".format(num=len(li), li="\n".join(li))
print(msg)
messages = TextSendMessage(text=msg)
try:
line_bot_api.broadcast(messages=messages)
except LineBotApiError:
pass
else:
print("今日は休みです。")
LINE Bot 부분은 LINE의 Messaging API를 사용하여 매우 간단하게 쓸 수있었습니다.
LINE Developers 로부터 「채널 액세스 토큰(장기)」을 취득해, 환경 변수로서 「LINE_CHANNEL_ACCESS_TOKEN」을 설정해 주세요.
다른 사람은 LINE에서 보낸 메시지를 받기 위해 Flask를 사용하고 있습니다만, Bot 측에서 보내는 것만이면 Flask도 불필요합니다.
Bot과 친구가 된 모든 사용자에게 일제히 보내기 위해
line_bot_api.broadcast
를 사용하고 있습니다. line_bot_api = LineBotApi(os.environ["LINE_CHANNEL_ACCESS_TOKEN"])
msg = "本日のGC銘柄は{num}銘柄です。\n{li}".format(num=len(li), li="\n".join(li))
print(msg)
messages = TextSendMessage(text=msg)
try:
line_bot_api.broadcast(messages=messages)
except LineBotApiError:
pass
broadcast를 사용하는 경우에는 전송 메시지 수에 주의해야 합니다.
LINE API 자체는 무료로 사용할 수 있습니다만, 무료로 송신할 수 있는 메시지수가 1000통/월까지입니다.
주식시장이 월 20일 영업한다고 생각하면 봇 친구가 50명을 넘으면 월말에 보낼 수 없게 됩니다.
운영 운영은 Heroku에서 수행됩니다. 이번과 같이 매일 정해진 시간에 동작하는 Bot이면 Heroku에서 필요한 설정은 2개뿐입니다. 환경 변수 설정 스케줄러 설정 환경 변수 설정 Heroku의 설정에서 Config Vars에 LINE_CHANNEL_ACCESS_TOKEN을 설정하십시오. 채널 액세스 토큰은 LINE Developers 의 「채널 액세스 토큰(장기)」으로 취득할 수 있습니다.
스케줄러 설정
Installed add-ons에서 Heroku Scheduler를 추가합니다.
Heroku Scheduler 자체는 무료로 사용할 수 있지만 신용 카드 등록이 필요합니다.
예를 들어, 이번 프로그램이라면
python main.py
라는 명령을 스케줄 등록하면 원하는 시간에 움직임 Bot에서 메시지가 보내집니다. 스케줄 자체는 몇 분의 오차가 발생하기 때문에 엄격한 시간 정의가 필요한 프로그램에서는 주의가 필요합니다.Reference
이 문제에 관하여(주식의 주목표를 통지해 주는 LINE Bot), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/marc0468/items/9a99dc748c3395a2d703텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)