diff --git a/NonBrowser.py b/NonBrowser.py
index 6149e8f..5ddf811 100644
--- a/NonBrowser.py
+++ b/NonBrowser.py
@@ -1,49 +1,44 @@
import base64
-import json
-from io import BytesIO
-
import requests
+from io import BytesIO
from PIL import Image
+from typing import Optional
+from requests.exceptions import RequestException
+class NonBrowser:
+ def __init__(self, domain_name: str = "tixcraft.com") -> None:
+ self.session = requests.Session()
+ self.set_domain(domain_name)
-class NonBrowser():
- def __init__(self, domain_name = "tixcraft.com") -> None:
- self.Session = requests.session()
- self.Set_Domain(domain_name)
+ def set_cookies(self, cookies: Optional[dict]) -> bool:
+ if cookies is not None:
+ [self.session.cookies.set(cookie["name"], cookie["value"]) for cookie in cookies]
+ return True
+ return False
- 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 get_cookies(self) -> dict:
+ return self.session.cookies.get_dict()
- def Get_cookies(self):
- return self.Session.cookies.get_dict()
+ def set_headers(self, header: str) -> None:
+ self.session.headers = header
- def set_headers(self, header:str):
- self.Session.headers = header
+ def set_domain(self, domain_name: str, captcha_url: str = "ticket/captcha", refresh_url: str = "ticket/captcha?refresh=1") -> None:
+ self.url = f"https://{domain_name}/{captcha_url}"
+ self.refresh_url = f"https://{domain_name}/{refresh_url}"
- def Set_Domain(self, domain_name, captcha_url="ticket/captcha", refresh_url="ticket/captcha?refresh=1"):
- self.url = "https://%s/%s" % (domain_name, captcha_url)
- self.refresh_url = "https://%s/%s" % (domain_name, refresh_url)
-
- def Request_Captcha(self):
- img = Image.open(BytesIO(self.Session.get(self.url, stream = True).content))
+ def request_captcha(self) -> bytes:
+ response = self.session.get(self.url, stream=True)
+ img = Image.open(BytesIO(response.content))
output_buffer = BytesIO()
img.save(output_buffer, format='JPEG')
binary_data = output_buffer.getvalue()
- base64_data = base64.b64encode(binary_data)
- return base64_data
+ return base64.b64encode(binary_data)
- def Request_Refresh_Captcha(self) -> str:
+ def request_refresh_captcha(self) -> str:
try:
- result = self.Session.get(self.refresh_url, stream = True)
- if result.status_code == 200:
- json_data = json.loads(result.text)
- return json_data.get("url","")
- else:
- return ""
- except Exception as e:
- return ""
\ No newline at end of file
+ response = self.session.get(self.refresh_url, stream=True)
+ if response.status_code == 200:
+ return response.json().get("url", "")
+ except RequestException:
+ pass
+ return ""
\ No newline at end of file
diff --git a/README.md b/README.md
index 9fd473b..1f92bad 100644
--- a/README.md
+++ b/README.md
@@ -69,7 +69,7 @@ https://max-everyday.com/2023/11/buy-ticket-by-vm/
### Step 3: 安裝第三方套件:
-python3 -m pip install -r pip-req.txt
+python3 -m pip install -r requirement.txt
### Step 4: 執行設定介面主桯式:
diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py
index 65d204d..f81e85a 100644
--- a/chrome_tixcraft.py
+++ b/chrome_tixcraft.py
@@ -2039,7 +2039,7 @@ def tixcraft_get_ocr_answer(driver, ocr, ocr_captcha_image_source, Captcha_Brows
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER:
if not Captcha_Browser is None:
- img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
+ img_base64 = base64.b64decode(Captcha_Browser.request_captcha())
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS:
image_id = 'TicketForm_verifyCode-image'
@@ -2073,7 +2073,7 @@ def tixcraft_get_ocr_answer(driver, ocr, ocr_captcha_image_source, Captcha_Brows
if img_base64 is None:
if not Captcha_Browser is None:
print("canvas get image fail, use plan_b: NonBrowser")
- img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
+ img_base64 = base64.b64decode(Captcha_Browser.request_captcha())
except Exception as exc:
if show_debug_message:
print("canvas exception:", str(exc))
@@ -2152,7 +2152,7 @@ def tixcraft_auto_ocr(driver, ocr, away_from_keyboard_enable, previous_answer, C
else:
# Non_Browser solution.
if not Captcha_Browser is None:
- new_captcha_url = Captcha_Browser.Request_Refresh_Captcha() #取得新的CAPTCHA
+ new_captcha_url = Captcha_Browser.request_refresh_captcha() #取得新的CAPTCHA
if new_captcha_url != "":
tixcraft_change_captcha(driver, new_captcha_url) #更改CAPTCHA圖
else:
@@ -5730,10 +5730,10 @@ def set_non_browser_cookies(driver, url, Captcha_Browser):
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
try:
- Captcha_Browser.Set_cookies(driver.get_cookies())
+ Captcha_Browser.set_cookies(driver.get_cookies())
except Exception as e:
pass
- Captcha_Browser.Set_Domain(domain_name)
+ Captcha_Browser.set_domain(domain_name)
def ticketmaster_parse_zone_info(driver, config_dict):
show_debug_message = True # debug.
@@ -7007,7 +7007,7 @@ def ibon_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_
img_base64 = None
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER:
if not Captcha_Browser is None:
- img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
+ img_base64 = base64.b64decode(Captcha_Browser.request_captcha())
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS:
image_id = 'chk_pic'
image_element = None
@@ -7072,7 +7072,7 @@ def ibon_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_
else:
# Non_Browser solution.
if not Captcha_Browser is None:
- new_captcha_url = Captcha_Browser.Request_Refresh_Captcha() #取得新的CAPTCHA
+ new_captcha_url = Captcha_Browser.request_refresh_captcha() #取得新的CAPTCHA
if new_captcha_url != "":
#PS:[TODO]
#tixcraft_change_captcha(driver, new_captcha_url) #更改CAPTCHA圖
@@ -7245,7 +7245,7 @@ def ibon_main(driver, url, config_dict, ocr, Captcha_Browser):
captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
- Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+ Captcha_Browser.set_domain(domain_name, captcha_url=captcha_url)
is_captcha_sent = ibon_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
@@ -8984,7 +8984,7 @@ def kham_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_
img_base64 = None
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER:
if not Captcha_Browser is None:
- img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
+ img_base64 = base64.b64decode(Captcha_Browser.request_captcha())
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS:
image_id = 'chk_pic'
image_element = None
@@ -9049,7 +9049,7 @@ def kham_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_
else:
# Non_Browser solution.
if not Captcha_Browser is None:
- new_captcha_url = Captcha_Browser.Request_Refresh_Captcha() #取得新的CAPTCHA
+ new_captcha_url = Captcha_Browser.request_refresh_captcha() #取得新的CAPTCHA
if new_captcha_url != "":
#PS:[TODO]
#tixcraft_change_captcha(driver, new_captcha_url) #更改CAPTCHA圖
@@ -9169,8 +9169,8 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
if config_dict["ocr_captcha"]["enable"]:
if not Captcha_Browser is None:
- Captcha_Browser.Set_cookies(driver.get_cookies())
- Captcha_Browser.Set_Domain(domain_name)
+ Captcha_Browser.set_cookies(driver.get_cookies())
+ Captcha_Browser.set_domain(domain_name)
break
#https://kham.com.tw/application/UTK02/UTK0201_.aspx?PRODUCT_ID=XXX
@@ -9264,7 +9264,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
- Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+ Captcha_Browser.set_domain(domain_name, captcha_url=captcha_url)
is_captcha_sent = False
@@ -9332,7 +9332,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
- Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+ Captcha_Browser.set_domain(domain_name, captcha_url=captcha_url)
is_captcha_sent = False
if config_dict["ocr_captcha"]["enable"]:
@@ -9382,7 +9382,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
- Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+ Captcha_Browser.set_domain(domain_name, captcha_url=captcha_url)
kham_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
@@ -10197,7 +10197,7 @@ def ticketplus_auto_ocr(driver, config_dict, ocr, previous_answer, Captcha_Brows
img_base64 = None
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER:
if not Captcha_Browser is None:
- img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
+ img_base64 = base64.b64decode(Captcha_Browser.request_captcha())
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS:
image_id = 'span.captcha-img'
image_element = None
@@ -10660,8 +10660,8 @@ def ticketplus_main(driver, url, config_dict, ocr, Captcha_Browser):
if config_dict["ocr_captcha"]["enable"]:
domain_name = url.split('/')[2]
if not Captcha_Browser is None:
- Captcha_Browser.Set_cookies(driver.get_cookies())
- Captcha_Browser.Set_Domain(domain_name)
+ Captcha_Browser.set_cookies(driver.get_cookies())
+ Captcha_Browser.set_domain(domain_name)
is_user_signin = ticketplus_account_auto_fill(driver, config_dict)
if is_user_signin:
diff --git a/nodriver_tixcraft.py b/nodriver_tixcraft.py
index 6fb9d30..8824474 100644
--- a/nodriver_tixcraft.py
+++ b/nodriver_tixcraft.py
@@ -111,9 +111,8 @@ def get_config_dict(args):
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
# allow assign config by command line.
- if not args.input is None:
- if len(args.input) > 0:
- config_filepath = args.input
+ if args.input and len(args.input) > 0:
+ config_filepath = args.input
config_dict = None
if os.path.isfile(config_filepath):
@@ -121,48 +120,33 @@ def get_config_dict(args):
with open(config_filepath) as json_data:
config_dict = json.load(json_data)
- if not args.headless is None:
- config_dict["advanced"]["headless"] = util.t_or_f(args.headless)
+ # Define a dictionary to map argument names to their paths in the config_dict
+ arg_to_path = {
+ "headless": ["advanced", "headless"],
+ "homepage": ["homepage"],
+ "ticket_number": ["ticket_number"],
+ "browser": ["browser"],
+ "tixcraft_sid": ["advanced", "tixcraft_sid"],
+ "ibonqware": ["advanced", "ibonqware"],
+ "kktix_account": ["advanced", "kktix_account"],
+ "kktix_password": ["advanced", "kktix_password_plaintext"],
+ "proxy_server": ["advanced", "proxy_server_port"],
+ "window_size": ["advanced", "window_size"]
+ }
- if not args.homepage is None:
- if len(args.homepage) > 0:
- config_dict["homepage"] = args.homepage
-
- if not args.ticket_number is None:
- if args.ticket_number > 0:
- config_dict["ticket_number"] = args.ticket_number
-
- if not args.browser is None:
- if len(args.browser) > 0:
- config_dict["browser"] = args.browser
-
- if not args.tixcraft_sid is None:
- if len(args.tixcraft_sid) > 0:
- config_dict["advanced"]["tixcraft_sid"] = args.tixcraft_sid
- if not args.ibonqware is None:
- if len(args.ibonqware) > 0:
- config_dict["advanced"]["ibonqware"] = args.ibonqware
-
- if not args.kktix_account is None:
- if len(args.kktix_account) > 0:
- config_dict["advanced"]["kktix_account"] = args.kktix_account
- if not args.kktix_password is None:
- if len(args.kktix_password) > 0:
- config_dict["advanced"]["kktix_password_plaintext"] = args.kktix_password
-
- if not args.proxy_server is None:
- if len(args.proxy_server) > 2:
- config_dict["advanced"]["proxy_server_port"] = args.proxy_server
-
- if not args.window_size is None:
- if len(args.window_size) > 2:
- config_dict["advanced"]["window_size"] = args.window_size
+ # Update the config_dict based on the arguments
+ for arg, path in arg_to_path.items():
+ value = getattr(args, arg)
+ if value and len(str(value)) > 0:
+ d = config_dict
+ for key in path[:-1]:
+ d = d[key]
+ d[path[-1]] = value
# special case for headless to enable away from keyboard mode.
is_headless_enable_ocr = False
if config_dict["advanced"]["headless"]:
# for tixcraft headless.
- #print("If you are runnig headless mode on tixcraft, you need input your cookie SID.")
if len(config_dict["advanced"]["tixcraft_sid"]) > 1:
is_headless_enable_ocr = True
@@ -207,20 +191,18 @@ async def nodriver_press_button(tab, select_query):
print(e)
pass
-async def nodriver_check_checkbox(tab, select_query, value='true'):
- is_checkbox_checked = False
+from typing import Optional
+
+async def nodriver_check_checkbox(tab: Optional[object], select_query: str, value: str = 'true') -> bool:
if tab:
try:
element = await tab.query_selector(select_query)
if element:
- #await element.apply('function (element) { element.checked='+ value +'; } ')
await element.click()
- is_checkbox_checked = True
+ return True
except Exception as exc:
- #print("check checkbox fail for selector:", select_query)
print(exc)
- pass
- return is_checkbox_checked
+ return False
async def nodriver_facebook_login(tab, facebook_account, facebook_password):
if tab:
@@ -1376,8 +1358,8 @@ async def nodriver_ticketplus_main(tab, url, config_dict, ocr, Captcha_Browser):
domain_name = url.split('/')[2]
if not Captcha_Browser is None:
# TODO:
- #Captcha_Browser.Set_cookies(driver.get_cookies())
- Captcha_Browser.Set_Domain(domain_name)
+ #Captcha_Browser.set_cookies(driver.get_cookies())
+ Captcha_Browser.set_domain(domain_name)
is_user_signin = await nodriver_ticketplus_account_auto_fill(tab, config_dict)
@@ -1603,7 +1585,7 @@ async def nodriver_ibon_main(tab, url, config_dict, ocr, Captcha_Browser):
captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
#PS: need set cookies once, if user change domain.
if not Captcha_Browser is None:
- Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+ Captcha_Browser.set_domain(domain_name, captcha_url=captcha_url)
# TODO:
#is_captcha_sent = ibon_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
diff --git a/pip-req.txt b/requirement.txt
similarity index 100%
rename from pip-req.txt
rename to requirement.txt