ドコモオンラインショップにPixel3が入荷したらLINE通知するスクリプト

Python
スポンサーリンク

ドコモオンラインショップでPixel3 / XLが在庫ありになったらLINEに通知がくるようにするPythonスクリプトを作りました。

そこまでして買いたいか?!って感じよね
スポンサーリンク

スクリプト

# -*- coding: utf-8 -*-
import requests
import re

urls = {
    "Pixel3"    :"https://onlineshop.smt.docomo.ne.jp/products/detail.html?mobile-code=0049x",
    "Pixel3 XL" :"https://onlineshop.smt.docomo.ne.jp/products/detail.html?mobile-code=0049y"
}

LINE_TOKEN =  "<LINEのトークン>"
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

def check_stock():
    for name,url in urls.items():

        # 在庫状況は画像で表示されている
        # 在庫あり/在庫少の画像がどこかしらに表示されていたら通知する(色は判別しない(そこまでやるのが面倒くさかった))
        r = requests.get(url)
        match = re.findall(r'common/icon_(short|keep)_stock.png', r.text)

        if (len(match)):
            # LINE通知
            response = requests.post(LINE_NOTIFY_URL,
                data = {"message" : name + "の在庫があります\n" + url},
                headers = {"Authorization": "Bearer %s" % LINE_TOKEN})

def main():
    check_stock()


if __name__ == '__main__':
    main()

最初、在庫画像の正規表現で画像URLすべてを含めていたら、
9月半ばの三連休中に突然AWSに移行してURLが変わっていて、びっくりした。笑

参考
  • スクレイピング
[超簡単]LINE notify を使ってみる - Qiita
# LINE notify を使ってみる ## 概要 * 簡単にトークルームにメッセージを送信できる * 特定のトークルームに一方的に通知するだけのシンプルな機能 * 通知してくれるアカウント名などはカスタマイズできず、「LINE ...
  • LINE通知 (トークン取得)
Pythonでスクレイピングした情報をLINE Notifyを使って通知する - Qiita
#概要 スクレイピングに関して少し勉強したのでそれを利用した簡単アプリを作成したときのメモです。 今回は例としてYahoo!天気から得た情報をLINEに通知するやり方です。 - 使用言語 : Python3 #手順 ##スクレイ...
  • POST送信
Python の HTTP クライアントは urllib.request で十分 - Qiita
AWS Lambda が Python 3 に対応してからというもの Lambda Functions はだいたい Python 3 で書くようになったが、Lambda では外部モジュールに依存する関数を作ろうとすると一気に面倒臭さが...

設置

このブログを置いているレンタルサーバー(mixhost)ではPythonも使えるので、
cronで定期的に上記スクリプトを動かすことにした。

サーバーの無駄遣い

1. スクリプトをmixhost用に修正

サーバーにrequestsをインストールするのは大変そうなので(できないわけではないみたい)
requestsがインストール済みの端末でパッケージを作って、そのzipを直接読み込む。

使用Pythonモジュールをzip配布 - Qiita
Pythonスクリプト/スクリプトに使用しているサードパーティPythonモジュール群をzipファイル化して配布する方法を紹介します。 # 背景 pip経由で取得したサードパーティPythonモジュールを活用したPythonツール...

1.1. モジュールのzip作る

$ mkdir requests
$ pip install requests -t requests/
$ cd requests/
$ zip -r ../requests.zip *

1.2. モジュールをzipから読み込む

Pythonスクリプトの最初に下記を挿入

import os
import sys

# PYTHONPATHにzipファイルを追加
basepath = os.path.split(os.path.realpath(__file__))[0]
sys.path.insert(0, os.path.join(basepath, 'requests.zip'))

2. cronを設定

Cronがブラウザから設定できて便利

Cronの設定
mixhostでは、Cronを使用して指定時間に指定コマンドを実行することが可能です。 Cronの設定方法 1)cPanelにログインします。 2)詳細>Cronジョブをクリックします。 3)新しいCronジョブの追加項目に、必要事項を入力し、新しいCronジョブの追加ボタンをクリックします。 なお、一般的に良く使わ...

1分間隔でチェックするんじゃ出遅れるかも?!と、秒単位で指定しました。
(BANされない程度に…。)

# 15秒間隔でチェック
* * * * * for i in `seq 0 15 59`;do (sleep ${i}; python script.py) & done;
参考
cronを秒単位で指定する方法 – エラーの向こうへ

以上で、オンラインショップに在庫が入ったら通知が来るようになります

が、結局、通知がきてすぐに購入手続きしても間に合わず買えなかったので
購入処理も自動化しました。笑

コメント

  1. 匿名 より:

    同じことを考えて今更ながらpythonで入荷を見張っていた者です。
    取得したhtmlを検索するだけではデフォルトカラー以外の入荷を見逃してしまうと思う(私は26日のaquosの黒の入荷を見逃しました)のですが、何か対策等されていたのでしょうか?

    • くろむすび より:

      Webサイトで表示されている色はJSかなにかで切り替えているようで、
      CURLなどでHTML全文を取得した場合には、全色分の入荷状態が入っているかと思います。

      <div id="colorIconList" class="rightIconArea clearfix">
      

      の中ではなく、

      <div class="colorListWrap">
      

      の中の方をとればいけるかと思いますがいかがでしょうか。

      # ドコモのサイト、地味にちまちまと変更はいるんですよね…笑