【Python】LINEで株価速報bot#2 ～Herokuを使って自動通知編～

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

1.[【Python】LINE Notifyで株価速報botを作る #1 ～アカウント連携＆手動通知編～](https://qiita.com/japanesebonobo/items/ea656bb98b42f9164ca1)
2.【Python】LINEで株価速報bot#2 ～Herokuを使って自動通知編～
<img width="1009" alt="スクリーンショット 2019-01-15 13.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/296645/fcb39bb0-c7ef-7e20-1550-fd11aac608e5.png">
[LINE Notify 公式](https://notify-bot.line.me/ja/)
[Heroku 公式](https://www.heroku.com/home)
#やったこと
[前回](https://qiita.com/japanesebonobo/items/ea656bb98b42f9164ca1)、作成した株価をスクレイピングして、自分のLINEアカウントに通知するプログラムを少し改良。**Herokuに.pyファイルをデプロイ**。**一時間ごとに**リアルタイムの株価を通知してくれるbotの作成。
<img width="917" alt="スクリーンショット 2019-01-15 13.12.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/296645/d2e4830a-710a-167a-abb4-db9fe6d1bbd0.png">
#開発環境
言語: Python 3.6.5
Git: version 2.20.1
Heroku: version 7.19.4
OS: macOS Mojave 10.14.2
ブラウザ: Google Chrome
#サンプルコード
**※注意** このソースコードをそのまま使っても動きません。自分のLINEアカウントとLINENotifyを連携し、**アクセストークンを発行する**必要があります。詳細は[【Python】LINE Notifyで株価速報botを作る #1 ～アカウント連携＆手動通知編～](https://qiita.com/japanesebonobo/items/ea656bb98b42f9164ca1)、もしくは[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line/)の**パーソナルアクセストークンを発行する**を参考にしてください。

**index.py**: メインのファイル。[前回](https://qiita.com/japanesebonobo/items/ea656bb98b42f9164ca1)から少し改良。Heroku上にデプロイするためには、ファイル名を**index+拡張子**とする必要がある。

```py

import requests
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 = requests.get(url)
    html = r.text
    soup = BeautifulSoup(html, "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 = requests.get(url1)
    html1=r1.text
    soup1 = BeautifulSoup(html1, "html.parser")
    spans = soup1.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()
```
**Procfile**: デプロイするファイルをここに書く。**拡張子なし。**
  
```
web: python index.py
```
**requirements.txt**: アプリで使うモジュールをここに記述。モジュール名とversionを==で繋ぐ。

```
requests==2.17.3
urllib3==1.21.1
bs4==0.0.1
```
**runtime.txt**: pythonのバージョンをここに記述。

```
python-3.6.5
```
Heroku上にデプロイする際は、index.pyの他にProcfile, requirements.txt, requirements.txt, runtime.txtを一緒に置いておく必要がある。
#大まかな流れ
**1.Git上にリポジトリを作成**
**2.Herokuアカウント作成**
**3.HerokuにGitリポジトリをデプロイ**
**4.Schedulerを使い一時間ごとに定時実行**
#1.Git上にリポジトリを作成
以下のように**stock_LINE**というリポジトリを作成し、**masterブランチ**に先ほど作成した各ファイルをプッシュ。
コミット数とか、environmentsとかは僕の試行錯誤の跡なので気にしないでください。
**自分のLINEトークンをindex.pyに入れた場合は、トークンを公開しないようにGitのレポジトリをprivateにしてください。**
![スクリーンショット 2019-01-18 9.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/296645/6e7cb639-6dc3-a626-09a9-3602f035780e.png)
#2.Herokuアカウント作成
[ここ](https://www.heroku.com/)から公式ページに飛んで、右上のサインアップをクリック。
![スクリーンショット 2019-01-18 10.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/296645/868954fb-7f2d-7fab-edca-8dedf8e69e3f.png)
もろもろの情報を入力して、アカウント作成。無料。
![スクリーンショット 2019-01-18 10.47.25.png](https://qiita-image-store.s3.amazonaws.com/0/296645/78cb3239-834e-b712-9bdb-1467400d5190.png)
[ここ](https://devcenter.heroku.com/articles/heroku-cli)からHeroku CLIをインストール。これでコマンドラインでHerokuを使えるようになる。
#3.HerokuにGitリポジトリをデプロイ
1.ターミナルを起動。以下のように入力して、いずれかのキーを押すとログインページに飛ぶので、ログイン。

```
$ heroku login
heroku: Press any key to open up the browser to login or q to exit: 
```
![スクリーンショット 2019-01-18 11.15.36.png](https://qiita-image-store.s3.amazonaws.com/0/296645/672adbbb-ab84-1f51-be4d-0ae039e802b8.png)
2.**heroku create+アプリ名**でherokuアプリを作成。自分のherokuアカウントページを確認すると、アプリが追加されているのがわかる。

```
$ heroku create stock-line-app
Creating ⬢ stock-line-app... done
```
![スクリーンショット 2019-01-18 12.03.12.png](https://qiita-image-store.s3.amazonaws.com/0/296645/3b70eda7-2aed-7eb6-a62d-fa11a1efeb92.png)
3.stock-line-appをクリックし、**Deploy**タブを開く。先ほどのGithubリポジトリをデプロイする。
-**Deployment method**でGithubを選択。
-**Connect to GitHub**でstock_LINEリポジトリを選択。接続に成功すると、以下のようになる。
-**Manual deploy**でDeploy Branchをクリック。これでstock_LINEリポジトリがデプロイされる。
 完了したら、LINEに株価速報が届くはず。確認してみてください。
![スクリーンショット 2019-01-18 12.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/296645/82e9700b-12c7-0748-8195-859ec82960df.png)
![スクリーンショット 2019-01-18 12.15.37.png](https://qiita-image-store.s3.amazonaws.com/0/296645/4f8b3aab-d692-e659-3358-909deea5955f.png)
#4.Schedulerを使い一時間ごとに定時実行
株価速報を一時間ごとに実行するために、無料のHeroku Schedulerを使う。
**Resources**タブを開き、検索バーにHeroku Schedulerと入力し、追加。
アドオンを初めて使う方は、ここで**クレジットカードの情報入力が必要**。
ただし、今回は登録するだけでお金は取られない。
![スクリーンショット 2019-01-18 12.29.51.png](https://qiita-image-store.s3.amazonaws.com/0/296645/869f23bb-a030-7206-7c43-7c059a3adaa0.png)
Heroku Schedulerをクリックし、Add new  jobで定時実行処理を実装できる。
```$rake do_something```に定時実行するファイルを入力。今回は**python index.py**と入力。
**FREQUENCY**をHourlyとしてsave。
![スクリーンショット 2019-01-8 12.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/296645/f992f65a-5c31-05b7-2104-d5d03962cb10.png)
これで一時間ごとに株価速報が届くようになる。画像はまだ株式市場が空いてない時間だったので
株価が変わっていないが、開場時間ならリアルタイムの株価がわかる。
<img width="371" alt="スクリーンショット 2019-01-18 12.43.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/296645/9a13a238-58cf-1edb-1d85-4b5097a3f48c.png">
#雑感
・Herokuはやり方さえ理解すれば、デプロイが非常に簡単で便利。
・1時間ごとに定時実行したら、各時間の0分に通知くるのかと思いきや、2分とかにくる。無料やからそこは仕方ない？
・株式市場があいてない、深夜とかにもきっちり一時間ごとに送りつけてくるのでうっとうしい。
・株式市場があいている時間のみに絞って、定時実行したい。
・アメリカ市場があいてる時間は、アメリカの株価速報を送ってくるようにしたい。
#参考文献
[Herokuでお天気Pythonの定期実行](https://qiita.com/seigo-pon/items/ca9951dac0b7fa29cce0)
[初心者がハマった、初めてのDjangoアプリのHerokuデプロイ](https://qiita.com/RyuSA/items/0cbc7d5b0145585861a8)
[Pythonで作ったTwitterのbotをHerokuで動かす](http://hwhw.hatenablog.com/entry/2017/06/04/234539)

参考にさせていただきました。ありがとうございました。