今回は晴れる屋でカードの価格が変更されたらDiscordの任意のチャンネルに通知してくれるプログラムをPythonで書いてみました。
データベースは持たせていないですが、価格の推移も確認する事が出来ます。
ソースコード
ソースコードは以下になっています。
import requests
from bs4 import BeautifulSoup
import discord
from discord.ext import tasks
import json
# Discord Botのトークンを設定してください
DISCORD_BOT_TOKEN = ''
CHANNEL_ID = # 通知を送りたいチャンネルのID
# 登録された製品情報
products = []
price_check_interval = 600 # 10分間隔でチェック(秒単位)
price_increase_threshold = 0.1 # 価格が10%以上上がった場合に通知
# 製品を追加する関数
def add_product(url):
initial_price = get_nm_price(url)
if initial_price is not None:
products.append({"url": url, "initial_price": initial_price})
print(f'初期価格: {url} - ¥{initial_price:,}')
else:
print(f'価格取得失敗: {url}')
# NMクラスの価格を取得する関数
def get_nm_price(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
# JSON-LDスクリプトを探す
script_tag = soup.find('script', type='application/ld+json')
if script_tag is not None:
json_data = json.loads(script_tag.string)
for item in json_data:
if item["@type"] == "Product" and "offers" in item:
offer = item["offers"]
if offer["@id"] == "JP-NM":
price = offer["price"]
return int(price)
return None
# 価格を定期的にチェックする関数
@tasks.loop(seconds=price_check_interval)
async def check_prices():
for product in products:
current_price = get_nm_price(product["url"])
if current_price is not None:
initial_price = product["initial_price"]
if current_price != initial_price:
if current_price > initial_price * (1 + price_increase_threshold):
await send_discord_notification(product["url"], initial_price, current_price)
product["initial_price"] = current_price # 新しい初期価格に更新
print(f'価格変更あり: {product["url"]} - 新価格: ¥{current_price:,}, 以前の価格: ¥{initial_price:,}')
else:
print(f'価格変更なし: {product["url"]} - 現価格: ¥{current_price:,}')
else:
print(f'価格取得失敗: {product["url"]}')
# Discordに通知を送る関数
async def send_discord_notification(url, old_price, new_price):
channel = client.get_channel(CHANNEL_ID)
if channel:
message = f"価格が上昇しました!\nURL: {url}\n以前の価格: ¥{old_price:,}\n新しい価格: ¥{new_price:,}"
await channel.send(message)
# Discordのクライアントを設定
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
check_prices.start()
# ユーザーが製品URLを追加
add_product('https://www.hareruyamtg.com/ja/products/detail/162644?lang=EN')
# Discord Botを実行
client.run(DISCORD_BOT_TOKEN)
コード解説
コードを簡単に解説します。
DISCORD_BOT_TOKEN = ''
CHANNEL_ID = # 通知を送りたいチャンネルのID
このコードを使用するにあたり公式サイトからDiscord botの作成が必要になります。
今回はDiscordに通知を送る形にしましたがLINEなど他のアプリに通知を送る事も出来ます。
price_check_interval = 600 # 10分間隔でチェック(秒単位)
price_increase_threshold = 0.1 # 価格が10%以上上がった場合に通知
price_check_intervalでどれくらいの間隔で価格をチェックしたいかを秒単位で指定します。
サンプルコードでは600秒(10分毎)で指定しています。
price_increase_thresholdでどれくらい価格が上がったら通知して欲しいかを指定します。
# ユーザーが製品URLを追加
add_product('https://www.hareruyamtg.com/ja/products/detail/162644?lang=EN')
こちらでトラックしたい製品のURLを指定して下さい。
今回は英語版のマネドリの価格をトラックしました。
実際に使ってみた
実際に使用してみました。
プログラムを起動するとターミナルにはこのような画面になり、ターミナル上でも変更があったかどうかを知らせてくれます。
実際のDiscordの通知。
トラックを始めた7月31日時点では600円で売り切れだったのですが、3日後の8月3日9:48(日本時間)には900円に上昇しました。
それでも直ぐに売り切れになったのでその約3時間後には1000円まで上昇。
更に売り切れが続き値上げを繰り返していき、数時間後には1800円まで急上昇しました。
とんでもない上がり幅ですね…
マネドリはブルームバロウの定価2000円のスターターに収録もされているのを考えると凄まじい値段となっています。
スターターの神話も高額で販売されているので3000円くらいで購入できてもお得かもしれませんね。
マネドリは海外の通販でも飛ぶように売れていたので直ぐに日本でも反映されると思ったので、どのように価格が変化していくかをモニターしてみました。
海外大手のTCGPlayerの価格推移は以下のようになっています。
まだ日本で買うよりはお得ですね。
さいごに
コードを少し改変してデータベースを持たせれば、晴れる屋のカードの価格推移のグラフを作成することも可能です。
日本ではスタンダードが人気のフォーマットなので、人気カードは一時的に価格が高騰することがありますが、海外の通販価格に合わせて落ち着くことも多いです。
そのため、海外通販と晴れる屋のデータを比較し、購入すべきカードを教えてくれるプログラムを作成したりしても面白いかもしれません。
この記事が面白いと思ったらSNS等でシェアしてくれると筆者が喜びます。
日本からも簡単に個人輸入が出来る海外通販の使い方や晴れる屋と価格比較は以下の記事で書いてあるので良かったら読んでみて下さい。