8
4

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.

Python3でSonyストアの入荷をGメールで通知する

Last updated at Posted at 2018-06-15

##動機
最近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ストアのソースの中に「入荷待ち」があるかをチェックして
もし見つからなかった場合は入荷したと判断し、指定したメールアドレスにメールを送信し自身のプロセスを終了する。
メールアドレスは複数個指定可能で一斉送信できる

##実装コード

SonyHeadSetChecker.py
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までお願いします。

8
4
0

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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?