# 用Python寫一個搶票機器人
###### tags: `Python`
之前和一群轉職仔工程師組了CS50讀書會
摸了一下python,覺得自動化真的是很迷人
把繁瑣的事情都交給機器人去自動處理
我們就能釋放更多高產值~~耍廢~~的時間
於是我打算來寫一個搶票機器人
爬文研究一下,需要安裝兩個東西
ChromeDriver + Selenium
ChromeDriver[下載連結](https://chromedriver.chromium.org/downloads)
記得要安裝與Chrome相同版本
Selenium在terminal上輸入以下指令就可以
```
pip install selenium
```
開一個.py檔
最上頭輸入
```
from selenium import webdriver
driver = webdriver.Chrome('存放ChromeDriver的本地位置')
driver.get('要去的頁面網址')
```
以KKTIX為例,我們要做的就是把和頁面互動的點擊事件
變成自動化的流程
用Chrome打開KKTIX頁面,進入開發人員工具
點擊左上角的滑鼠按鈕
它會顯示你所移動到的元件對應的HTML

再對那行對應的HTML按右鍵 > Copy > Copy XPath

```
driver.find_element(by=By.XPATH, value="貼上XPath"]").click()
```
就完成自動點選了
進入登入頁面,要自動填入資料的話
只要按下面的程式碼操作即可
```
account = driver.find_element(by=By.XPATH, value="//*[@id=\"user_login\"]")
account.clear()
account.send_keys("你的帳號")
password = driver.find_element(by=By.XPATH, value="//*[@id=\"user_password\"]")
password.clear()
password.send_keys("你的密碼")
```
如果遇到畫面元件還沒載入完成,就進行操作的話
會報出"Unable to locate element"的錯誤
這時候到上方import
```
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
```
然後在執行時輸入time out時間
```
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "XPath"))).click()
```
如果是要條件達成(例如選好票種和同意條款)才能點選按鈕的話
調用下面的api
```
nextStepBtn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "XPath")))
nextStepBtn.click()
```
下拉選單選擇日期的操作
可以選擇透過id、class name或name拿到element
```
expMonth = Select(driver.find_element_by_name(name="名稱"))
expMonth.select_by_visible_text('07')
expYear = Select(driver.find_element_by_name(name="名稱"))
expYear.select_by_visible_text('2046')
```
大致上的操作就是這樣
不過實際操作時,會遇到Google驗證的問題
目前還沒找到方法繞過reCAPTCHA
我的折衷辦法是在VS裝IPython
複製貼上reCAPTCHA前的指令,在驗證那關人工手動操作
再貼上後面輸入資訊、付款方式的程式碼
所以基本上仍是個半殘機器人
不過已經省去了很多時間
之後有空再繼續研究