ver 2021-12-24, support fami ticket
parent
9e0d7e9e95
commit
e7b222e42f
|
@ -26,8 +26,9 @@ the default path is the script path + "webdriver/chromedriver", My suggestion is
|
||||||
|
|
||||||
PS:
|
PS:
|
||||||
* this script only running in python3. (原始碼只可以在 python3 下執行。)
|
* this script only running in python3. (原始碼只可以在 python3 下執行。)
|
||||||
* 請先確定你的python 執行環境下已安裝 selenium及undetected_chromedriver 或相關的套件,請參考 pip-reg.txt 檔案內容。
|
* 請先確定你的python 執行環境下已安裝 selenium 及 selenium-stealth 或相關的套件,請參考 pip-reg.txt 檔案內容。
|
||||||
* 請手動下載新版的 ChromeDriver(https://chromedriver.chromium.org/), 建議放在搶票程式同一個目錄下,在執行搶票程式前,前請先手動點 ChromeDriver 的執行檔。最後透過 python3 執行 settings.py 就可以有 GUI 的設定界面。)
|
* 請到ChromeDriver網站 (https://chromedriver.chromium.org/) 下載與您目前相同版本的 ChromeDriver 的執行檔,放在搶票程式的webdriver目錄下(Mac電腦請放到 MaxBot.app 套件裡的 /Contents/Resources/webdriver/),在執行搶票程式前,第一次執行搶票主程式前,前請先手動點 ChromeDriver 的執行檔。
|
||||||
|
* 最後透過 python3 執行 settings.py 就可以有 GUI 的設定界面。)
|
||||||
* 如果你是使用 macOS 並且執行環境沒有 python3,請 python 官方網站(https://www.python.org/downloads/)來安裝 python3, 如果在 macOS 裡會使用終端機(Terminal),建議使用 https://brew.sh/ 安裝 python3.
|
* 如果你是使用 macOS 並且執行環境沒有 python3,請 python 官方網站(https://www.python.org/downloads/)來安裝 python3, 如果在 macOS 裡會使用終端機(Terminal),建議使用 https://brew.sh/ 安裝 python3.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
|
||||||
from selenium.webdriver.chrome.service import Service
|
from selenium.webdriver.chrome.service import Service
|
||||||
|
|
||||||
# for uc
|
# for uc
|
||||||
import undetected_chromedriver.v2 as uc
|
import undetected_chromedriver as uc
|
||||||
|
|
||||||
# for wait #1
|
# for wait #1
|
||||||
import time
|
import time
|
||||||
|
@ -55,7 +55,7 @@ ssl._create_default_https_context = ssl._create_unverified_context
|
||||||
#附註1:沒有寫的很好,很多地方應該可以模組化。
|
#附註1:沒有寫的很好,很多地方應該可以模組化。
|
||||||
#附註2:
|
#附註2:
|
||||||
|
|
||||||
CONST_APP_VERSION = u"MaxBot (2021.12.01)"
|
CONST_APP_VERSION = u"MaxBot (2021.12.24)"
|
||||||
|
|
||||||
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
|
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
|
||||||
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
|
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
|
||||||
|
@ -337,16 +337,36 @@ if not config_dict is None:
|
||||||
#driver = webdriver.Chrome(desired_capabilities=caps, executable_path=chromedriver_path)
|
#driver = webdriver.Chrome(desired_capabilities=caps, executable_path=chromedriver_path)
|
||||||
|
|
||||||
# method 4:
|
# method 4:
|
||||||
#chrome_service = Service(chromedriver_path)
|
chrome_service = Service(chromedriver_path)
|
||||||
#driver = webdriver.Chrome(options=chrome_options, service=chrome_service)
|
#driver = webdriver.Chrome(options=chrome_options, service=chrome_service)
|
||||||
|
|
||||||
# method 5:
|
# method 5: uc
|
||||||
|
'''
|
||||||
options = uc.ChromeOptions()
|
options = uc.ChromeOptions()
|
||||||
options.add_argument("--no-sandbox --no-first-run --no-service-autorun --password-store=basic")
|
options.add_argument("--no-first-run --no-service-autorun --password-store=basic")
|
||||||
options.page_load_strategy="eager"
|
options.page_load_strategy="eager"
|
||||||
#print("strategy", options.page_load_strategy)
|
#print("strategy", options.page_load_strategy)
|
||||||
driver = uc.Chrome(options=options)
|
if os.path.exists(chromedriver_path):
|
||||||
|
print("Use user driver path:", chromedriver_path)
|
||||||
|
driver = uc.Chrome(service=chrome_service, options=options, suppress_welcome=False)
|
||||||
|
else:
|
||||||
|
print("Not assign driver path...")
|
||||||
|
driver = uc.Chrome(options=options, suppress_welcome=False)
|
||||||
|
'''
|
||||||
|
|
||||||
|
# method 6: Selenium Stealth
|
||||||
|
from selenium_stealth import stealth
|
||||||
|
driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
|
||||||
|
|
||||||
|
# Selenium Stealth settings
|
||||||
|
stealth(driver,
|
||||||
|
languages=["zh-TW", "zh"],
|
||||||
|
vendor="Google Inc.",
|
||||||
|
platform="Win32",
|
||||||
|
webgl_vendor="Intel Inc.",
|
||||||
|
renderer="Intel Iris OpenGL Engine",
|
||||||
|
fix_hairline=True,
|
||||||
|
)
|
||||||
|
|
||||||
if browser == "firefox":
|
if browser == "firefox":
|
||||||
# default os is linux/mac
|
# default os is linux/mac
|
||||||
|
@ -2210,137 +2230,24 @@ def kktix_reg_new(url, answer_index, kktix_register_status_last):
|
||||||
|
|
||||||
return answer_index, registerStatus
|
return answer_index, registerStatus
|
||||||
|
|
||||||
def fami_date_auto_select(url):
|
|
||||||
date_list = None
|
|
||||||
try:
|
|
||||||
date_list = driver.find_elements(By.CSS_SELECTOR, '#game_page > table > tbody > tr:nth-child(4) > td > table > tbody > tr')
|
|
||||||
except Exception as exc:
|
|
||||||
#print("find #game_page date list fail")
|
|
||||||
pass
|
|
||||||
|
|
||||||
if date_list is not None:
|
|
||||||
if len(date_keyword) == 0:
|
|
||||||
el = None
|
|
||||||
|
|
||||||
if date_auto_select_mode == CONST_FROM_TOP_TO_BOTTOM:
|
|
||||||
|
|
||||||
row_index = 0
|
|
||||||
for row in date_list:
|
|
||||||
row_index += 1
|
|
||||||
|
|
||||||
row_is_enabled=False
|
|
||||||
try:
|
|
||||||
row_is_enabled = row.is_enabled()
|
|
||||||
except Exception as exc:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if row_is_enabled:
|
|
||||||
row_text = ""
|
|
||||||
try:
|
|
||||||
row_text = row.text
|
|
||||||
except Exception as exc:
|
|
||||||
#print("get text fail")
|
|
||||||
break
|
|
||||||
|
|
||||||
#print("date row_text:", row_index, row_text)
|
|
||||||
if len(row_text) > 0 and "/" in row_text:
|
|
||||||
try:
|
|
||||||
el = row.find_element(By.TAG_NAME, 'img')
|
|
||||||
if el is not None:
|
|
||||||
#print("bingo, found first date button")
|
|
||||||
break
|
|
||||||
except Exception as exc:
|
|
||||||
print("find date image button fail")
|
|
||||||
else:
|
|
||||||
# from bottom to top
|
|
||||||
print("not implement!")
|
|
||||||
|
|
||||||
row_index = 0
|
|
||||||
for row in date_list:
|
|
||||||
row_index += 1
|
|
||||||
|
|
||||||
row_is_enabled=False
|
|
||||||
try:
|
|
||||||
row_is_enabled = row.is_enabled()
|
|
||||||
except Exception as exc:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if row_is_enabled:
|
|
||||||
row_text = ""
|
|
||||||
try:
|
|
||||||
row_text = row.text
|
|
||||||
except Exception as exc:
|
|
||||||
print("get text fail")
|
|
||||||
break
|
|
||||||
|
|
||||||
#print("date row_text:", row_index, row_text)
|
|
||||||
if len(row_text) > 0 and "/" in row_text:
|
|
||||||
try:
|
|
||||||
el = row.find_element(By.TAG_NAME, 'img')
|
|
||||||
if el is not None:
|
|
||||||
print("bingo, found first date button")
|
|
||||||
break
|
|
||||||
except Exception as exc:
|
|
||||||
print("find date image button fail")
|
|
||||||
|
|
||||||
if el is not None:
|
|
||||||
# first date.
|
|
||||||
try:
|
|
||||||
el.click()
|
|
||||||
except Exception as exc:
|
|
||||||
#print("try to click date image button fail")
|
|
||||||
pass
|
|
||||||
|
|
||||||
else:
|
|
||||||
# match keyword.
|
|
||||||
match_keyword_row = False
|
|
||||||
|
|
||||||
row_index = 0
|
|
||||||
for row in date_list:
|
|
||||||
row_index += 1
|
|
||||||
|
|
||||||
row_text = ""
|
|
||||||
try:
|
|
||||||
row_text = row.text
|
|
||||||
except Exception as exc:
|
|
||||||
print("get text fail")
|
|
||||||
break
|
|
||||||
|
|
||||||
if len(row_text) > 0:
|
|
||||||
if date_keyword in row_text:
|
|
||||||
match_keyword_row = True
|
|
||||||
|
|
||||||
el = None
|
|
||||||
try:
|
|
||||||
el = row.find_element(By.TAG_NAME, 'img')
|
|
||||||
except Exception as exc:
|
|
||||||
print("find date image button fail")
|
|
||||||
|
|
||||||
if el is not None:
|
|
||||||
# first date.
|
|
||||||
try:
|
|
||||||
el.click()
|
|
||||||
except Exception as exc:
|
|
||||||
print("try to click date image button fail")
|
|
||||||
|
|
||||||
if match_keyword_row:
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
# PURPOSE: get target area list.
|
# PURPOSE: get target area list.
|
||||||
def get_fami_target_area(area_keyword):
|
def get_fami_target_area(date_keyword, area_keyword_1, area_keyword_2):
|
||||||
areas = None
|
areas = None
|
||||||
|
|
||||||
area_list = None
|
area_list = None
|
||||||
try:
|
try:
|
||||||
#print("try to find area block")
|
#print("try to find area block")
|
||||||
my_css_selector = "#game_page > table > tbody > tr:nth-child(4) > td > table:nth-child(5) > tbody > tr > td:nth-child(1) > table > tbody > tr:nth-child(2) > td:nth-child(2) > table > tbody > tr:nth-child(2) > td > table > tbody > tr"
|
my_css_selector = "table.session__list > tbody > tr"
|
||||||
area_list = driver.find_elements(By.CSS_SELECTOR, my_css_selector)
|
area_list = driver.find_elements(By.CSS_SELECTOR, my_css_selector)
|
||||||
if area_list is not None:
|
if area_list is not None:
|
||||||
|
#print("lenth of row:", len(area_list))
|
||||||
if len(area_list) > 0:
|
if len(area_list) > 0:
|
||||||
ret = True
|
ret = True
|
||||||
|
|
||||||
if len(area_keyword) == 0:
|
if len(date_keyword)==0 and len(area_keyword_1)==0 and len(area_keyword_2) == 0:
|
||||||
|
# select all.
|
||||||
areas = area_list
|
areas = area_list
|
||||||
else:
|
else:
|
||||||
# match keyword.
|
# match keyword.
|
||||||
|
@ -2349,49 +2256,180 @@ def get_fami_target_area(area_keyword):
|
||||||
row_index = 0
|
row_index = 0
|
||||||
for row in area_list:
|
for row in area_list:
|
||||||
row_index += 1
|
row_index += 1
|
||||||
|
#print("row index:", row_index)
|
||||||
|
|
||||||
row_is_enabled=False
|
date_html_text = ""
|
||||||
|
area_html_text = ""
|
||||||
|
|
||||||
|
my_css_selector = "td:nth-child(1)"
|
||||||
|
td_date = row.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
if td_date is not None:
|
||||||
|
#print("date:", td_date.text)
|
||||||
|
date_html_text = td_date.text
|
||||||
|
|
||||||
|
my_css_selector = "td:nth-child(2)"
|
||||||
|
td_area = row.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
if td_area is not None:
|
||||||
|
#print("area:", td_area.text)
|
||||||
|
area_html_text = td_area.text
|
||||||
|
|
||||||
|
|
||||||
|
is_enabled = False
|
||||||
|
my_css_selector = "button"
|
||||||
|
td_button = row.find_element(By.TAG_NAME , my_css_selector)
|
||||||
|
if td_button is not None:
|
||||||
|
is_enabled = td_button.is_enabled()
|
||||||
|
|
||||||
|
if not is_enabled:
|
||||||
|
# must skip this row.
|
||||||
|
continue
|
||||||
|
|
||||||
|
row_text = ""
|
||||||
try:
|
try:
|
||||||
row_is_enabled = row.is_enabled()
|
row_text = row.text
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
print("get text fail")
|
||||||
|
break
|
||||||
|
|
||||||
if row_is_enabled:
|
if len(row_text) > 0:
|
||||||
row_text = ""
|
# check date.
|
||||||
try:
|
is_match_date = False
|
||||||
row_text = row.text
|
if len(date_keyword) > 0:
|
||||||
except Exception as exc:
|
if date_keyword in date_html_text:
|
||||||
print("get text fail")
|
#print("is_match_date")
|
||||||
break
|
is_match_date = True
|
||||||
|
else:
|
||||||
|
is_match_date = True
|
||||||
|
|
||||||
if len(row_text) > 0:
|
# check area.
|
||||||
#print("area row_text:", row_index, row_text)
|
is_match_area = False
|
||||||
if area_keyword in row_text:
|
if len(area_keyword_1) > 0:
|
||||||
areas.append(row)
|
if area_keyword_1 in area_html_text:
|
||||||
if len(areas)==0:
|
#print("is_match_area area_keyword_1")
|
||||||
|
is_match_area = True
|
||||||
|
# check keyword 2
|
||||||
|
if len(area_keyword_2) > 0:
|
||||||
|
if area_keyword_2 in area_html_text:
|
||||||
|
#print("is_match_area area_keyword_2")
|
||||||
|
is_match_area = True
|
||||||
|
else:
|
||||||
|
is_match_area = True
|
||||||
|
|
||||||
|
if is_match_date and is_match_area:
|
||||||
|
#print("bingo, row text:", row_text)
|
||||||
|
#areas.append(row)
|
||||||
|
# add button instead of row.
|
||||||
|
areas.append(td_button)
|
||||||
|
|
||||||
|
|
||||||
|
if area_auto_select_mode == CONST_FROM_TOP_TO_BOTTOM:
|
||||||
|
print("only need first item, break area list loop.")
|
||||||
|
break
|
||||||
|
|
||||||
|
return_row_count = len(areas)
|
||||||
|
#print("return_row_count:", return_row_count)
|
||||||
|
if return_row_count==0:
|
||||||
areas = None
|
areas = None
|
||||||
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
print("find #game_page date list fail")
|
print("find #session date list fail")
|
||||||
#print(exc)
|
print(exc)
|
||||||
|
|
||||||
return areas
|
return areas
|
||||||
|
|
||||||
# purpose: area auto select
|
|
||||||
# return:
|
|
||||||
# True: area block appear.
|
|
||||||
# False: area block not appear.
|
|
||||||
# ps: return value for date auto select.
|
|
||||||
def fami_area_auto_select(url):
|
|
||||||
ret = False
|
|
||||||
|
|
||||||
areas = get_fami_target_area(area_keyword_1)
|
def fami_activity(url):
|
||||||
if areas is None:
|
#print("fami_activity bingo")
|
||||||
print("use area keyword #2", area_keyword_2)
|
|
||||||
areas = get_fami_target_area(area_keyword_2)
|
#---------------------------
|
||||||
|
# part 1: press "buy" button.
|
||||||
|
#---------------------------
|
||||||
|
fami_start_to_buy_button = None
|
||||||
|
try:
|
||||||
|
fami_start_to_buy_button = driver.find_element(By.ID, 'buyWaiting')
|
||||||
|
if fami_start_to_buy_button is not None:
|
||||||
|
if fami_start_to_buy_button.is_enabled():
|
||||||
|
fami_start_to_buy_button.click()
|
||||||
|
time.sleep(0.5)
|
||||||
|
except Exception as exc:
|
||||||
|
print("click buyWaiting button fail")
|
||||||
|
print(exc)
|
||||||
|
|
||||||
|
|
||||||
area = None
|
def fami_home(url):
|
||||||
|
print("fami_home bingo")
|
||||||
|
|
||||||
|
is_select_box_visible = False
|
||||||
|
|
||||||
|
#---------------------------
|
||||||
|
# part 3: fill ticket number.
|
||||||
|
#---------------------------
|
||||||
|
ticket_el = None
|
||||||
|
is_assign_ticket_number = False
|
||||||
|
try:
|
||||||
|
my_css_selector = "tr.ticket > td > select"
|
||||||
|
ticket_el = driver.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
if ticket_el is not None:
|
||||||
|
if ticket_el.is_enabled():
|
||||||
|
is_select_box_visible = True
|
||||||
|
|
||||||
|
ticket_number_select = Select(ticket_el)
|
||||||
|
if ticket_number_select is not None:
|
||||||
|
try:
|
||||||
|
#print("get select ticket value:" + Select(ticket_number_select).first_selected_option.text)
|
||||||
|
if ticket_number_select.first_selected_option.text=="0" or ticket_number_select.first_selected_option.text=="選擇張數":
|
||||||
|
# target ticket number
|
||||||
|
ticket_number_select.select_by_visible_text(ticket_number)
|
||||||
|
is_assign_ticket_number = True
|
||||||
|
except Exception as exc:
|
||||||
|
print("select_by_visible_text ticket_number fail")
|
||||||
|
print(exc)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# try target ticket number twice
|
||||||
|
ticket_number_select.select_by_visible_text(ticket_number)
|
||||||
|
is_assign_ticket_number = True
|
||||||
|
except Exception as exc:
|
||||||
|
print("select_by_visible_text ticket_number fail...2")
|
||||||
|
print(exc)
|
||||||
|
|
||||||
|
# try buy one ticket
|
||||||
|
try:
|
||||||
|
ticket_number_select.select_by_visible_text("1")
|
||||||
|
is_assign_ticket_number = True
|
||||||
|
except Exception as exc:
|
||||||
|
print("select_by_visible_text 1 fail")
|
||||||
|
pass
|
||||||
|
except Exception as exc:
|
||||||
|
print("click buyWaiting button fail")
|
||||||
|
print(exc)
|
||||||
|
|
||||||
|
#---------------------------
|
||||||
|
# part 4: press "next" button.
|
||||||
|
#---------------------------
|
||||||
|
if is_assign_ticket_number:
|
||||||
|
fami_assign_site_button = None
|
||||||
|
try:
|
||||||
|
my_css_selector = "div.col > a.btn"
|
||||||
|
fami_assign_site_button = driver.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
if fami_assign_site_button is not None:
|
||||||
|
if fami_assign_site_button.is_enabled():
|
||||||
|
fami_assign_site_button.click()
|
||||||
|
time.sleep(0.5)
|
||||||
|
except Exception as exc:
|
||||||
|
print("click buyWaiting button fail")
|
||||||
|
print(exc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
areas = None
|
||||||
|
if not is_select_box_visible:
|
||||||
|
#---------------------------
|
||||||
|
# part 2: select keywords
|
||||||
|
#---------------------------
|
||||||
|
areas = get_fami_target_area(date_keyword, area_keyword_1, area_keyword_2)
|
||||||
|
|
||||||
|
area_target = None
|
||||||
if areas is not None:
|
if areas is not None:
|
||||||
#print("area_auto_select_mode", area_auto_select_mode)
|
#print("area_auto_select_mode", area_auto_select_mode)
|
||||||
#print("len(areas)", len(areas))
|
#print("len(areas)", len(areas))
|
||||||
|
@ -2408,194 +2446,21 @@ def fami_area_auto_select(url):
|
||||||
target_row_index = random.randint(0,len(areas)-1)
|
target_row_index = random.randint(0,len(areas)-1)
|
||||||
|
|
||||||
#print("target_row_index", target_row_index)
|
#print("target_row_index", target_row_index)
|
||||||
area = areas[target_row_index]
|
area_target = areas[target_row_index]
|
||||||
|
|
||||||
if area is not None:
|
if area_target is not None:
|
||||||
try:
|
try:
|
||||||
#print("area text", area.text)
|
#print("area text", area_target.text)
|
||||||
area.click()
|
area_target.click()
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
print("click area a link fail")
|
print("click buy button fail, start to retry...")
|
||||||
print(exc)
|
time.sleep(0.2)
|
||||||
pass
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
# purpose: ticket number auto select
|
|
||||||
# return:
|
|
||||||
# True: ticket number block appear.
|
|
||||||
# False: ticket number block not appear.
|
|
||||||
# ps: return value for area auto select.
|
|
||||||
def fami_ticket_number_auto_select(url):
|
|
||||||
ret = False
|
|
||||||
is_assign_ticket_number = False
|
|
||||||
|
|
||||||
ticket_number_div = None
|
|
||||||
try:
|
|
||||||
ticket_number_div = driver.find_element(By.CSS_SELECTOR, '#Form_price > table > tbody > tr:nth-child(4) > td > table:nth-child(5) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(3) > td:nth-child(4) > span')
|
|
||||||
if ticket_number_div is not None:
|
|
||||||
el = None
|
|
||||||
try:
|
try:
|
||||||
el = ticket_number_div.find_element(By.TAG_NAME, "select")
|
area_target.click()
|
||||||
if el is not None:
|
|
||||||
ret = True
|
|
||||||
#print("bingo, found ticket_number select")
|
|
||||||
|
|
||||||
ticket_number_select = Select(el)
|
|
||||||
if ticket_number_select is not None:
|
|
||||||
try:
|
|
||||||
#print("get select ticket value:" + Select(ticket_number_select).first_selected_option.text)
|
|
||||||
if ticket_number_select.first_selected_option.text=="0":
|
|
||||||
# target ticket number
|
|
||||||
ticket_number_select.select_by_visible_text(ticket_number)
|
|
||||||
is_assign_ticket_number = True
|
|
||||||
except Exception as exc:
|
|
||||||
#print("select_by_visible_text ticket_number fail")
|
|
||||||
#print(exc)
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
# try target ticket number twice
|
|
||||||
ticket_number_select.select_by_visible_text(ticket_number)
|
|
||||||
is_assign_ticket_number = True
|
|
||||||
except Exception as exc:
|
|
||||||
#print("select_by_visible_text ticket_number fail...2")
|
|
||||||
#print(exc)
|
|
||||||
pass
|
|
||||||
|
|
||||||
# try buy one ticket
|
|
||||||
try:
|
|
||||||
ticket_number_select.select_by_visible_text("1")
|
|
||||||
is_assign_ticket_number = True
|
|
||||||
except Exception as exc:
|
|
||||||
print("select_by_visible_text 1 fail")
|
|
||||||
pass
|
|
||||||
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
#print("find ticket_number select fail")
|
print("click buy button fail, after reftry still fail.")
|
||||||
#print(exc)
|
print(exc)
|
||||||
pass
|
pass
|
||||||
except Exception as exc:
|
|
||||||
#print("find #Form_price ticket_number div fail")
|
|
||||||
#print(exc)
|
|
||||||
pass
|
|
||||||
|
|
||||||
#print("is_assign_ticket_number", is_assign_ticket_number)
|
|
||||||
time.sleep(0.3)
|
|
||||||
|
|
||||||
wait = WebDriverWait(driver, 5)
|
|
||||||
|
|
||||||
if is_assign_ticket_number:
|
|
||||||
btn_auto_hyperlink_div = None
|
|
||||||
try:
|
|
||||||
btn_auto_hyperlink_div = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#chose_seat_btn_auto > a')))
|
|
||||||
#btn_auto_hyperlink_div = driver.find_element(By.CSS_SELECTOR, '#chose_seat_btn_auto > a')
|
|
||||||
if btn_auto_hyperlink_div is not None:
|
|
||||||
btn_auto_hyperlink_div.click()
|
|
||||||
except Exception as exc:
|
|
||||||
print("find #chose_seat_btn_auto fail")
|
|
||||||
print(exc)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def fami_activity(url):
|
|
||||||
#print("bingo")
|
|
||||||
|
|
||||||
# Python 2 and 3
|
|
||||||
try:
|
|
||||||
# python3 urllib.parse:
|
|
||||||
from urllib.parse import urlparse, parse_qs
|
|
||||||
except ImportError:
|
|
||||||
from urlparse import urlparse, parse_qs
|
|
||||||
|
|
||||||
parsed_url = urlparse(url)
|
|
||||||
qstr=parse_qs(parsed_url.query)
|
|
||||||
code = None
|
|
||||||
if 'code' in qstr:
|
|
||||||
codes = qstr['code']
|
|
||||||
if len(codes) > 0:
|
|
||||||
code = codes[0]
|
|
||||||
#print("qstr:", code)
|
|
||||||
|
|
||||||
#---------------------------
|
|
||||||
# part 1: press "buy" button.
|
|
||||||
#---------------------------
|
|
||||||
|
|
||||||
fami_start_to_buy_button = None
|
|
||||||
try:
|
|
||||||
fami_start_to_buy_button = driver.find_element(By.ID, 'under_img_order_buy')
|
|
||||||
if fami_start_to_buy_button is not None:
|
|
||||||
if True:
|
|
||||||
#if fami_start_to_buy_button.is_displayed():
|
|
||||||
if fami_start_to_buy_button.is_enabled():
|
|
||||||
#print('send click to buy button')
|
|
||||||
|
|
||||||
|
|
||||||
js = u'function testajax2(section_id,game_id,activitycode){ \
|
|
||||||
$.ajax({ \
|
|
||||||
type: "POST", \
|
|
||||||
url: "FWT/FWT0000.aspx", \
|
|
||||||
data: { \
|
|
||||||
activitycode: activitycode, \
|
|
||||||
game_id: game_id \
|
|
||||||
}, \
|
|
||||||
success: function(msg){ \
|
|
||||||
var index=msg.indexOf("$(\'#img_order_buy\').click(function() {alert("); \
|
|
||||||
if(index==-1) \
|
|
||||||
$(\'#img_order_buy\').click(); \
|
|
||||||
else \
|
|
||||||
location.reload(); \
|
|
||||||
} \
|
|
||||||
}); \
|
|
||||||
} \
|
|
||||||
testajax2("","","' + code +'"); \
|
|
||||||
'
|
|
||||||
#print("execute js", js)
|
|
||||||
|
|
||||||
try:
|
|
||||||
driver.execute_script(js)
|
|
||||||
pass
|
|
||||||
except Exception as exc:
|
|
||||||
print("javascript Exception:")
|
|
||||||
print(exc)
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
#fami_start_to_buy_button.click()
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
print('unable to find buy button')
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
#print("find under_img_order_buy button fail")
|
|
||||||
pass
|
|
||||||
except Exception as exc:
|
|
||||||
#print("find under_img_order_buy button Exception")
|
|
||||||
pass
|
|
||||||
|
|
||||||
#---------------------------
|
|
||||||
# part 4: auto fill ticket number
|
|
||||||
#---------------------------
|
|
||||||
|
|
||||||
ticket_number_div_exist = fami_ticket_number_auto_select(url)
|
|
||||||
if ticket_number_div_exist:
|
|
||||||
#print("ticket_number_div_exist appear")
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
#---------------------------
|
|
||||||
# part 3: auto press area
|
|
||||||
#---------------------------
|
|
||||||
if area_auto_select_enable:
|
|
||||||
area_div_exist = fami_area_auto_select(url)
|
|
||||||
if area_div_exist:
|
|
||||||
#print("area appear")
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
#---------------------------
|
|
||||||
# part 2: auto press date
|
|
||||||
#---------------------------
|
|
||||||
if date_auto_select_enable:
|
|
||||||
fami_date_auto_select(url)
|
|
||||||
|
|
||||||
|
|
||||||
def urbtix_ticket_number_auto_select(url):
|
def urbtix_ticket_number_auto_select(url):
|
||||||
|
@ -3367,8 +3232,11 @@ def main():
|
||||||
|
|
||||||
# for famiticket
|
# for famiticket
|
||||||
if 'famiticket.com' in url:
|
if 'famiticket.com' in url:
|
||||||
if 'activity_info.aspx' in url:
|
if '/Home/Activity/Info/' in url:
|
||||||
fami_activity(url)
|
fami_activity(url)
|
||||||
|
if '/Sales/Home/Index/' in url:
|
||||||
|
fami_home(url)
|
||||||
|
|
||||||
|
|
||||||
# for urbtix
|
# for urbtix
|
||||||
# https://ticket.urbtix.hk/internet/secure/event/37348/performanceDetail
|
# https://ticket.urbtix.hk/internet/secure/event/37348/performanceDetail
|
||||||
|
@ -3405,4 +3273,5 @@ def main():
|
||||||
if '/performance.do' in url:
|
if '/performance.do' in url:
|
||||||
cityline_performance(url)
|
cityline_performance(url)
|
||||||
|
|
||||||
main()
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -2,4 +2,4 @@ certifi
|
||||||
chardet
|
chardet
|
||||||
idna
|
idna
|
||||||
selenium
|
selenium
|
||||||
undetected_chromedriver
|
selenium-stealth
|
||||||
|
|
|
@ -17,7 +17,7 @@ import sys
|
||||||
import platform
|
import platform
|
||||||
import json
|
import json
|
||||||
|
|
||||||
CONST_APP_VERSION = u"MaxBot (2021.12.01)"
|
CONST_APP_VERSION = u"MaxBot (2021.12.24)"
|
||||||
|
|
||||||
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
|
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
|
||||||
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
|
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
|
||||||
|
@ -868,6 +868,5 @@ def main():
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
Loading…
Reference in New Issue