LoginSignup
19
20

More than 5 years have passed since last update.

【Python】LINE Notifyで株価速報botを作る #1 ~アカウント連携&手動通知編~

Last updated at Posted at 2018-12-21

株価速報、利確ライン、損切りラインをLINEで通知してくれるbotがあればいいな~と思い、LINE Notifyを使って開発した記録。

1.【Python】LINE Notifyで株価速報botを作る #1 ~アカウント連携&手動通知編~
2.【Python】LINEで株価速報bot#2 ~Herokuを使って自動通知編~
スクリーンショット (147).png
スクリーンショット (148).png
スクリーンショット (150).png
LINE Notify 公式サイト

やったこと

プログラムを実行すると、ソフトバンクグループとヤフーのリアルタイム株価を自分のLINEアカウントに通知してくれるbotの作成。
スクリーンショット (146).png

開発環境

言語: Python 3.6.5
フレームワーク: Jupyter Notebook
OS: Windows 10
ブラウザ: Google Chrome

サンプルコード

import requests
import urllib.request as urlreq
from bs4 import BeautifulSoup

def main():    
    url = "https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=9984&TEMPLATE=nomura_tp_kabu_01&MKTN=T&LINK=&SHEET=&ROW="
    r = urlreq.Request(url)
    with urlreq.urlopen(r) as r:
        r = r.read()
    soup = BeautifulSoup(r, "html.parser")
    spans = soup.find_all("span")
    for tag in spans:
        try:
            string_ =tag.get("class").pop(0)
            if string_ in "stock_summary-number":
                softbankgr_stock = tag.text
                break
        except:
            pass

    url1 = "https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=4689&TEMPLATE=nomura_tp_kabu_01&MKTN=T&LINK=&SHEET=&ROW="
    r1 = urlreq.Request(url1)
    with urlreq.urlopen(r1) as r1:
        r1 = r1.read()
    soup = BeautifulSoup(r1, "html.parser")
    spans = soup.find_all("span")
    for tag in spans:
        try:
            string_ =tag.get("class").pop(0)
            if string_ in "stock_summary-number":
                yahoo_stock = tag.text
                break
        except:
            pass

    print(softbankgr_stock)
    print(yahoo_stock)    
    message = '\r\n' + 'ソフトバンクグループの株価は' + str(softbankgr_stock) + '\r\n' + 'ヤフーの株価は' + str(yahoo_stock)

    url2 = "https://notify-api.line.me/api/notify"
    token = "#発行したアクセストークンをここに入れる"
    headers = {"Authorization" : "Bearer "+ token}
    payload = {"message" :  message}

    r2 = requests.post(url2 ,headers = headers ,data=payload)

if __name__ == '__main__':
    main()

LINE Notifyとアカウント連携

今回はLINEに株価速報を通知するために、簡単にLINEアカウントにメッセージを送れるAPIである、 LINE Notifyを使用する。
アカウント連携の方法は、以下リンクのパーソナルアクセストークンを発行するを参考にしてください。
コマンドラインから LINE にメッセージを送れる LINE Notify
以下のように自分のLINEアカウントとLINE Notifyが連携できたら、準備完了。画像はアカウント情報を隠してます。各々自分のLINEアカウントと連携してください。連携が完了すると、アクセストークンが発行されるので必ずメモしておいてください。後で使用します。
スクリーンショット (141).png

必要なライブラリのインポート

import requests
import urllib.request as urlreq
from bs4 import BeautifulSoup

requests・・・urlを開くためのライブラリ。株価をスクレイピングで取得する際に使用。
urllib.request・・・urlを開くためのライブラリ。株価をスクレイピングで取得する際に使用。
BeautifulSoup・・・Beautiful Soupは、HTMLやXMLのファイルからデータを抽出(スクレイピング)するためのPythonライブラリ。

株価をスクレイピングして取得

def main():    
    url = "https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=9984&TEMPLATE=nomura_tp_kabu_01&MKTN=T&LINK=&SHEET=&ROW="
    #野村証券の株価掲載サイトを指定
    r = urlreq.Request(url)
    #リンクを取得
    with urlreq.urlopen(r) as r:
        r = r.read()
    #リンクを開き読み込む
    soup = BeautifulSoup(r, "html.parser")
    # Webページのソースコードをパース
    spans = soup.find_all("span")
    # spanのついたクラスをすべて取得
    for tag in spans:
        try:
            string_ =tag.get("class").pop(0)
            if string_ in "stock_summary-number":
                softbankgr_stock = tag.text
                break
        #ソフトバンクグループの株価データが格納されているタグを見つける
        except:
            pass
        #データが見つからない場合は何もしない

    #以下ヤフーの株価も同様
    url1 = "https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=4689&TEMPLATE=nomura_tp_kabu_01&MKTN=T&LINK=&SHEET=&ROW="
    r1 = urlreq.Request(url1)
    with urlreq.urlopen(r1) as r1:
        r1 = r1.read()
    soup = BeautifulSoup(r1, "html.parser")
    spans = soup.find_all("span")
    for tag in spans:
        try:
            string_ =tag.get("class").pop(0)
            if string_ in "stock_summary-number":
                yahoo_stock = tag.text
                break
        except:
            pass

    #デバッグ用に株価を表示
    print(softbankgr_stock)
    print(yahoo_stock)

今回は例としてソフトバンクグループとヤフーの株価を取得していく。野村証券の銘柄詳細(ソフトバンクグループ) 、野村証券の銘柄詳細(ヤフー) からスクレイピングで取得する。

取得した株価をLINEのメッセージ形式にして送信

    message = '\r\n' + 'ソフトバンクグループの株価は' + str(softbankgr_stock) + '\r\n' + 'ヤフーの株価は' + str(yahoo_stock)
    #LINEで送信するメッセージを作成

    url2 = "https://notify-api.line.me/api/notify"
    #LINE Notify APIのURLを取得
    token = "#発行したアクセストークンをここに入れる"
    #自分のLINEアカウントのアクセストークンを取得
    headers = {"Authorization" : "Bearer "+ token}
    #リクエストヘッダの指定
    payload = {"message" :  message}
    #メッセージデータの格納
    r2 = requests.post(url2 ,headers = headers ,data=payload)
    #メッセージの送信

LINEアカウントに送信するメッセージは[株価速報]とタイトルをつけてわかりやすくしている。アクセストークンの指定は、先ほどメモしてもらったアクセストークンを入れてください。メモし忘れた場合は、もう一度アカウント連携をやり直してください。

実行

if __name__ == '__main__':
    main()
#main関数の実行

リアルタイム(プログラムの実行時)の株価を取得できる。取得する株価の銘柄を変更したい場合は、スクレイピング先のURLを変更してください。

雑感

・現状は逐一プログラムを実行しないと株価が取得できない。
・一時間ごとにLINEで通知するなどの機能が欲しい。
・株価が暴落・急騰などしたらアラートを送信する機能も欲しい。
・LINEが便利なAPIを公開してくれているので、LINEとの連携は簡単だった。

参考文献

野村証券銘柄検索
Python, Beautiful Soupでスクレイピング、Yahooのヘッドライン抽出
urllib.request --- URL を開くための拡張可能なライブラリ
Python, Requestsの使い方
コマンドラインから LINE にメッセージを送れる LINE Notify
Google Apps ScriptからLINE NotifyでLINEにメッセージを送る
PythonからLINE NotifyでLINEにメッセージを送る
BeautifulSoupを使って、ブログ記事の情報をいろいろ絞り込んでみた
HTMLからタグを抽出!BeautifulSoupによるWebスクレイピング入門【Python】
【超便利&お手軽】Python + LINE NotifyでLINEメッセージ送信

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20