【Python】disneyチケット予約をseleniumで自動操作してみた（本番未実行）

<h1>なぜ作ろうと思ったか</h1>

コロナ禍でチケットが争奪戦になると知り、
「うわ、めんどくせぇ、、、」って思いました（小並感）。

そこで、selenium使ってアクセスとあわよくばブラウザ操作を自動化できないかなって考えて、
表題通りのことをしようと思いました。

ちなみに過去にTinderのスワイプを半自動化（このアプリケーション作るためだけに登録した）
したこともあって、
ある程度ブラウザ操作に関しての知識はありました。

<a href="https://www.youtube.com/watch?v=LgZ8Li97yoM&t=856s">お世話になった教材:Pythonで面倒な「ブラウザ操作」や「データ収集」の作業を自動化しよう｜Webスクレイピングの基本的な内容をわかりやすく解説｜PythonでWebスクレイピング第01回</a>

<h1>なぜpython</h1>
日頃からJavaScriptをメインで使っていますが、
<ul>
<li>コードが簡潔</li>
<li>seleniumに関する情報が多い</li>
</ul>
という理由でpythonを使っています。

実行環境はwindows10+vscode+chromeです。楽チン。
なおpythonは完全感覚でやっているので、説明が浅くなると思われます。ご留意を。

<h1>URLに飛ぼう</h1>
※HPの仕様が変わったら機能しなくなるかもしれません。


```
#事前にchromedriver.exeをインストール
#pip install selenium

from logging import log
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By
```
パッケージのインポートです。

Time：sleep()で動作に間隔をつける
options:「ブラウザが読み込んだら、以下処理を実装」みたいな処理のときに使う

```
    options = Options() #optionsの呼び出し
    options.page_load_strategy = 'normal' #ページ全体がロードするまで待機
    browser = webdriver.Chrome('chromedriverが入っているパス', options=options)

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

    browser.get(url) #ブラウザオープン

    browser.maximize_window()  #ウィンドウの最大化
```

アクセスの処理です。
ページがロードするまでブラウザの処理を待って、その後処理を加えるというものです。
<a href="https://www.selenium.dev/documentation/ja/webdriver/page_loading_strategy/">ページ読み込み戦略</a>

<h1>カレンダーめくる処理</h1>

![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047811/658b68c7-601c-8817-00a4-fade60854597.png)

この画面が出てくるので、行きたい月までクリックしてもらいます。

```
    next = browser.find_element_by_class_name('slick-next')

    sleep(1)
    next.click()

    sleep(1)
    next.click()
```
クラスの名前はchromeの開発者ツールで取って来れます。

<h1>日付選択と受け取り方法選択</h1>
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047811/40b7506d-d058-c353-b5d5-f3a071585074.png)

```
    # 日付選択
    sleep(1)
    elems = browser.find_elements_by_tag_name("a")
    for elem in elems:
        attr = elem.get_attribute("data-daynumbercount")
        if attr == "開発者ツールで行きたい日のdata-daynumber-countの値を入れる": 
            print('ok1')
            elem.click()

    # 受け取り方法
    sleep(1)
    print_btn = browser.find_element_by_id("searchEticket")
    print_btn.click()
```

以下記事をガン見しました。控えめに言って神（感謝です）。
<a href="https://qiita.com/captainUmaru/items/2b23660c379c5b1e7fff">例の神記事：Seleniumを使用してhtmlのカスタムデータ属性を要素として取得したい</a>

<h1>ここから先の処理</h1>

![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047811/a9118e4b-bcd7-f575-4172-b1f4f6d6d5bb.png)
カードを選ぶ処理ですが、選択しても遷移されない状態になっているため、ここからは出たところ勝負になってしまう。
あくまでもチケットを取るために多くのアクセスをしたいだけなので処理の記述は終わり（怖いからスマホでもアクセスするけどね）。
そして、while文を付けてカウントさせれば、、、
一定間隔で複数アクセスができるはず。たぶん。

<h1>必要かもしれない処理</h1>
<ul>
<li>
<a href="https://nosuke.net/347/%E3%83%87%E3%82%A3%E3%82%BA%E3%83%8B%E3%83%BC%E3%81%AE%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%8C%E5%86%8D%E8%B2%A9%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89%E3%81%84%E3%81%A1%E6%97%A9%E3%81%8F%E9%9F%B3/">ディズニーのチケットサイトに接続できたら音を鳴らす</a><br>
音を鳴らす処理よりも、個人的には例外処理でエラーページが出たらリロードするのは必要かも
</li>
<li>
<a href="https://urtrip.jp/tdl-tds-tickets/#WiFi4G">ディズニーチケット予約攻略法 – 実際に予約できたポイントを詳しく解説</a><br>
</li>
ユーザージャーニーとして参考にしました。<br>
実行テストができないためコメントアウトしているが、パークや枚数の選択はできるはず（「一覧から探す」からクラスが取れた）<br>
あとは自動スクロールとかクレカ入力とかもできればいいが、チケット販売開始しないとクラスも取れないし、そもそもそんな余裕ないのでひとまずこれまで。
</ul>

(2021/04/29　追記)
ログイン処理を書くのを忘れていたので記述。
また、ログイン→購入の流れにしたいので、urlを変更した

```
    url = 'https://reserve.tokyodisneyresort.jp/top/' # ディズニートップページ

    browser.get(url)

    browser.maximize_window()

    #ログイン処理
    login_btn = browser.find_element_by_class_name('nav02')
    sleep(1)
    login_btn.click()

    userId = browser.find_element_by_id('_userId')
    userId.send_keys("メールアドレス")
    sleep(1)
    password = browser.find_element_by_id('_password')
    password.send_keys("パスワード")
    sleep(1)
    login_form = browser.find_element_by_class_name("loginform")
    login_form.click()
    sleep(5)

    browser.get('https://reserve.tokyodisneyresort.jp/ticket/search/') #チケットページ
```

<h1>まとめ</h1>
自動操作っていいなと感じる開発でした（語彙力）
乱数使ったりしてbot対策したり、
もっと間隔空けたほうが弾かれずにすみますね！！

何かあればご教授ください🙇‍♂️