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

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

1.【Python】LINE Notifyで株価速報botを作る #1 ～アカウント連携＆手動通知編～
2.[【Python】LINEで株価速報bot#2 ～Herokuを使って自動通知編～](https://qiita.com/japanesebonobo/items/6a1e4aa2f7d94dc1c959)
![スクリーンショット (147).png](https://qiita-image-store.s3.amazonaws.com/0/296645/487be5a4-d93b-9266-fbae-1c6a10223a49.png)
![スクリーンショット (148).png](https://qiita-image-store.s3.amazonaws.com/0/296645/efc455c5-8b5d-5076-d669-e325f3ac6605.png)
![スクリーンショット (150).png](https://qiita-image-store.s3.amazonaws.com/0/296645/da9a891c-f5d3-028f-366d-0e15b1d681f5.png)
[LINE Notify 公式サイト](https://notify-bot.line.me/ja/)
#やったこと
プログラムを実行すると、ソフトバンクグループとヤフーのリアルタイム株価を自分のLINEアカウントに通知してくれるbotの作成。
![スクリーンショット (146).png](https://qiita-image-store.s3.amazonaws.com/0/296645/e81fc194-c1f6-4ec0-b3b5-900142b5f096.png)

#開発環境
言語: Python 3.6.5
フレームワーク: Jupyter Notebook
OS: Windows 10
ブラウザ: Google Chrome
#サンプルコード
```py
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](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line/)
以下のように自分のLINEアカウントとLINE Notifyが連携できたら、準備完了。画像はアカウント情報を隠してます。各々自分のLINEアカウントと連携してください。連携が完了すると、**アクセストークンが発行されるので必ずメモしておいてください。**後で使用します。
![スクリーンショット (141).png](https://qiita-image-store.s3.amazonaws.com/0/296645/2ff8f5f3-fbcc-3ae3-a230-b6367a7a502e.png)
#必要なライブラリのインポート
```py
import requests
import urllib.request as urlreq
from bs4 import BeautifulSoup
```
・**requests**・・・urlを開くためのライブラリ。株価をスクレイピングで取得する際に使用。
・**urllib.request**・・・urlを開くためのライブラリ。株価をスクレイピングで取得する際に使用。
・**BeautifulSoup**・・・Beautiful Soupは、HTMLやXMLのファイルからデータを抽出（スクレイピング）するためのPythonライブラリ。
#株価をスクレイピングして取得
```py
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)
```
今回は例としてソフトバンクグループとヤフーの株価を取得していく。[野村証券の銘柄詳細(ソフトバンクグループ)](https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=9984&TEMPLATE=nomura_tp_kabu_01&MKTN=T&LINK=&SHEET=&ROW=)　、[野村証券の銘柄詳細(ヤフー)](https://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?TEMPLATE=nomura_tp_kabu_01&QCODE=4689&MKTN=T) からスクレイピングで取得する。
#取得した株価をLINEのメッセージ形式にして送信
```py    
    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アカウントに送信するメッセージは**[株価速報]**とタイトルをつけてわかりやすくしている。アクセストークンの指定は、**先ほどメモしてもらったアクセストークンを入れてください**。メモし忘れた場合は、もう一度アカウント連携をやり直してください。
#実行
```py
if __name__ == '__main__':
    main()
#main関数の実行
```
リアルタイム（プログラムの実行時）の株価を取得できる。取得する株価の銘柄を変更したい場合は、スクレイピング先のURLを変更してください。
#雑感
・現状は逐一プログラムを実行しないと株価が取得できない。
・一時間ごとにLINEで通知するなどの機能が欲しい。
・株価が暴落・急騰などしたらアラートを送信する機能も欲しい。
・LINEが便利なAPIを公開してくれているので、LINEとの連携は簡単だった。
#参考文献
・[野村証券銘柄検索](https://advance.quote.nomura.co.jp/meigara/nomura/msearch.exe?KEY1=&KEY2=&F=nlist)
・[Python, Beautiful Soupでスクレイピング、Yahooのヘッドライン抽出](https://note.nkmk.me/python-beautiful-soup-scraping-yahoo/)
・[urllib.request --- URL を開くための拡張可能なライブラリ](https://docs.python.org/ja/3.7/library/urllib.request.html)
・[Python, Requestsの使い方](https://note.nkmk.me/python-requests-usage/)
・[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line/)
・[Google Apps ScriptからLINE NotifyでLINEにメッセージを送る](https://qiita.com/tadaken3/items/5f916a12587e42ece814)
・[PythonからLINE NotifyでLINEにメッセージを送る](https://qiita.com/tadaken3/items/0998c18df11d4a1c7427)
・[BeautifulSoupを使って、ブログ記事の情報をいろいろ絞り込んでみた](https://dev.classmethod.jp/tool/filtering-blog-article-using-beautifulsoup/)
・[HTMLからタグを抽出！BeautifulSoupによるWebスクレイピング入門【Python】](https://www.hacky.xyz/entry/python-webscraping-beautifulsoup#3_3)
・[【超便利＆お手軽】Python + LINE NotifyでLINEメッセージ送信](http://blue-black.ink/?p=3935)