2023-03-31, change kktix refresh strategy.

master
CHUN YU YAO 2023-04-05 20:47:44 +08:00
parent 3419e055fe
commit 26d760ca85
4 changed files with 221 additions and 12 deletions

View File

@ -9,12 +9,15 @@ class NonBrowser():
self.Session = requests.session()
self.Set_Domain(domain_name)
def Set_cookies(self,cookies:dict):
for cookie in cookies:
self.Session.cookies.set(cookie["name"],cookie["value"])
return True
def Set_cookies(self, cookies:dict):
ret = False
if not cookies is None:
for cookie in cookies:
self.Session.cookies.set(cookie["name"],cookie["value"])
ret = True
return ret
def set_headers(self,header:str):
def set_headers(self, header:str):
self.Session.headers = header
def Set_Domain(self, domain_name, captcha_url="ticket/captcha", refresh_url="ticket/captcha?refresh=1"):

View File

@ -53,7 +53,7 @@ import argparse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
CONST_APP_VERSION = u"MaxBot (2023.03.27)"
CONST_APP_VERSION = u"MaxBot (2023.03.31)"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
@ -577,7 +577,7 @@ def get_driver_by_config(config_dict):
if 'indievox.com' in homepage:
tixcraft_family = True
if 'ticketmaster.sg' in homepage:
if 'ticketmaster.' in homepage:
tixcraft_family = True
if tixcraft_family:
@ -1453,6 +1453,7 @@ def tixcraft_date_auto_select(driver, url, config_dict, domain_name):
if not is_date_clicked:
if not formated_area_list is None:
if len(formated_area_list) == 0:
print('start to refresh page.')
try:
driver.refresh()
time.sleep(0.3)
@ -1461,6 +1462,192 @@ def tixcraft_date_auto_select(driver, url, config_dict, domain_name):
return is_date_clicked
def ticketmaster_date_auto_select(driver, url, config_dict, domain_name):
show_debug_message = True # debug.
show_debug_message = False # online
if config_dict["advanced"]["verbose"]:
show_debug_message = True
# read config.
auto_select_mode = config_dict["tixcraft"]["date_auto_select"]["mode"]
date_keyword = config_dict["tixcraft"]["date_auto_select"]["date_keyword"].strip()
# TODO: implement this feature.
date_keyword_and = ""
pass_date_is_sold_out_enable = config_dict["tixcraft"]["pass_date_is_sold_out"]
auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"]
# PS: for big events, check sold out text maybe not helpful, due to database is too busy.
sold_out_text_list = ["選購一空","已售完","No tickets available","Sold out","空席なし","完売した"]
find_ticket_text_list = ['See Tickets']
area_list = None
try:
area_list = driver.find_elements(By.CSS_SELECTOR, '#list-view > div > div.event-listing > div.accordion-wrapper > div')
except Exception as exc:
print("find #gameList fail")
matched_blocks = None
formated_area_list = None
if area_list is not None:
area_list_count = len(area_list)
if show_debug_message:
print("date_list_count:", area_list_count)
if area_list_count > 0:
formated_area_list = []
row_index = 0
for row in area_list:
row_index += 1
row_is_enabled=True
try:
if not row.is_enabled():
row_is_enabled=False
row_text = ""
# check buy button.
if row_is_enabled:
row_text = row.text
if row_text is None:
row_text = ""
row_is_enabled=False
# must contains 'See Tickets'
for text_item in find_ticket_text_list:
if text_item in row_text:
row_is_enabled = True
break
# check sold out text.
if row_is_enabled:
if pass_date_is_sold_out_enable:
for sold_out_item in sold_out_text_list:
if sold_out_item in row_text:
row_is_enabled = False
if show_debug_message:
print("match sold out text: %s, skip this row." % (sold_out_item))
break
except Exception as exc:
if show_debug_message:
print(exc)
pass
if row_is_enabled:
formated_area_list.append(row)
if show_debug_message:
print("formated_area_list count:", len(formated_area_list))
if len(date_keyword) == 0:
matched_blocks = formated_area_list
else:
# match keyword.
date_keyword = format_keyword_string(date_keyword)
if show_debug_message:
print("start to match formated keyword:", date_keyword)
matched_blocks = []
row_index = 0
for row in formated_area_list:
row_index += 1
row_is_enabled=True
if row_is_enabled:
row_text = ""
try:
row_text = row.text
except Exception as exc:
print("get text fail")
break
if row_text is None:
row_text = ""
if len(row_text) > 0:
row_text = format_keyword_string(row_text)
if show_debug_message:
print("row_text:", row_text)
is_match_area = False
match_area_code = 0
if date_keyword in row_text:
if len(date_keyword_and) == 0:
if show_debug_message:
print('keyword_and # is empty, directly match.')
# keyword #2 is empty, direct append.
is_match_area = True
match_area_code = 2
else:
if date_keyword_and in row_text:
if show_debug_message:
print('match keyword_and')
is_match_area = True
match_area_code = 3
else:
if show_debug_message:
print('not match keyword_and')
pass
if is_match_area:
matched_blocks.append(row)
if show_debug_message:
if not matched_blocks is None:
print("after match keyword, found count:", len(matched_blocks))
else:
print("not found date-time-position")
pass
else:
print("date date-time-position is None")
pass
target_area = None
if matched_blocks is not None:
if len(matched_blocks) > 0:
target_row_index = 0
if auto_select_mode == CONST_FROM_TOP_TO_BOTTOM:
pass
if auto_select_mode == CONST_FROM_BOTTOM_TO_TOP:
target_row_index = len(matched_blocks)-1
if auto_select_mode == CONST_RANDOM:
target_row_index = random.randint(0,len(matched_blocks)-1)
target_area = matched_blocks[target_row_index]
is_date_clicked = False
if target_area is not None:
is_date_clicked = force_press_button(target_area, By.CSS_SELECTOR,'a')
if is_date_clicked:
try:
window_handles_count = len(driver.window_handles)
if window_handles_count > 1:
driver.switch_to.window(driver.window_handles[0])
driver.close()
driver.switch_to.window(driver.window_handles[0])
time.sleep(0.2)
except Exception as excSwithFail:
pass
# [PS]: current reload condition only when
if auto_reload_coming_soon_page_enable:
if not is_date_clicked:
if not formated_area_list is None:
if len(formated_area_list) == 0:
print('start to refresh page.')
try:
driver.refresh()
time.sleep(0.3)
except Exception as exc:
pass
return is_date_clicked
# PURPOSE: get target area list.
# RETURN:
# is_need_refresh
@ -6017,7 +6204,15 @@ def ticketmaster_captcha(driver, config_dict, ocr, Captcha_Browser, domain_name)
def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser):
tixcraft_home_close_window(driver)
home_url_list = ['https://tixcraft.com/','https://www.tixcraft.com/','https://indievox.com/','https://www.indievox.com/','https://teamear.tixcraft.com/activity']
home_url_list = ['https://tixcraft.com/'
,'https://www.tixcraft.com/'
,'https://indievox.com/'
,'https://www.indievox.com/'
,'https://teamear.tixcraft.com/activity'
,'https://www.ticketmaster.sg/'
,'https://www.ticketmaster.com/'
]
for each_url in home_url_list:
if each_url == url:
if config_dict["ocr_captcha"]["enable"]:
@ -6034,6 +6229,16 @@ def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
domain_name = url.split('/')[2]
is_date_selected = tixcraft_date_auto_select(driver, url, config_dict, domain_name)
if '/artist/' in url and 'ticketmaster.com' in url:
is_event_page = False
if len(url.split('/'))==6:
is_event_page = True
if is_event_page:
date_auto_select_enable = config_dict["tixcraft"]["date_auto_select"]["enable"]
if date_auto_select_enable:
domain_name = url.split('/')[2]
is_date_selected = ticketmaster_date_auto_select(driver, url, config_dict, domain_name)
# choose area
if '/ticket/area/' in url:
domain_name = url.split('/')[2]
@ -9183,7 +9388,7 @@ def main(args):
if 'indievox.com' in url:
tixcraft_family = True
if 'ticketmaster.sg' in url:
if 'ticketmaster.' in url:
tixcraft_family = True
if tixcraft_family:

View File

@ -22,7 +22,7 @@ import base64
import threading
import subprocess
CONST_APP_VERSION = u"MaxBot (2023.03.27)"
CONST_APP_VERSION = u"MaxBot (2023.03.31)"
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
CONST_MAXBOT_CONFIG_FILE = "settings.json"

View File

@ -24,7 +24,7 @@ import time
import threading
import subprocess
CONST_APP_VERSION = u"MaxBot (2023.03.27)"
CONST_APP_VERSION = u"MaxBot (2023.03.31)"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
@ -915,7 +915,7 @@ def btn_preview_sound_clicked():
play_mp3_async(new_sound_filename)
def play_mp3_async(sound_filename):
threading.Thread(target=play_mp3, args=(sound_filename,), daemon=True).start()
threading.Thread(target=play_mp3, args=(sound_filename,)).start()
def play_mp3(sound_filename):
from playsound import playsound
@ -1464,6 +1464,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
combo_homepage['values']= ["https://kktix.com"
,"https://tixcraft.com (拓元)"
,"https://ticketmaster.sg"
,"https://ticketmaster.com"
,"https://teamear.tixcraft.com/ (添翼)"
,"https://www.indievox.com/ (獨立音樂)"
,"https://www.famiticket.com.tw (全網)"