株価速報、利確ライン、損切りラインをLINEで通知してくれるbotがあればいいな~と思い、LINE NotifyとHerokuを使って開発した記録。
1.【Python】LINE Notifyで株価速報botを作る #1 ~アカウント連携&手動通知編~
2.【Python】LINEで株価速報bot#2 ~Herokuを使って自動通知編~
LINE Notify 公式
Heroku 公式
やったこと
前回、作成した株価をスクレイピングして、自分のLINEアカウントに通知するプログラムを少し改良。Herokuに.pyファイルをデプロイ。一時間ごとにリアルタイムの株価を通知してくれるbotの作成。
開発環境
言語: 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にしてください。
2.Herokuアカウント作成
ここから公式ページに飛んで、右上のサインアップをクリック。
もろもろの情報を入力して、アカウント作成。無料。
ここからHeroku CLIをインストール。これでコマンドラインでHerokuを使えるようになる。
3.HerokuにGitリポジトリをデプロイ
1.ターミナルを起動。以下のように入力して、いずれかのキーを押すとログインページに飛ぶので、ログイン。
$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
2.heroku create+アプリ名でherokuアプリを作成。自分のherokuアカウントページを確認すると、アプリが追加されているのがわかる。
$ heroku create stock-line-app
Creating ⬢ stock-line-app... done
3.stock-line-appをクリックし、Deployタブを開く。先ほどのGithubリポジトリをデプロイする。
-Deployment methodでGithubを選択。
-Connect to GitHubでstock_LINEリポジトリを選択。接続に成功すると、以下のようになる。
-Manual deployでDeploy Branchをクリック。これでstock_LINEリポジトリがデプロイされる。
完了したら、LINEに株価速報が届くはず。確認してみてください。
4.Schedulerを使い一時間ごとに定時実行
株価速報を一時間ごとに実行するために、無料のHeroku Schedulerを使う。
Resourcesタブを開き、検索バーにHeroku Schedulerと入力し、追加。
アドオンを初めて使う方は、ここでクレジットカードの情報入力が必要。
ただし、今回は登録するだけでお金は取られない。
Heroku Schedulerをクリックし、Add new jobで定時実行処理を実装できる。
$rake do_something
に定時実行するファイルを入力。今回はpython index.pyと入力。
FREQUENCYをHourlyとしてsave。
これで一時間ごとに株価速報が届くようになる。画像はまだ株式市場が空いてない時間だったので
株価が変わっていないが、開場時間ならリアルタイムの株価がわかる。
雑感
・Herokuはやり方さえ理解すれば、デプロイが非常に簡単で便利。
・1時間ごとに定時実行したら、各時間の0分に通知くるのかと思いきや、2分とかにくる。無料やからそこは仕方ない?
・株式市場があいてない、深夜とかにもきっちり一時間ごとに送りつけてくるのでうっとうしい。
・株式市場があいている時間のみに絞って、定時実行したい。
・アメリカ市場があいてる時間は、アメリカの株価速報を送ってくるようにしたい。
参考文献
Herokuでお天気Pythonの定期実行
初心者がハマった、初めてのDjangoアプリのHerokuデプロイ
Pythonで作ったTwitterのbotをHerokuで動かす
参考にさせていただきました。ありがとうございました。