13
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-18

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

1.【Python】LINE Notifyで株価速報botを作る #1 ~アカウント連携&手動通知編~
2.【Python】LINEで株価速報bot#2 ~Herokuを使って自動通知編~
スクリーンショット 2019-01-15 13.00.39.png
LINE Notify 公式
Heroku 公式

やったこと

前回、作成した株価をスクレイピングして、自分のLINEアカウントに通知するプログラムを少し改良。Herokuに.pyファイルをデプロイ一時間ごとにリアルタイムの株価を通知してくれるbotの作成。
スクリーンショット 2019-01-15 13.12.28.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 ~アカウント連携&手動通知編~、もしくはコマンドラインから LINE にメッセージを送れる LINE Notifyパーソナルアクセストークンを発行するを参考にしてください。

index.py: メインのファイル。前回から少し改良。Heroku上にデプロイするためには、ファイル名をindex+拡張子とする必要がある。


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

2.Herokuアカウント作成

ここから公式ページに飛んで、右上のサインアップをクリック。
スクリーンショット 2019-01-18 10.43.46.png
もろもろの情報を入力して、アカウント作成。無料。
スクリーンショット 2019-01-18 10.47.25.png
ここから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
2.heroku create+アプリ名でherokuアプリを作成。自分のherokuアカウントページを確認すると、アプリが追加されているのがわかる。

$ heroku create stock-line-app
Creating ⬢ stock-line-app... done

スクリーンショット 2019-01-18 12.03.12.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
スクリーンショット 2019-01-18 12.15.37.png

4.Schedulerを使い一時間ごとに定時実行

株価速報を一時間ごとに実行するために、無料のHeroku Schedulerを使う。
Resourcesタブを開き、検索バーにHeroku Schedulerと入力し、追加。
アドオンを初めて使う方は、ここでクレジットカードの情報入力が必要
ただし、今回は登録するだけでお金は取られない。
スクリーンショット 2019-01-18 12.29.51.png
Heroku Schedulerをクリックし、Add new jobで定時実行処理を実装できる。
$rake do_somethingに定時実行するファイルを入力。今回はpython index.pyと入力。
FREQUENCYをHourlyとしてsave。
スクリーンショット 2019-01-8 12.36.28.png
これで一時間ごとに株価速報が届くようになる。画像はまだ株式市場が空いてない時間だったので
株価が変わっていないが、開場時間ならリアルタイムの株価がわかる。
スクリーンショット 2019-01-18 12.43.29.png

雑感

・Herokuはやり方さえ理解すれば、デプロイが非常に簡単で便利。
・1時間ごとに定時実行したら、各時間の0分に通知くるのかと思いきや、2分とかにくる。無料やからそこは仕方ない?
・株式市場があいてない、深夜とかにもきっちり一時間ごとに送りつけてくるのでうっとうしい。
・株式市場があいている時間のみに絞って、定時実行したい。
・アメリカ市場があいてる時間は、アメリカの株価速報を送ってくるようにしたい。

参考文献

Herokuでお天気Pythonの定期実行
初心者がハマった、初めてのDjangoアプリのHerokuデプロイ
Pythonで作ったTwitterのbotをHerokuで動かす

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

13
20
1

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
13
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?