Try   HackMD

用Python寫一個搶票機器人

tags: Python

之前和一群轉職仔工程師組了CS50讀書會
摸了一下python,覺得自動化真的是很迷人
把繁瑣的事情都交給機器人去自動處理
我們就能釋放更多高產值耍廢的時間

於是我打算來寫一個搶票機器人
爬文研究一下,需要安裝兩個東西
ChromeDriver + Selenium

ChromeDriver下載連結
記得要安裝與Chrome相同版本

Selenium在terminal上輸入以下指令就可以

pip install selenium

開一個.py檔
最上頭輸入

from selenium import webdriver
driver = webdriver.Chrome('存放ChromeDriver的本地位置')
driver.get('要去的頁面網址')

以KKTIX為例,我們要做的就是把和頁面互動的點擊事件
變成自動化的流程
用Chrome打開KKTIX頁面,進入開發人員工具
點擊左上角的滑鼠按鈕
它會顯示你所移動到的元件對應的HTML

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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前的指令,在驗證那關人工手動操作
再貼上後面輸入資訊、付款方式的程式碼
所以基本上仍是個半殘機器人
不過已經省去了很多時間
之後有空再繼續研究