無限にプリパラがみた~~~い!!!!
2020-12-19
azblob://2022/11/11/eyecatch/2020-12-19-danime-random-playback-000​.jpg

この記事はFIXER Advent Calendar 2020( https://adventar.org/calendars/5587 )19日目の記事です。

こんにちは、山本です。

みなさんはプリパラというアニメをご存知でしょうか?
プリパラは2014年から2017年までの4年間放送されていた少女向けアニメで、主人公「真中らぁら」とそのトモダチが切磋琢磨してアイドルの頂点に上り詰めていく様が描かれた王道アイドルモノです。

放送が終了した現在でも根強い人気を誇り、新曲が作成されたり、毎年数回のライブ公演が行われたりしております。先日も幕張イベントホールでライブが行われました。
感染症対策で声を出してのコールなどはできませんでしたが、とても楽しかったです。

そして、ライブで新シリーズ「アイドルランドプリパラ」のアニメ制作が発表されました。予想外の発表過ぎて参加者のオタクみんな泣いてました。僕も泣いてました。

さて、ここから延々とプリパラのすばらしさ語り布教活動をしていってもいいのですが、それはプリハラ(プリパラハラスメント)になるので、テックの話に少し寄せていきます。

私はプリパラに救いを見出している人間なので、いまでもプリパラをdアニメストアで頻繁に見返しております。

ただ、4年間も放送していたアニメということで全部で191話もあり、なかなか全話通して見ることは難しく、どうしても好きな回だけピックアップして何度も見てしまいます。これはプのオタクとしてよくありません。見返してない回でも噛めば噛むほど味が出て美味しいのだから……。

なので、

Pythonでプリパラをランダム再生するスクリプトを作りました。

百聞は一見に如かずということで、まずはコード全文をドン!

※使用する際はご自身でdアニメの利用規約をご確認ください。

https://www.nttdocomo.co.jp/service/dmarket/regulation/d_anime.html

import time
from selenium import webdriver
import chromedriver_binary
import random

danime_id = '【dアニメのID】'
danime_password = '【dアニメのパスワード】'

#プリパラシーズン1のID 21470001 ~ 21470038
pripara_1_list = list(range(21470001, 21470039))
#プリパラシーズン2のID 21471001 ~ 21471051
pripara_2_list = list(range(21471001, 21471052))
#プリパラシーズン3のID 21499001 ~ 21499051
pripara_3_list = list(range(21499001, 21499052))
#アイドルタイムプリパラのID 21784001 ~ 21784051
pripara_idol_list = list(range(21784001, 21784052))

all_pripra_list = pripara_1_list + pripara_2_list + pripara_3_list + pripara_idol_list

#プリパラ105話の除外
all_pripra_list.remove(21499016)
#プリパラ130話の除外
all_pripra_list.remove(21499041)

#ブラウザ起動、dアニメのログインページへ移動
driver = webdriver.Chrome()
driver.get('https://anime.dmkt-sp.jp/animestore/login?next_url=https%3A%2F%2Fanime.dmkt-sp.jp%2Fanimestore%2Ftp_pc%27')
time.sleep(3)

#Idを入力して次へをクリック
id_form = driver.find_element_by_id('Di_Uid')
id_form.send_keys(danime_id)
time.sleep(3)
element = driver.find_element_by_name('subForm')
element.click()
time.sleep(3)

#Passwordを入力してログインをクリック
password_form = driver.find_element_by_id('Di_Pass')
password_form.send_keys(danime_password)
time.sleep(3)
element = driver.find_element_by_name('subForm')
element.click()
time.sleep(3)

while True:
    id = random.choice(all_pripra_list)
    url = 'https://anime.dmkt-sp.jp/animestore/sc_d_pc?partId=' + str(id)
    driver.execute_script("window.open()")
    driver.switch_to.window(driver.window_handles[1]) 
    driver.get(url)
    time.sleep(1460)
    driver.close()
    driver.switch_to.window(driver.window_handles[0])

行っていることとても簡単で、Pythonのseleniumを使いブラウザ上の操作をさせているだけです。

まずは、ランダム再生する対象のリストを作成するので、見たいアニメのURLを確認します
こんなやつ → https://anime.dmkt-sp.jp/animestore/cd_pc?partId=21470001

末尾についている値が作品のIDとなっており、シリーズものだとこれが連番で振られています。なので、rengeとlistを駆使して、各話のリストを作成します。

その後、作成したリストを結合し、再生してほしくない回のIDをremoveで除外します。
(105話「ガァルル、目覚めるでちゅーっ!!」と130話「女神の想い、ママの誓い」は、特に泣いてしまう話なので、心に不意な攻撃を食らわないように除いてます。)

#プリパラシーズン1のID 21470001 ~ 21470038
pripara_1_list = list(range(21470001, 21470038))
#プリパラシーズン2のID 21471001 ~ 21471051
pripara_2_list = list(range(21471001, 21471051))
#プリパラシーズン3のID 21499001 ~ 21499051
pripara_3_list = list(range(21499001, 21499051))
#アイドルタイムプリパラのID 21784001 ~ 21784051
pripara_idol_list = list(range(21784001, 21784051))

all_pripra_list = pripara_1_list + pripara_2_list + pripara_3_list + pripara_idol_list

#プリパラ105話の除外
all_pripra_list.remove(21499016)
#プリパラ130話の除外
all_pripra_list.remove(21499041)

IDのリストができたらブラウザを操作させていきます。まずはログインページを開きます。

time.sleep(3)で画面遷移用の待機時間として3秒待たせています。

#ブラウザ起動、dアニメのログインページへ移動
driver = webdriver.Chrome()
driver.get('https://anime.dmkt-sp.jp/animestore/login?next_url=https%3A%2F%2Fanime.dmkt-sp.jp%2Fanimestore%2Ftp_pc%27')
time.sleep(3)

ここからはHTMLの中身を確認して、特定の箇所に操作をしています。
「dアカウントのID入力フォーム」にはHTMLのvalue_idとして「Di_Uid」が振られているので、
id_form = driver.find_element_by_id('Di_Uid')
で、その箇所を指定して、
id_form.send_keys(danime_id)
で、dアニメのIDを入力します。

同様に「次へ」ボタンのHTMLも確認すると、nameとして「subForm」が振られているので、
element = driver.find_element_by_name('subForm')
で、その箇所を指定して、
element.click()
で、クリックさせます。

#Idを入力して次へをクリック
id_form = driver.find_element_by_id('Di_Uid')
id_form.send_keys(danime_id)
time.sleep(3)
element = driver.find_element_by_name('subForm')
element.click()
time.sleep(3)

前の画面と同様にパスワードを入力し、ログインをクリックさせます。

#Passwordを入力してログインをクリック
password_form = driver.find_element_by_id('Di_Pass')
password_form.send_keys(danime_password)
time.sleep(3)
element = driver.find_element_by_name('subForm')
element.click()
time.sleep(3)

ログイン処理が終わったので、再生をさせていきます。dアニメはアクセスしたらそのまま再生が始まるので特に難しいことはしません。

まずは再生する対象のIDをランダムに決めます。
id = random.choice(all_pripra_list)

決めたIDをURLと結合します。
url = 'https://anime.dmkt-sp.jp/animestore/sc_d_pc?partId=' + str(id)

新しいタブを開きます。
driver.execute_script("window.open()")

操作対象を新しく開いたタブにします。
driver.switch_to.window(driver.window_handles[1])

新しく開いたタブで再生用のURLを開きます
driver.get(url)

一話が終わる時間まで待機します
time.sleep(1460)

終わったらタブを閉じます。
driver.close()

操作対象を以前のタブに戻します。
driver.switch_to.window(driver.window_handles[0])

これを繰り返しランダムに連続再生させていきます。

while True:
    id = random.choice(all_pripra_list)
    url = 'https://anime.dmkt-sp.jp/animestore/sc_d_pc?partId=' + str(id)
    driver.execute_script("window.open()")
    driver.switch_to.window(driver.window_handles[1]) 
    driver.get(url)
    time.sleep(1460)
    driver.close()
    driver.switch_to.window(driver.window_handles[0])

おわり

プリパラというアニメは200話近くあり、決して取っ付き易いものではないと私も理解しております。なので、もっと取っ付き易くプリパラへ続くコンテンツを紹介して終わりにしようと思います。

そのコンテンツは、劇場版アニメ「KING OF PRISM by PrettyRhythm」です。

この作品はプリパラの前身である「プリティーリズム」のスピンオフ作品で男性アイドルモノアニメなのですが、事前知識なしに見ても楽しめます。現に私が一番最初に触れたプリティーシリーズ(プリティーリズムやプリパラなどの総称)の作品はこの「KING OF PRISM by PrettyRhythm」の続編「KING OF PRISM -PRIDE the HERO-」になります。

「知らない作品」の、「スピンオフ」の、「続編」から見始めてドはまりしました。

ぜひみなさんも「KING OF PRISM by PrettyRhythm」を観て、プリティーシリーズに興味を持ち、プリパラを観ましょう!!