乃木坂46のライブの応募を自動で行うシステムを作ってみた

# はじめに
こんばんは、ダンです。

いきなりですが、僕は乃木坂46が好きで、(俗にいう乃木オタってやつ)
![スクリーンショット 2024-01-17 5.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/ab4836d8-798e-4e83-e89c-e2b73e6f8e91.png)
ライブが3月上旬にあるということで、全部で10回応募しないといけない。
それも応募1つにつき5分もかかってしまう、、とてもとても面倒だ、、
ライブの応募を自動でできたらなあ、、、作っちゃうか！
と思って、Pythonでスクレイピングを用いて自動でライブに応募するシステムを作ってみました！

↓実際の購入者情報入力画面
![スクリーンショット 2024-01-17 4.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/f4fcff0e-2327-a2ad-b459-5552bf2818f4.png)
![スクリーンショット 2024-01-17 4.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/45719849-756c-eb0f-318e-b517cd5e948e.png)
この応募を10回、、面倒すぎる、、、


# システム作成
## インストール

まずはスクレイピングに必要なseleniumとブラウザを立ち上げるためにChrome driverをインストール。
```python
pip3 install selenium
brew install chromedriver
```

## ブラウザの立ち上げ
次にブラウザを立ち上げます。
```python
from selenium import webdriver
browser = webdriver.Chrome()
```
実行すると、
![スクリーンショット 2024-01-17 5.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/87e992b5-2f67-75dd-2b63-ed1661ff4287.png)
Chromeが立ち上がりました。

ここで、エラーは出ていないけどChromeがすぐに閉じてしまったり、クラッシュしたりして4,5時間ぐらい躓いてしまうという事態が起こってしまったのですが、その詳細と対処法は次の記事で書こうと思います。

## サイトを開く
ライブに応募するために乃木坂46会員サイトを開きます。
```python
#URLのサイトをChromeで開く
url = 'https://sp.nogizaka46.com/'
browser.get(url)
```

実行すると
![スクリーンショット 2024-01-17 5.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/58631012-597f-1b73-8c33-43eca459c32d.png)

乃木坂46の会員サイトを開くことができました。(いやビジュ良すぎでしょ、、笑)
会員登録/ログインボタンがあるので、ボタンを押してログインしていきます。

## ログイン
ログインするために、Chromeの検証ツールでログインボタンの要素を確認して取得し、ログインボタンを押します。
```python
from selenium.webdriver.common.by import By
#html情報からclassを指定、テキスト情報を抽出
elem_login_btn = browser.find_element(By.CLASS_NAME, "rounded")
#ボタンをクリック
elem_login_btn.click()
```
これで
![スクリーンショット 2024-01-17 5.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/d7df0069-2727-e1a8-1cae-88209fbb130c.png)
自動でボタンを押してログイン/会員登録ページに飛ぶことができました。
ここから、「メールアドレスでログイン」ボタンを押してログインしていきます。

ログインするために、Chromeの検証ツールでログインボタンの要素を確認して取得し、「メールアドレスでログイン」ボタンを押します。
```python
from time import sleep
#2秒間待機
sleep(2)
elem_mail_btn = browser.find_elements(By.CSS_SELECTOR, ".flex.w-full.items-center.justify-between.rounded-md.bg-blueGray-700.p-12.text-14.font-semibold.tracking-wider.text-white.mt-2")
elem_mail_btn[3].click()
```
ページが移動してすぐに次の動作を行うとエラーが出てしまうので、sleep関数を使い、2秒間待機させてから「メールアドレスでログイン」ボタンの要素を取得しました。
また、上の写真を見れば一目瞭然ですが、
・「dアカウントでログイン」ボタン
・「auIDでログイン」ボタン
・「SoftBank IDでログイン」ボタン
・「メールアドレスでログイン」ボタン
が同じ要素を持っていて、今回は「メールアドレスでログイン」ボタンを押したかったので、配列を用いて要素の4つ目の情報を取得しました。

実行すると
![スクリーンショット 2024-01-17 5.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/b55c60a3-6ed5-6ea3-509b-bbe82220032d.png)
ログイン画面に移行しました。

次に、
・メールアドレスの入力
・パスワードの入力
・ログインボタンを押す
を行います。
Chromeの検証ツールでログインボタンの要素を確認して、
```python
from time import sleep
#2秒間待機
sleep(2)
#メールアドレスの入力(ダミーのメールアドレス)
browser.find_element(By.XPATH, "(//input[@type='email'])").send_keys("abcdefghijklmnopq")
#パスワードの入力(ダミーのパスワード)
browser.find_element(By.XPATH, "(//input[@type='password'])").send_keys("abcdefghijklmnopq")
#ログインボタンのクリック
elem_login2_btn = browser.find_element(By.CLASS_NAME, "css-y5yuzb")
elem_login2_btn.click()
```
実行すると
![スクリーンショット 2024-01-17 5.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/4a7c185d-c3fb-5d1f-e8db-c7245c65e734.png)
ログインできました。

## 申し込みフォーム〜応募
今回は上の写真の右側の「モバイル会員先行受付」ページを押したいので、またまたChromeの検証ツールでログインボタンの要素を確認して、
```python
#2秒待機
sleep(2)
elem_live_btn = browser.find_elements(By.CSS_SELECTOR, ".flex.flex-grow")
elem_live_btn[1].click()
```
また、今回も上の写真を見れば一目瞭然ですが、
「34thアンダーライブ モバイル限定配信チケット」ボタンと
「乃木坂46th 12th year birthdaylive 1次先行」ボタンが同じ要素を持っていたので、配列を用いて欲しい情報を取得しました。

実行すると、
![スクリーンショット 2024-01-17 5.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/47e9b8d4-b2c1-f8b2-389f-f77ff4f3840b.png)
一次先行ページに飛びました。

あとは新しく使う技術はなく、応募まで
検証モードで要素を確認する→要素を取得する→アクションを起こす→ページ移動
の繰り返しでした。なので省略します。

ひたすら繰り返し、注意事項にチェックをつけ、
```python
elem_lastname_btn = browser.find_element(By.ID, 'last_name')
elem_lastname_btn.send_keys('月火水木君曜日金土日')
elem_firstname_btn = browser.find_element(By.ID, 'first_name')
elem_firstname_btn.send_keys('月火水木君曜日金土日')
elem_lastnamekana_btn = browser.find_element(By.ID, 'last_name_kana')
elem_lastnamekana_btn.send_keys('アイウエオアイウエオ')
elem_firstnamekana_btn = browser.find_element(By.ID, 'first_name_kana')
elem_firstnamekana_btn.send_keys('ガハハハハハハ')
```
一部ですが、こんな感じでIDから要素を取得して個人情報を入力し、、、

![スクリーンショット 2024-01-17 6.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/a40b353b-4e46-ab5e-8d93-1b5f2b6cb5d0.png)
自動で申し込みに成功しました！！

# まとめ
今回はPythonでスクレイピングを使って乃木坂46のライブの申し込みを自動で行ってみました。
行った結果、システムの作成に6時間くらいかかってしまい、約100回分ぐらい手動で応募する時間を溶かしてしまいました、、(全ては最初のChromeのせい、、)
昔は
```python
browser.find_element_by_id()
```
で要素を取得できていたのに、、
```python
browser.find_element(By.ID,)
```
と変わった記法に慣れるのにも時間がかかってしまいました。
ですが、作っているときは楽しく、いろいろ勉強になったので良かったと思います！
本システムを使うと1回の応募は30秒で終わります。
手動では5分なので4分半巻いてることに！
ですが、今回の作成で6時間かかっているので喜べない、、、笑
ライブに自動で応募するシステムを作ろうと思っている人は本記事を参考にして行うよりも作成しないことをお勧めします！(手動の方が時間効率が良すぎる笑)
また何か作成したら記事を書こうと思います！
ライブ当たりますように！！！🙏


もし改善点やコメントがあればお気軽にお願いいたします！
コードレビュー大歓迎です！むしろしていただきたいです！
よろしくお願いします！

最後まで読んでいただきありがとうございました！