Published on

Seleniumでディズニーチケット戦争の自動化

Authors
  • avatar
    Name
    Kikusan
    Twitter

概要

Seleniumでディズニーチケット戦争を自動化できました。
購入のところは手動ですが、一度繋がりさえすればその後はセッションタイムアウトしない限り、購入前のリダイレクトでログインとかしても大丈夫でした。

ログインのコードも書いてますが、「一度つながるまでリロードする」で十分だったのでそれ以外はコメントアウトしてます。
決めた日付のチケットのところまで遷移するようになっているのは趣味です。なくてもいい。

Seleniumを使用するには適当なパスにChromeDriverをおいておくことと、そのVersionにあったChromeが必要なので注意してください。

リロード間隔は2秒にして、DoSにならないようにしています。

ソース

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By


url = 'https://reserve.tokyodisneyresort.jp/ticket/search/'

driver = webdriver.Chrome(executable_path='/your own driver pass/chromedriver')

# 予約月 - 当月
month_diff = 1

# 当月1日からの日数 11月 -> 12/5 = 35
day_number = "55"


def login():
    loop_on = True
    cnt = 0
    while loop_on:
        cnt += 1
        try:
            driver.get(url)
            sleep(3)
            login_btn = driver.find_element(By.XPATH, "//a[@href='/fli/signin/']")
            loop_on = False
            login_btn.click()
            sleep(2)

            user_id = driver.find_element(By.ID, '_userId')
            user_id.send_keys("userid")
            password = driver.find_element(By.ID, '_password')
            password.send_keys("password")
            sleep(1)
            login_form = driver.find_element(By.NAME, "confirm")
            login_form.click()
            sleep(120)
        except Exception as ex:
            print(ex.__class__.__name__, cnt)


def get_ticket():
    loop_on = True
    cnt = 0

    while loop_on:

        cnt += 1

        try:
            driver.get(url)
            sleep(1)
            slick_next = driver.find_element(By.CLASS_NAME, 'slick-next')

            loop_on = False

            for _ in range(month_diff):
                slick_next.click()
                sleep(2)

            date = driver.find_element(By.XPATH, f"//a[@data-daynumbercount='{day_number}']")
            date.click()

            sleep(3)

            button = driver.find_element(By.ID, 'searchEticket')
            button.click()

        except Exception as e:
            print(e.__class__.__name__, cnt)

        sleep(2)


if __name__ == '__main__':
    # login()
    # print("login succeed")
    get_ticket()