# 用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 ![](https://i.imgur.com/G81szHG.jpg) 再對那行對應的HTML按右鍵 > Copy > Copy XPath ![](https://i.imgur.com/hxlXcyA.png) ``` 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前的指令,在驗證那關人工手動操作 再貼上後面輸入資訊、付款方式的程式碼 所以基本上仍是個半殘機器人 不過已經省去了很多時間 之後有空再繼續研究