ゆゆ式の特典確認の自動化について
この記事はゆゆ式Advent Calender 10日目の記事です。https://t.co/1JD2xTax2Y
#ゆゆ式ac
○ゆゆ式の特典確認の自動化について
・目的
ゆゆ式の単行本特典をpythonで自動確認しようというものです。(今となってはほぼ不要なものですが…)
なお、筆者は仕事でPythonを扱ったりしているわけではなくほぼ素人のコードになりますのでコードがアレなのはご了承ください。(一応動きました。)
・経緯
ゆゆ式の単行本はいまでこそきらら公式ツイッターで特典が公開されていますが、数年前までは公式告知がなく、作者の方が告知するなり読者が自分で各店舗のサイトを見て調べるなどしていた時代がありました。
過去に自分で調べてこんな画像を作ったりもしてました。
そこで、当時は自力で手動で確認していたわけですが、毎日各店舗のサイトを確認するのもなかなか面倒という問題がありました。というわけでプログラムで定期実行して楽をしたいという思いがありました。今となっては不要ですが、作れそうなので作ってみたところです。
・自動化概要
必要な要素として下記の点を満たしているものを考えました。
①単行本の作品ページのデータを取得し、特典について前回実行分と差分があるか判別する。差分は特典内容に対する更新のみであることを判別できるようにする。
②差分があった際に通知をする。(今回はデスクトップ通知とディスコード通知にしましたが、ラインとかメールとかも可能なようです。)
③上記①、②を数時間おきなどで定期実行する
③についてはSchedule文でも数時間おきに実行することは可能なようですが、今回はタスクスケジューラーを使って比較的簡単に済みましたのでそちらを使いました。というわけで①、②についてプログラムを作成しました。
・前提事項
下記のプログラムを使用する場合、Pythonの導入が必要になりますがそこから説明すると長くなりすぎてどうしようもないので割愛します。
ググれば出てくるものとは思いますが、私は初めてPythonを使ったときはこちらの本を参考にしました。Pythonの導入、エディタの導入、基本的な使い方からwebスクレイピングまで載っているので初心者の方には良いかもです。(某所のステマ)
次に、定期実行にするには実行場所として下記のようなものがあると思います。
①家のPCを起動し続ける
②Herokuなどクラウドを使う
③サーバーを借りる
私は①は電気代の問題と耐久面の不安、夜にうるさいなどの理由から避け、②のHerokuはCSVファイルの格納や指定がよくわからず、googleは金額計算のサイトが英語で読めずに怖かったため、③としてさくらのwindowsのVPSサーバーを使用しました。(レンタルサーバーではPythonが上手く動かない問題があったためVPSサーバーを使用)
・ソース
なお、今回はゲーマーズでの確認用です。抽出箇所が異なるため、htmlを確認するなどして店舗ごとに調整が必要になります。
import requests import difflib import datetime import os import re from discordwebhook import Discord from bs4 import BeautifulSoup from plyer import notification #ファイルの格納先 dir_path =r'E:\ドキュメント\surasura-python\tokuten' #前回取得ファイル file1_name = "gemazu1.csv" #今回取得ファイル file2_name = "gemazu2.csv" #店名を指定 tenmei="ゲーマーズ" #ここに対象のページのアドレスを入力 result = requests.get('****************') soup = BeautifulSoup(result.text,'html.parser') #スクレイピングの抽出対象を指定 html_list =soup.find_all(id=re.compile("tokuten")) ##ここから上は修正要 #今回分をgemazu2に保存し、前回と差分があれば報告してgemazu1を同内容で更新する #取得した内容をファイル2(今回分)に取得内容を記載 with open(file2_name,'w')as f: for html in html_list: okikae = html.get_text() naiyou = okikae.replace('\xa0','') f.write(naiyou) #パスを記載 file1_path = os.path.join(dir_path, file1_name) file2_path = os.path.join(dir_path, file2_name) #更新無しで初期化 kousin="nasi" #ファイル1があれば2と比較をする。なければ新規作成して終了。 if os.path.isfile(file1_path): file1 = open(file1_path) file2 = open(file2_path) #diffを定義 diff = difflib.Differ() #差分を抽出 output_diff = diff.compare(file1.readlines(), file2.readlines()) #差分箇所があれば更新ありフラグを立てる for data in output_diff : if data[0:1] in ['+', '-'] : kousin="ari" print(data) file1.close() file2.close() #ファイル1(前回分)に今回取得内容を記載 with open(file1_name,'w')as f: for html in html_list: okikae = html.get_text() naiyou = okikae.replace('\xa0','') f.write(naiyou) #デスクトップ通知とディスコード通知 if kousin == "ari": print(data) notification.notify( title = "ゆゆ式", message=tenmei+"特典更新あり", timeout=10 ) discord = Discord(url="*******************") discord.post(content=tenmei+"特典が更新されました。") else: print("なし")
・出力の想定
(1)基本的に各種作品ページは特典がある場合以下のように推移する。
①→②、②→③の場合にのみ通知を出力することとする。
①作品ページ作成時:この時点では特典情報の欄がないことが多い。
②特典種別掲載時:ここで、「クリアファイル」、「ブックカバー」など種別が表示される。ただし、特典画像は載っておらず「Now Printing」などが表示されていたりしている。
③特典画像掲載時:画像が掲載される。
(2)通知方法
外出時でも確認できるように更新の通知はディスコード通知でスマホにプッシュ通知が届くようにする。
・結果
ゆゆ式では確認できていませんが、他作品でテストしたところ動作は問題ありませんでした。特典部分が変わるとディスコードに通知が来るので家の外にいてもスマホで更新の確認ができそうです。サーバーで定期実行をすれば定期的に確認可能です。
これで次回以降は特典確認が楽にできますね。(まあ、もう公式告知があるのでほぼ不要なんですが…いい時代です。)
・課題
今後の課題点として以下のような点があります。
・抽出箇所の選定問題
html_list =soup.find_all(id=re.compile("tokuten"))の箇所になりますが、サイトごとに構成が違うため、メロンブックスやとらのあななど店舗ごとに抽出箇所を調べて変更する必要が出てくる。→各店舗分の作成が必要
また、サイトが改修された場合も抽出箇所を変えないといけない場合もある。
→巻が変わるごとに正常に動作するか確認が必要
・そもそも特典のある店舗がどこなのかという問題
正直わからないので前巻で出た店舗を調べるなり、他作品を参考に推測で進めるしかない。
・外出時の確認の際に結果的にサイトを見に行く必要がある
上記ソースでは画像が抽出されていないので、どういった画像なのか確認するにはそのページを見に行かなくてはならない。画像が貼られてる場合はその画像を貼れるようにするように調整したい。
・活用法について
きらら公式で告知されるのでだいたい不要なんですが、ざっと思いつく限りでは以下があります。
・メロンブックスでは過去に連動特典として他の巻と一緒に買うと特典が付く場合があった。公式で告知されないそういった更新をを読み取ることができる。
・公式告知より早く特典内容を知ることができる。
などでしょうか。
・まとめ
ゆゆ式の特典確認の自動化としては一定程度可能になりましたが、機能面で足りていない部分や各店舗対応などがまだ必要になりそうです。
また、可能であれば今後考察に生かせるプログラムかなにかを作れたらと思いました。(まあ、Pythonよくわからんので難しそうですが…)
↓手動だった頃の記録
『ゆゆ式』9巻 店舗別特典まとめ - 茶番のアレ https://t.co/AhErdvqXue 描き下ろし以外もまとめてくれてる方がいました!
— 三上小又@ゆゆ式12巻発売!! きららファンタジアやってるよ。 (@mikamikomata) 2017年8月23日