PS5が入荷したらLINEに通知してくれるプログラム書いた

# はじめに

こちらは在庫が復活したら**LINE**に通知してくれるプログラムです。
PS5ほしいけど、Twitterの速報に気づいた時には売り切れなんてことがありますよね。
店舗でもごく稀にゲリラで販売されるくらいで、かなり入手困難なPS5です。
そこで、転売ヤーに負けないくらいの速さで買おうと思って、本プログラムを書きました。転売ヤーもぜひ！笑

# 言語

・python3系

# やること

1 LINE Developerアカウントの作成。
2 スプレッドシートの設定。（無くても良い）
3 対象ページをスクレイピング(プログラムで実行)
4 欲しい値段だったらLINEに通知(プログラムで実行)
5 定期実行(プログラムで実行)

別のページでも応用できるので、やってみてください！
3,4,5の工程のコードは長いので、別ページで公開しております。

# 1 LINE Developerアカウントの作成

#### **1-1　LINEビジネスアカウントの取得**

[こちら](https://developers.line.biz/ja/services/messaging-api/)からアクセスして、自分が個人で使っているLINEでログインしてください。

上から順に入力していきます。

・チャンネルの種類はMessaging API、プロバイダーは自分の好きな名前を新規作成してください。
・アイコンも適当に設定します。
・チャンネル名はbotの名前になりますので、「在庫復活」とか好きな名前を設定してください。
・業種は自分について設定します。

#### **1-2　ユーザーIDとトークンをプログラムにコピペする**

設定が完了すると
・トップ→プロバイダ名→Messaging API設定→QRコードから友達に追加します。
・登録が終わったら、あとはチャンネル基本設定の「あなたのユーザーID」とMessagin API設定の「チャンネルアクセストークン（長期）」をコピーして、プログラムの該当部分に貼り付ける。
**注意**「あなたのユーザーID」は「チャンネルID」ではありません。ページの下の方にあります。チャンネルアクセストークンもページの下の方にあり、めっちゃ長いやつです。


# 2 スプレッドシートの設定。

この工程は[こちら](https://qiita.com/akabei/items/0eac37cb852ad476c6b9)の記事を参考にさせていただきました。
スプレッドシートの値をpythonのプログラム上で取得できればオッケーです。
また、商品IDと値段をプログラムに直書きする場合はこちらは不要です。PS5１つだけであればスプレッドシートに記入する意味はあまりないかもしれません。

スプレッドシートは以下のように1列目にASIN(Amazonの商品ID)、2列目に価格、3列目に名前を設定します。
ASINというのはAmazonの商品IDです。別のページであれば、そのページの商品IDを使用します。
だいたいのECサイトはURLに商品IDがあって、**"https:ABCDEF/商品ID"**みたいに管理されています。

Amazonであれば、**"https://www.amazon.co.jp/dp/商品ID"**で管理されています。

![スクリーンショット 2021-05-13 13.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177142/6b3bebad-2588-7f88-e3f7-1b0db898dac3.png)

先程のLINE Devolorsの設定と合わると以下のようなコードになります。

```python
# スプレッドシートよりASINと価格を取得。

import gspread
from oauth2client.service_account import ServiceAccountCredentials 
import time
import requests
import pandas as pd
import re
from bs4 import BeautifulSoup
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError
from datetime import datetime
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] #おまじない
 
# 秘密鍵（JSONファイル）のファイル名を入力
credentials = ServiceAccountCredentials.from_json_keyfile_name('設定したJSONファイル', scope)
gc = gspread.authorize(credentials)

wb = gc.open('スプレッドシートの名前')

SPREADSHEET_KEY = 'スプレッドシートのキーの名前'
wb = gc.open_by_key(SPREADSHEET_KEY)
 
ws = wb.get_worksheet(0) # ０番目のスプレッドシートの取得

ASIN = ws.col_values(1) # １列目に欲しいASINを並べる。

price = ws.col_values(2) # ２列目にこの値段以下だったら通知して欲しい値段を設定。

LINE_ACCESS_TOKEN = "ご自身のLINE_ACCESS_TOKEN"
LINE_USER_ID = "ユーザーID"
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
```

これで前準備は終わりです。

# 3 対象ページをスクレイピング(プログラムで実行)
おわりに参照。
# 4 欲しい値段だったらLINEに通知(プログラムで実行)
おわりに参照。
# 5 プログラムの定期実行(プログラムで実行)

これは色々やり方があると思います。
**cron**や**タスクマネージャー**で定期実行する手段もあると思いますが、私は**外部サーバーを立ててwhile文で無限ループ**させることで、常にプログラムが起動している状態です。
なぜかというと、通知してくれる商品がすぐ売り切れてくれればいいのですが、数時間在庫がある状態が続くと通知が毎回来ることになってしまいます。
よって、通知が来るとその商品の「通知count」をプラス1することで、カウントが2以上は通知が来ないように設定しました。このカウントは0時00分にリセットされます。

# このツールのメリット
・E-mailではなくLINEに通知してくれるので早く気づくことが出来る。
・少しコードを書き換えれば、好きなサイトを設定できる。
・スクレイピングの勉強になる。このやり方でほとんどのページのスクレイピングができると思います。全プログラムを公開してます。

# おわりに
最後までご覧いただきありがとうございました。
3,4,5の工程は[こちら](https://note.com/noteasybutfun/n/n96976b29aea7)で詳しく解説しております。結構時間をかけて作ったので、有料にさせていただいておりますが、買ってくれた方はきっと役に立つと思います。スクレイピングする際のIP分散の仕方もそちらで記載しております。