円高になったら米ドルでも買おうかと考えていたときに作った「円高になったらGmailで知らせてくれるPythonスクリプト」です。
ラズベリーパイならcrontabで定期実行ができるので毎日決まった時刻に円相場をチェックして円高の時だけメール送信してくれます。
円相場の取得
プログラム上は円高の設定を106.0円としていますが、各自が円高とする値に適当に変更して使ってください。(そう言えば、昔の日本は固定円相場で1ドル=360円でしたよねぇ)
円相場はYahoo!ファイナンスのサイトをチェックするようにしました。
以下の部分の円相場をBeautifulSoup4を使ってスクレイピングしています。
beautifulsoup4のインストール方法
pip install beautifulsoup4
又は
pip3 install beautifulsoup4
もちろん別のサイトがよろしければこれもURLを変更してください。(その際はスクレイピングタブなども変更する必要があります)
Gmail側で必要な情報と設定
Gmail側で必要な情報は、以下の4点。
# Gmailアカウント設定 gmail_addr = "《あなたのGmailアドレス》" gmail_pass = "《あなたのGmailパスワード》" SMTP = "smtp.gmail.com" PORT = 587
SMTPとPORTはGmailをお使いの方はすべて共通です。
あと現在、Raspberry Piのようなサードパーティ製の端末からGmail送信するには、以下のGoogleアカウント設定が必要です。当然セキュリティは脆弱になります。個人の責任において設定してください。
1.Gmailのサイトで右上の自分のアカウントアイコンをクリック
2.Googleアカウントをクリック
3.セキュリティタブをクリック
4.「安全性の低いアプリのアクセス」を有効にする
以下で上記のGoogleアカウント設定を画像つきで解説しています。
ソースコード
説明は、ソースコード内のコメントに詳しく書いているので省かせて頂きます。
実行方法
sudo python3 yenMail.py
実行イメージ(指定した金額より円高だった場合)
yenMail.py
#!/usr/bin python3 # -*- coding: utf-8 -*- """ ラズパイ(Raspberry Pi)で円相場チェックしメール送信をやってみる python 3.2.5 OS: Rasbian(Raspberry Pi Model B) """ # メール送信のためのSMTPセッションクライアントを作成するため import smtplib # メールの送信日付をインターネットで送信できるフォーマットで指定するため from email.utils import formatdate # メール本文に日本語を送信できるようにするためのMIME規格に変換するため(E-mailも基本は英語圏でできた規格なのです!) from email.mime.text import MIMEText # URLからデータ取得のため import urllib.request # スクレイピングのため外部ライブラリのBeautifulSoupを使用 from bs4 import BeautifulSoup if __name__ == "__main__": # Gmailアカウント設定 gmail_addr = "《あなたのGmailアドレス》" gmail_pass = "《あなたのGmailパスワード》" SMTP = "smtp.gmail.com" PORT = 587 # 円相場のチェック値 target_yen = 106.0 # 送信メール情報 from_addr = gmail_addr # 送信元メールアドレス(Gmailでなくてもよい) to_addr = "《送信先メールアドレス》" # 送信先メールアドレス subject = "円相場情報@raspi" # 件名 # 円相場チェック url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=USDJPY=X" res = urllib.request.urlopen(url) soup = BeautifulSoup(res, 'html.parser') usdJpy = soup.select('.stoksPrice') yen = float(usdJpy[0].text) # 取得した円相場を実数化 if yen <= target_yen: mail_flg = True body = "円高になってきたよ {0} 円".format(yen) # メール本文作成 body += "\n\nどうする?" else: mail_flg = False print("円相場: {0}". format(yen)) # 円相場が目標値より円高になったらメール送信する if(mail_flg): # メールメッセージを作成 msg = MIMEText(body, "plain", "utf-8") # ラズパイのpython3では3つの引数でエンコードをutf-8にしないと # 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128) というエラーがでる msg["From"] = from_addr msg["To"] = to_addr msg["Date"] = formatdate() # 日付をインターネットで送信できるフォーマットで指定 msg["Subject"] = subject # メール送信 try: print("メール送信中...") send = smtplib.SMTP(SMTP, PORT) # GmailのSMTPを利用してSMTPオブジェクトを生成 send.ehlo() send.starttls() send.ehlo() send.login(gmail_addr, gmail_pass) # Gmailにログイン send.send_message(msg) # メールを送信 send.close() except Exception as e: print("except: " + str(e)) # エラー送出時のメッセージ表示 else: print("{0}へメール送信したよ!".format(to_addr)) # メールが正常に送信されたときのメッセージ
コメント