##動機
最近SONYのPS4用ヘッドセットが大変人気らしく、SONYストアから姿を消しています・・・
これ
https://pur.store.sony.jp/ps4/products/ps4_other/CUHJ-15007_purchase/
Amazonやその他店舗では取り扱いがあるものの、SONYストアの価格よりも6,000円も高かったりしてどうにかしてSONYストアで購入したい・・・
そうしてここ4日ほどちょくちょくサイトを見ていたのですが面倒になってきたので思いつきでPythonでメール通知をするプログラムを作ることにしました。
Pythonはほとんど書いたことが無いので何か気になったところは自分で直していただけると助かります。
##私の環境
MacbookAir
MacOS Sierra 10.12.6
Python3.6.0
##参考サイト
PythonでWebスクレイピングする時の知見をまとめておく
Pythonでメール送信~Gmail編~
Python3で一定間隔で処理を行う
【Python】requestsにおけるInsecureRequestWarningを非表示にする
Pythonの簡単なコードでメールを自動送信してみる
UserAgentからOS/ブラウザなどの調べかたのまとめ
【Python入門】文字列の比較方法まとめ
##仕様
5分(300秒)に1度Sonyストアのソースの中に「入荷待ち」があるかをチェックして
もし見つからなかった場合は入荷したと判断し、指定したメールアドレスにメールを送信し自身のプロセスを終了する。
メールアドレスは複数個指定可能で一斉送信できる
##実装コード
import requests
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import time
# 警告を消す
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
# 警告を消す
PAGEURL = 'https://pur.store.sony.jp/ps4/products/ps4_other/CUHJ-15007_purchase/'
FROM_ADDRESS = 'YourGMail@gmail.com'
FROM_ADDRESS_NAME = 'YourName(任意)'
MY_PASSWORD = 'YourGoogleAccountPassword'
TO_ADDRESS = 'MailAddress1@gmail.com,MailAddress2@gmail.com'
TO_ADDRESS_LIST = ['MailAddress1@gmail.com','MailAddress2@gmail.com']
BCC_ADDRESS = ''
SUBJECT = 'Sonyヘッドホンの入荷情報'
BODY = '入荷した可能性がありますのでチェックしてください\n\n' + PAGEURL
def create_message( from_addr, from_addr_name, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr_name + "<" + from_addr + ">"
msg['To'] = ",".join( to_addr )
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, bcc_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
def CheckBackOrder():
URL = PAGEURL
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)"}
resp = requests.get(URL, timeout=1, headers=headers,verify=False)
# textでunicode, contentでstr
# print(resp.text)
return "入荷待ち" not in resp.text
if __name__ == '__main__':
to_addr = TO_ADDRESS_LIST
bcc_addr = BCC_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message( FROM_ADDRESS, FROM_ADDRESS_NAME, to_addr, bcc_addr, subject, body)
while True:
# print("チェックします",time.time())
if CheckBackOrder():
send(FROM_ADDRESS, to_addr, bcc_addr, msg)
exit()
time.sleep(300)
##簡単な説明
BCCも利用できますがGメールの仕様が気に食わなかったので空欄にしています。
また、送信先のメールアドレスを複数個設定するには'test@gmail.com,test@me.com,test@docomo.ne.jp'のように『,』で区切ってください。
最後のtime.sleep(300)が300秒 = 5分となっているので任意に変更してください。
『入荷待ち』という単語が含まれているかどうかしかチェックしていませんので確実に入荷状態になっているかは判定していません。
##おわりに
書き終わった後にとんでもないことに気がつきました。
Sonyストアには入荷したらメールが来るお気に入り機能が去年導入されたらしく存在していました。
見なかったことにします。
お疲れ様でした(白目)
何かあればTwitter@ryosuke_tamuraまでお願いします。