주식의 주목표를 통지해 주는 LINE Bot

11683 단어 경 6파이썬linebot
【추기】현재 LINE의 무료 테두리로 송신할 수 있는 인원수를 넘어 버리고 있기 때문에, 달의 도중에 통지를 송신할 수 없게 되어 있습니다.

주식에서 자주 사용되는 이동평균선의 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에서 메시지가 보내집니다. 스케줄 자체는 몇 분의 오차가 발생하기 때문에 엄격한 시간 정의가 필요한 프로그램에서는 주의가 필요합니다.

좋은 웹페이지 즐겨찾기