2024-03-20, move some function to util. (this version is not stable!)
parent
13a6297149
commit
faec30f561
1744
chrome_tixcraft.py
1744
chrome_tixcraft.py
File diff suppressed because it is too large
Load Diff
|
@ -23,7 +23,9 @@ import sys
|
||||||
import threading
|
import threading
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.19)"
|
import util
|
||||||
|
|
||||||
|
CONST_APP_VERSION = "MaxBot (2024.03.20)"
|
||||||
|
|
||||||
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
|
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
@ -134,16 +136,6 @@ def load_translate():
|
||||||
translate['ja_jp']=ja_jp
|
translate['ja_jp']=ja_jp
|
||||||
return translate
|
return translate
|
||||||
|
|
||||||
def get_app_root():
|
|
||||||
app_root = ""
|
|
||||||
if hasattr(sys, 'frozen'):
|
|
||||||
basis = sys.executable
|
|
||||||
app_root = os.path.dirname(basis)
|
|
||||||
else:
|
|
||||||
app_root = os.getcwd()
|
|
||||||
return app_root
|
|
||||||
|
|
||||||
|
|
||||||
def get_default_config():
|
def get_default_config():
|
||||||
config_dict={}
|
config_dict={}
|
||||||
|
|
||||||
|
@ -154,9 +146,8 @@ def get_default_config():
|
||||||
|
|
||||||
return config_dict
|
return config_dict
|
||||||
|
|
||||||
|
|
||||||
def load_json():
|
def load_json():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
||||||
|
|
||||||
config_dict = None
|
config_dict = None
|
||||||
|
@ -168,7 +159,7 @@ def load_json():
|
||||||
return config_filepath, config_dict
|
return config_filepath, config_dict
|
||||||
|
|
||||||
def btn_restore_defaults_clicked(language_code):
|
def btn_restore_defaults_clicked(language_code):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
||||||
if os.path.exists(str(config_filepath)):
|
if os.path.exists(str(config_filepath)):
|
||||||
try:
|
try:
|
||||||
|
@ -187,7 +178,7 @@ def btn_save_clicked():
|
||||||
btn_save_act()
|
btn_save_act()
|
||||||
|
|
||||||
def btn_save_act(slience_mode=True):
|
def btn_save_act(slience_mode=True):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
|
@ -213,18 +204,13 @@ def btn_save_act(slience_mode=True):
|
||||||
# save config.
|
# save config.
|
||||||
if is_all_data_correct:
|
if is_all_data_correct:
|
||||||
# slience
|
# slience
|
||||||
save_json(config_dict, config_filepath)
|
util.save_json(config_dict, config_filepath)
|
||||||
|
|
||||||
if not slience_mode:
|
if not slience_mode:
|
||||||
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
||||||
|
|
||||||
return is_all_data_correct
|
return is_all_data_correct
|
||||||
|
|
||||||
def save_json(config_dict, target_path):
|
|
||||||
json_str = json.dumps(config_dict, indent=4)
|
|
||||||
with open(target_path, 'w') as outfile:
|
|
||||||
outfile.write(json_str)
|
|
||||||
|
|
||||||
def open_url(url):
|
def open_url(url):
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
|
||||||
|
|
|
@ -1,49 +1,25 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
#encoding=utf-8
|
#encoding=utf-8
|
||||||
import argparse
|
import argparse
|
||||||
|
import asyncio
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import nodriver as uc
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
import asyncio
|
import util
|
||||||
import nodriver as uc
|
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.19)"
|
CONST_APP_VERSION = "MaxBot (2024.03.20)"
|
||||||
|
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
||||||
|
|
||||||
|
|
||||||
def sx(s1):
|
|
||||||
key=18
|
|
||||||
return ''.join(chr(ord(a) ^ key) for a in s1)
|
|
||||||
|
|
||||||
def decryptMe(b):
|
|
||||||
s=""
|
|
||||||
if(len(b)>0):
|
|
||||||
s=sx(base64.b64decode(b).decode("UTF-8"))
|
|
||||||
return s
|
|
||||||
|
|
||||||
def encryptMe(s):
|
|
||||||
data=""
|
|
||||||
if(len(s)>0):
|
|
||||||
data=base64.b64encode(sx(s).encode('UTF-8')).decode("UTF-8")
|
|
||||||
return data
|
|
||||||
|
|
||||||
def get_app_root():
|
|
||||||
app_root = ""
|
|
||||||
if hasattr(sys, 'frozen'):
|
|
||||||
basis = sys.executable
|
|
||||||
app_root = os.path.dirname(basis)
|
|
||||||
else:
|
|
||||||
app_root = os.getcwd()
|
|
||||||
return app_root
|
|
||||||
|
|
||||||
def load_json():
|
def load_json():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
|
|
||||||
config_dict = None
|
config_dict = None
|
||||||
|
@ -161,7 +137,7 @@ async def kktix_account_loop(config_dict):
|
||||||
kktix_account = config_dict["advanced"]["kktix_account"]
|
kktix_account = config_dict["advanced"]["kktix_account"]
|
||||||
kktix_password = config_dict["advanced"]["kktix_password_plaintext"].strip()
|
kktix_password = config_dict["advanced"]["kktix_password_plaintext"].strip()
|
||||||
if kktix_password == "":
|
if kktix_password == "":
|
||||||
kktix_password = decryptMe(config_dict["advanced"]["kktix_password"])
|
kktix_password = util.decryptMe(config_dict["advanced"]["kktix_password"])
|
||||||
|
|
||||||
print("kktix_account:", kktix_account)
|
print("kktix_account:", kktix_account)
|
||||||
#print("kktix_password:", kktix_password)
|
#print("kktix_password:", kktix_password)
|
||||||
|
|
139
kktix_status.py
139
kktix_status.py
|
@ -27,9 +27,9 @@ import time
|
||||||
import webbrowser
|
import webbrowser
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import requests
|
import util
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.19)"
|
CONST_APP_VERSION = "MaxBot (2024.03.20)"
|
||||||
|
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
CONST_MAXBOT_KKTIX_CONFIG_FILE = "kktix.json"
|
CONST_MAXBOT_KKTIX_CONFIG_FILE = "kktix.json"
|
||||||
|
@ -46,8 +46,6 @@ URL_CHROME_DRIVER = 'https://chromedriver.chromium.org/'
|
||||||
URL_FIREFOX_DRIVER = 'https://github.com/mozilla/geckodriver/releases'
|
URL_FIREFOX_DRIVER = 'https://github.com/mozilla/geckodriver/releases'
|
||||||
URL_EDGE_DRIVER = 'https://developer.microsoft.com/zh-tw/microsoft-edge/tools/webdriver/'
|
URL_EDGE_DRIVER = 'https://developer.microsoft.com/zh-tw/microsoft-edge/tools/webdriver/'
|
||||||
|
|
||||||
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
|
||||||
|
|
||||||
def load_translate():
|
def load_translate():
|
||||||
translate = {}
|
translate = {}
|
||||||
en_us={}
|
en_us={}
|
||||||
|
@ -96,37 +94,9 @@ def load_translate():
|
||||||
translate['ja_jp']=ja_jp
|
translate['ja_jp']=ja_jp
|
||||||
return translate
|
return translate
|
||||||
|
|
||||||
# common functions.
|
|
||||||
def find_between( s, first, last ):
|
|
||||||
ret = ""
|
|
||||||
try:
|
|
||||||
start = s.index( first ) + len( first )
|
|
||||||
end = s.index( last, start )
|
|
||||||
ret = s[start:end]
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def t_or_f(arg):
|
|
||||||
ret = False
|
|
||||||
ua = str(arg).upper()
|
|
||||||
if 'TRUE'.startswith(ua):
|
|
||||||
ret = True
|
|
||||||
elif 'YES'.startswith(ua):
|
|
||||||
ret = True
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def get_app_root():
|
|
||||||
app_root = ""
|
|
||||||
if hasattr(sys, 'frozen'):
|
|
||||||
basis = sys.executable
|
|
||||||
app_root = os.path.dirname(basis)
|
|
||||||
else:
|
|
||||||
app_root = os.getcwd()
|
|
||||||
return app_root
|
|
||||||
|
|
||||||
def load_json():
|
def load_json():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
||||||
|
|
||||||
config_dict = None
|
config_dict = None
|
||||||
|
@ -138,7 +108,7 @@ def load_json():
|
||||||
return config_filepath, config_dict
|
return config_filepath, config_dict
|
||||||
|
|
||||||
def btn_restore_defaults_clicked(language_code):
|
def btn_restore_defaults_clicked(language_code):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
||||||
if os.path.exists(str(config_filepath)):
|
if os.path.exists(str(config_filepath)):
|
||||||
try:
|
try:
|
||||||
|
@ -157,32 +127,15 @@ def btn_preview_sound_clicked():
|
||||||
global txt_play_sound_filename
|
global txt_play_sound_filename
|
||||||
new_sound_filename = txt_play_sound_filename.get().strip()
|
new_sound_filename = txt_play_sound_filename.get().strip()
|
||||||
#print("new_sound_filename:", new_sound_filename)
|
#print("new_sound_filename:", new_sound_filename)
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
new_sound_filename = os.path.join(app_root, new_sound_filename)
|
new_sound_filename = os.path.join(app_root, new_sound_filename)
|
||||||
play_mp3_async(new_sound_filename)
|
util.play_mp3_async(new_sound_filename)
|
||||||
|
|
||||||
def play_mp3_async(sound_filename):
|
|
||||||
threading.Thread(target=play_mp3, args=(sound_filename,)).start()
|
|
||||||
|
|
||||||
def play_mp3(sound_filename):
|
|
||||||
from playsound import playsound
|
|
||||||
try:
|
|
||||||
playsound(sound_filename)
|
|
||||||
except Exception as exc:
|
|
||||||
msg=str(exc)
|
|
||||||
print("play sound exeption:", msg)
|
|
||||||
if platform.system() == 'Windows':
|
|
||||||
import winsound
|
|
||||||
try:
|
|
||||||
winsound.PlaySound(sound_filename, winsound.SND_FILENAME)
|
|
||||||
except Exception as exc2:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def btn_save_clicked():
|
def btn_save_clicked():
|
||||||
btn_save_act()
|
btn_save_act()
|
||||||
|
|
||||||
def get_config_dict_from_ui():
|
def get_config_dict_from_ui():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
|
@ -236,18 +189,13 @@ def btn_save_act(slience_mode=True):
|
||||||
is_all_data_correct, config_dict = get_config_dict_from_ui()
|
is_all_data_correct, config_dict = get_config_dict_from_ui()
|
||||||
|
|
||||||
# slience
|
# slience
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
||||||
save_json(config_dict, config_filepath)
|
util.save_json(config_dict, config_filepath)
|
||||||
|
|
||||||
if not slience_mode:
|
if not slience_mode:
|
||||||
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
||||||
|
|
||||||
def save_json(config_dict, target_path):
|
|
||||||
json_str = json.dumps(config_dict, indent=4)
|
|
||||||
with open(target_path, 'w') as outfile:
|
|
||||||
outfile.write(json_str)
|
|
||||||
|
|
||||||
def open_url(url):
|
def open_url(url):
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
|
||||||
|
@ -758,7 +706,7 @@ def get_default_config():
|
||||||
config_dict={}
|
config_dict={}
|
||||||
|
|
||||||
config_dict["list"] = [CONST_MAXBOT_CONFIG_FILE]
|
config_dict["list"] = [CONST_MAXBOT_CONFIG_FILE]
|
||||||
config_dict["check_interval"]=3
|
config_dict["check_interval"]=1
|
||||||
config_dict["url"]=""
|
config_dict["url"]=""
|
||||||
|
|
||||||
config_dict["advanced"] = {}
|
config_dict["advanced"] = {}
|
||||||
|
@ -832,55 +780,6 @@ def main_gui():
|
||||||
|
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
|
|
||||||
def kktix_get_registerStatus(event_code):
|
|
||||||
html_result = None
|
|
||||||
|
|
||||||
url = "https://kktix.com/g/events/%s/register_info" % (event_code)
|
|
||||||
#print('event_code:',event_code)
|
|
||||||
#print("url:", url)
|
|
||||||
|
|
||||||
headers = {"Accept-Language": "zh-TW,zh;q=0.5", 'User-Agent': USER_AGENT}
|
|
||||||
try:
|
|
||||||
html_result = requests.get(url , headers=headers, timeout=0.7, allow_redirects=False)
|
|
||||||
except Exception as exc:
|
|
||||||
html_result = None
|
|
||||||
print("send reg_info request fail:")
|
|
||||||
print(exc)
|
|
||||||
|
|
||||||
registerStatus = ""
|
|
||||||
if not html_result is None:
|
|
||||||
status_code = html_result.status_code
|
|
||||||
#print("status_code:",status_code)
|
|
||||||
if status_code == 200:
|
|
||||||
html_text = html_result.text
|
|
||||||
#print("html_text:", html_text)
|
|
||||||
try:
|
|
||||||
jsLoads = json.loads(html_text)
|
|
||||||
if 'inventory' in jsLoads:
|
|
||||||
if 'registerStatus' in jsLoads['inventory']:
|
|
||||||
registerStatus = jsLoads['inventory']['registerStatus']
|
|
||||||
except Exception as exc:
|
|
||||||
print("load reg_info json fail:")
|
|
||||||
print(exc)
|
|
||||||
pass
|
|
||||||
|
|
||||||
#print("registerStatus:", registerStatus)
|
|
||||||
return registerStatus
|
|
||||||
|
|
||||||
def kktix_get_event_code(url):
|
|
||||||
event_code = ""
|
|
||||||
if '/registrations/new' in url:
|
|
||||||
prefix_list = ['.com/events/','.cc/events/']
|
|
||||||
postfix = '/registrations/new'
|
|
||||||
|
|
||||||
for prefix in prefix_list:
|
|
||||||
event_code = find_between(url,prefix,postfix)
|
|
||||||
if len(event_code) > 0:
|
|
||||||
break
|
|
||||||
|
|
||||||
#print('event_code:',event_code)
|
|
||||||
return event_code
|
|
||||||
|
|
||||||
def kktix_in_stock_play_sound():
|
def kktix_in_stock_play_sound():
|
||||||
global chk_state_play_ticket_sound
|
global chk_state_play_ticket_sound
|
||||||
if 'chk_state_play_ticket_sound' in globals():
|
if 'chk_state_play_ticket_sound' in globals():
|
||||||
|
@ -890,16 +789,6 @@ def kktix_in_stock_play_sound():
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_kktix_status_by_url(url):
|
|
||||||
registerStatus = ""
|
|
||||||
if len(url) > 0:
|
|
||||||
event_code = kktix_get_event_code(url)
|
|
||||||
#print(event_code)
|
|
||||||
if len(event_code) > 0:
|
|
||||||
registerStatus = kktix_get_registerStatus(event_code)
|
|
||||||
#print(registerStatus)
|
|
||||||
return registerStatus
|
|
||||||
|
|
||||||
def update_kktix_status(registerStatus):
|
def update_kktix_status(registerStatus):
|
||||||
global status_variable
|
global status_variable
|
||||||
if 'status_variable' in globals():
|
if 'status_variable' in globals():
|
||||||
|
@ -917,7 +806,7 @@ def append_kktix_status_log(output_log):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def append_kktix_status_log_file(output_log):
|
def append_kktix_status_log_file(output_log):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
log_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_LOG_FILE)
|
log_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_LOG_FILE)
|
||||||
file1 = open(log_filepath, "a") # append mode
|
file1 = open(log_filepath, "a") # append mode
|
||||||
file1.write(output_log)
|
file1.write(output_log)
|
||||||
|
@ -928,7 +817,7 @@ def kktix_status_query(config_dict, last_status, log_file=False):
|
||||||
datetime_string = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
datetime_string = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
||||||
registerStatus = ""
|
registerStatus = ""
|
||||||
if len(url) > 0:
|
if len(url) > 0:
|
||||||
registerStatus = get_kktix_status_by_url(url)
|
registerStatus = util.get_kktix_status_by_url(url)
|
||||||
update_kktix_status(registerStatus)
|
update_kktix_status(registerStatus)
|
||||||
|
|
||||||
if len(registerStatus) > 0:
|
if len(registerStatus) > 0:
|
||||||
|
@ -1037,7 +926,7 @@ def resetful_api_timer(log_file=False):
|
||||||
if is_ui_ready:
|
if is_ui_ready:
|
||||||
json_str_new = json.dumps(config_dict)
|
json_str_new = json.dumps(config_dict)
|
||||||
if json_str_new != json_str_old:
|
if json_str_new != json_str_old:
|
||||||
save_json(config_dict, config_filepath)
|
util.save_json(config_dict, config_filepath)
|
||||||
json_str_old = json_str_new
|
json_str_old = json_str_new
|
||||||
|
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
@ -1045,7 +934,7 @@ def resetful_api_timer(log_file=False):
|
||||||
def main(args):
|
def main(args):
|
||||||
silent_flag = False
|
silent_flag = False
|
||||||
if not args.silent is None:
|
if not args.silent is None:
|
||||||
silent_flag = t_or_f(args.silent)
|
silent_flag = util.t_or_f(args.silent)
|
||||||
#print("silent_flag:",silent_flag)
|
#print("silent_flag:",silent_flag)
|
||||||
|
|
||||||
if not silent_flag:
|
if not silent_flag:
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
"user_guess_string": "",
|
"user_guess_string": "",
|
||||||
"remote_url": "\"http://127.0.0.1:16888/\"",
|
"remote_url": "\"http://127.0.0.1:16888/\"",
|
||||||
"auto_reload_page_interval": 0.05,
|
"auto_reload_page_interval": 0.05,
|
||||||
"reset_browser_interval": 0.0,
|
"reset_browser_interval": 0,
|
||||||
"max_dwell_time": 60,
|
"max_dwell_time": 60,
|
||||||
"proxy_server_port": "",
|
"proxy_server_port": "",
|
||||||
"window_size": "512,1024",
|
"window_size": "512,1024",
|
||||||
|
|
328
settings.py
328
settings.py
|
@ -14,21 +14,12 @@ except ImportError:
|
||||||
from tkinter.filedialog import asksaveasfilename
|
from tkinter.filedialog import asksaveasfilename
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
'''
|
|
||||||
try:
|
|
||||||
import customtkinter
|
|
||||||
customtkinter.set_appearance_mode("dark") # Modes: system (default), light, dark
|
|
||||||
customtkinter.set_default_color_theme("dark-blue") # Themes: blue (default), dark-blue, green
|
|
||||||
except Exception as exc:
|
|
||||||
pass
|
|
||||||
'''
|
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import socket
|
|
||||||
import ssl
|
import ssl
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
@ -37,20 +28,20 @@ import time
|
||||||
import warnings
|
import warnings
|
||||||
import webbrowser
|
import webbrowser
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import pyperclip
|
import pyperclip
|
||||||
import requests
|
|
||||||
import tornado
|
import tornado
|
||||||
from tornado.web import Application
|
from tornado.web import Application
|
||||||
from urllib3.exceptions import InsecureRequestWarning
|
from urllib3.exceptions import InsecureRequestWarning
|
||||||
|
|
||||||
|
import util
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ddddocr
|
import ddddocr
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.19)"
|
CONST_APP_VERSION = "MaxBot (2024.03.20)"
|
||||||
|
|
||||||
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
@ -600,80 +591,6 @@ def load_translate():
|
||||||
translate['ja_jp']=ja_jp
|
translate['ja_jp']=ja_jp
|
||||||
return translate
|
return translate
|
||||||
|
|
||||||
def get_ip_address():
|
|
||||||
gethostname = None
|
|
||||||
try:
|
|
||||||
gethostname = socket.gethostname()
|
|
||||||
except Exception as exc:
|
|
||||||
print(exc)
|
|
||||||
gethostname = None
|
|
||||||
|
|
||||||
default_ip = "127.0.0.1"
|
|
||||||
ip = default_ip
|
|
||||||
if not gethostname is None:
|
|
||||||
try:
|
|
||||||
ip = [l for l in ([ip for ip in socket.gethostbyname_ex(gethostname)[2]
|
|
||||||
if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)),
|
|
||||||
s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET,
|
|
||||||
socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
|
|
||||||
except Exception as exc:
|
|
||||||
print(exc)
|
|
||||||
ip = gethostname
|
|
||||||
|
|
||||||
#print("get_ip_address:", ip)
|
|
||||||
return ip
|
|
||||||
|
|
||||||
def format_config_keyword_for_json(user_input):
|
|
||||||
if len(user_input) > 0:
|
|
||||||
if not ('\"' in user_input):
|
|
||||||
user_input = '"' + user_input + '"'
|
|
||||||
|
|
||||||
if user_input[:1]=="{" and user_input[-1:]=="}":
|
|
||||||
tmp_json = {}
|
|
||||||
try:
|
|
||||||
tmp_json = json.loads(user_input)
|
|
||||||
key=list(tmp_json.keys())[0]
|
|
||||||
first_item=tmp_json[key]
|
|
||||||
user_input=json.dumps(first_item)
|
|
||||||
except Exception as exc:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if user_input[:1]=="[" and user_input[-1:]=="]":
|
|
||||||
user_input=user_input[1:]
|
|
||||||
user_input=user_input[:-1]
|
|
||||||
return user_input
|
|
||||||
|
|
||||||
def sx(s1):
|
|
||||||
key=18
|
|
||||||
return ''.join(chr(ord(a) ^ key) for a in s1)
|
|
||||||
|
|
||||||
def decryptMe(b):
|
|
||||||
s=""
|
|
||||||
if(len(b)>0):
|
|
||||||
s=sx(base64.b64decode(b).decode("UTF-8"))
|
|
||||||
return s
|
|
||||||
|
|
||||||
def encryptMe(s):
|
|
||||||
data=""
|
|
||||||
if(len(s)>0):
|
|
||||||
data=base64.b64encode(sx(s).encode('UTF-8')).decode("UTF-8")
|
|
||||||
return data
|
|
||||||
|
|
||||||
def is_arm():
|
|
||||||
ret = False
|
|
||||||
if "-arm" in platform.platform():
|
|
||||||
ret = True
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def get_app_root():
|
|
||||||
app_root = ""
|
|
||||||
if hasattr(sys, 'frozen'):
|
|
||||||
basis = sys.executable
|
|
||||||
app_root = os.path.dirname(basis)
|
|
||||||
else:
|
|
||||||
app_root = os.getcwd()
|
|
||||||
return app_root
|
|
||||||
|
|
||||||
def get_default_config():
|
def get_default_config():
|
||||||
config_dict={}
|
config_dict={}
|
||||||
|
|
||||||
|
@ -688,7 +605,7 @@ def get_default_config():
|
||||||
config_dict["ocr_captcha"]["image_source"] = CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS
|
config_dict["ocr_captcha"]["image_source"] = CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS
|
||||||
config_dict["webdriver_type"] = CONST_WEBDRIVER_TYPE_UC
|
config_dict["webdriver_type"] = CONST_WEBDRIVER_TYPE_UC
|
||||||
|
|
||||||
if is_arm():
|
if util.is_arm():
|
||||||
config_dict["ocr_captcha"]["enable"] = False
|
config_dict["ocr_captcha"]["enable"] = False
|
||||||
config_dict["ocr_captcha"]["force_submit"] = False
|
config_dict["ocr_captcha"]["force_submit"] = False
|
||||||
|
|
||||||
|
@ -785,7 +702,7 @@ def read_last_url_from_file():
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def load_json():
|
def load_json():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
|
|
||||||
# overwrite config path.
|
# overwrite config path.
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
|
@ -799,7 +716,7 @@ def load_json():
|
||||||
return config_filepath, config_dict
|
return config_filepath, config_dict
|
||||||
|
|
||||||
def btn_restore_defaults_clicked(language_code):
|
def btn_restore_defaults_clicked(language_code):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
if os.path.exists(str(config_filepath)):
|
if os.path.exists(str(config_filepath)):
|
||||||
try:
|
try:
|
||||||
|
@ -815,7 +732,7 @@ def btn_restore_defaults_clicked(language_code):
|
||||||
load_GUI(root, config_dict)
|
load_GUI(root, config_dict)
|
||||||
|
|
||||||
def do_maxbot_idle():
|
def do_maxbot_idle():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE)
|
idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE)
|
||||||
with open(CONST_MAXBOT_INT28_FILE, "w") as text_file:
|
with open(CONST_MAXBOT_INT28_FILE, "w") as text_file:
|
||||||
text_file.write("")
|
text_file.write("")
|
||||||
|
@ -825,10 +742,10 @@ def btn_idle_clicked(language_code):
|
||||||
update_maxbot_runtime_status()
|
update_maxbot_runtime_status()
|
||||||
|
|
||||||
def do_maxbot_resume():
|
def do_maxbot_resume():
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE)
|
idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE)
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
force_remove_file(idle_filepath)
|
util.force_remove_file(idle_filepath)
|
||||||
|
|
||||||
def btn_resume_clicked(language_code):
|
def btn_resume_clicked(language_code):
|
||||||
do_maxbot_resume()
|
do_maxbot_resume()
|
||||||
|
@ -844,7 +761,7 @@ def btn_save_clicked():
|
||||||
btn_save_act()
|
btn_save_act()
|
||||||
|
|
||||||
def btn_save_act(slience_mode=False):
|
def btn_save_act(slience_mode=False):
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
|
@ -967,35 +884,35 @@ def btn_save_act(slience_mode=False):
|
||||||
config_dict["date_auto_select"]["mode"] = combo_date_auto_select_mode.get().strip()
|
config_dict["date_auto_select"]["mode"] = combo_date_auto_select_mode.get().strip()
|
||||||
|
|
||||||
date_keyword = txt_date_keyword.get("1.0",END).strip()
|
date_keyword = txt_date_keyword.get("1.0",END).strip()
|
||||||
date_keyword = format_config_keyword_for_json(date_keyword)
|
date_keyword = util.format_config_keyword_for_json(date_keyword)
|
||||||
config_dict["date_auto_select"]["date_keyword"] = date_keyword
|
config_dict["date_auto_select"]["date_keyword"] = date_keyword
|
||||||
|
|
||||||
config_dict["tixcraft"]["pass_date_is_sold_out"] = bool(chk_state_pass_date_is_sold_out.get())
|
config_dict["tixcraft"]["pass_date_is_sold_out"] = bool(chk_state_pass_date_is_sold_out.get())
|
||||||
config_dict["tixcraft"]["auto_reload_coming_soon_page"] = bool(chk_state_auto_reload_coming_soon_page.get())
|
config_dict["tixcraft"]["auto_reload_coming_soon_page"] = bool(chk_state_auto_reload_coming_soon_page.get())
|
||||||
|
|
||||||
area_keyword = txt_area_keyword.get("1.0",END).strip()
|
area_keyword = txt_area_keyword.get("1.0",END).strip()
|
||||||
area_keyword = format_config_keyword_for_json(area_keyword)
|
area_keyword = util.format_config_keyword_for_json(area_keyword)
|
||||||
|
|
||||||
keyword_exclude = txt_keyword_exclude.get("1.0",END).strip()
|
keyword_exclude = txt_keyword_exclude.get("1.0",END).strip()
|
||||||
keyword_exclude = format_config_keyword_for_json(keyword_exclude)
|
keyword_exclude = util.format_config_keyword_for_json(keyword_exclude)
|
||||||
|
|
||||||
user_guess_string = txt_user_guess_string.get("1.0",END).strip()
|
user_guess_string = txt_user_guess_string.get("1.0",END).strip()
|
||||||
user_guess_string = format_config_keyword_for_json(user_guess_string)
|
user_guess_string = util.format_config_keyword_for_json(user_guess_string)
|
||||||
|
|
||||||
remote_url = txt_remote_url.get("1.0",END).strip()
|
remote_url = txt_remote_url.get("1.0",END).strip()
|
||||||
remote_url = format_config_keyword_for_json(remote_url)
|
remote_url = util.format_config_keyword_for_json(remote_url)
|
||||||
|
|
||||||
idle_keyword = txt_idle_keyword.get("1.0",END).strip()
|
idle_keyword = txt_idle_keyword.get("1.0",END).strip()
|
||||||
idle_keyword = format_config_keyword_for_json(idle_keyword)
|
idle_keyword = util.format_config_keyword_for_json(idle_keyword)
|
||||||
|
|
||||||
resume_keyword = txt_resume_keyword.get("1.0",END).strip()
|
resume_keyword = txt_resume_keyword.get("1.0",END).strip()
|
||||||
resume_keyword = format_config_keyword_for_json(resume_keyword)
|
resume_keyword = util.format_config_keyword_for_json(resume_keyword)
|
||||||
|
|
||||||
idle_keyword_second = txt_idle_keyword_second.get("1.0",END).strip()
|
idle_keyword_second = txt_idle_keyword_second.get("1.0",END).strip()
|
||||||
idle_keyword_second = format_config_keyword_for_json(idle_keyword_second)
|
idle_keyword_second = util.format_config_keyword_for_json(idle_keyword_second)
|
||||||
|
|
||||||
resume_keyword_second = txt_resume_keyword_second.get("1.0",END).strip()
|
resume_keyword_second = txt_resume_keyword_second.get("1.0",END).strip()
|
||||||
resume_keyword_second = format_config_keyword_for_json(resume_keyword_second)
|
resume_keyword_second = util.format_config_keyword_for_json(resume_keyword_second)
|
||||||
|
|
||||||
# test keyword format.
|
# test keyword format.
|
||||||
if is_all_data_correct:
|
if is_all_data_correct:
|
||||||
|
@ -1127,16 +1044,16 @@ def btn_save_act(slience_mode=False):
|
||||||
config_dict["advanced"]["tixcraft_sid"] = config_dict["advanced"]["tixcraft_sid"]
|
config_dict["advanced"]["tixcraft_sid"] = config_dict["advanced"]["tixcraft_sid"]
|
||||||
config_dict["advanced"]["ibonqware"] = config_dict["advanced"]["ibonqware"]
|
config_dict["advanced"]["ibonqware"] = config_dict["advanced"]["ibonqware"]
|
||||||
|
|
||||||
config_dict["advanced"]["facebook_password"] = encryptMe(config_dict["advanced"]["facebook_password"])
|
config_dict["advanced"]["facebook_password"] = util.encryptMe(config_dict["advanced"]["facebook_password"])
|
||||||
config_dict["advanced"]["kktix_password"] = encryptMe(config_dict["advanced"]["kktix_password"])
|
config_dict["advanced"]["kktix_password"] = util.encryptMe(config_dict["advanced"]["kktix_password"])
|
||||||
config_dict["advanced"]["fami_password"] = encryptMe(config_dict["advanced"]["fami_password"])
|
config_dict["advanced"]["fami_password"] = util.encryptMe(config_dict["advanced"]["fami_password"])
|
||||||
config_dict["advanced"]["cityline_password"] = encryptMe(config_dict["advanced"]["cityline_password"])
|
config_dict["advanced"]["cityline_password"] = util.encryptMe(config_dict["advanced"]["cityline_password"])
|
||||||
config_dict["advanced"]["urbtix_password"] = encryptMe(config_dict["advanced"]["urbtix_password"])
|
config_dict["advanced"]["urbtix_password"] = util.encryptMe(config_dict["advanced"]["urbtix_password"])
|
||||||
config_dict["advanced"]["hkticketing_password"] = encryptMe(config_dict["advanced"]["hkticketing_password"])
|
config_dict["advanced"]["hkticketing_password"] = util.encryptMe(config_dict["advanced"]["hkticketing_password"])
|
||||||
config_dict["advanced"]["kham_password"] = encryptMe(config_dict["advanced"]["kham_password"])
|
config_dict["advanced"]["kham_password"] = util.encryptMe(config_dict["advanced"]["kham_password"])
|
||||||
config_dict["advanced"]["ticket_password"] = encryptMe(config_dict["advanced"]["ticket_password"])
|
config_dict["advanced"]["ticket_password"] = util.encryptMe(config_dict["advanced"]["ticket_password"])
|
||||||
config_dict["advanced"]["udn_password"] = encryptMe(config_dict["advanced"]["udn_password"])
|
config_dict["advanced"]["udn_password"] = util.encryptMe(config_dict["advanced"]["udn_password"])
|
||||||
config_dict["advanced"]["ticketplus_password"] = encryptMe(config_dict["advanced"]["ticketplus_password"])
|
config_dict["advanced"]["ticketplus_password"] = util.encryptMe(config_dict["advanced"]["ticketplus_password"])
|
||||||
|
|
||||||
config_dict["advanced"]["chrome_extension"] = bool(chk_state_chrome_extension.get())
|
config_dict["advanced"]["chrome_extension"] = bool(chk_state_chrome_extension.get())
|
||||||
config_dict["advanced"]["disable_adjacent_seat"] = bool(chk_state_adjacent_seat.get())
|
config_dict["advanced"]["disable_adjacent_seat"] = bool(chk_state_adjacent_seat.get())
|
||||||
|
@ -1149,7 +1066,7 @@ def btn_save_act(slience_mode=False):
|
||||||
config_dict["ocr_captcha"]["force_submit"] = bool(chk_state_ocr_captcha_force_submit.get())
|
config_dict["ocr_captcha"]["force_submit"] = bool(chk_state_ocr_captcha_force_submit.get())
|
||||||
config_dict["ocr_captcha"]["image_source"] = combo_ocr_captcha_image_source.get().strip()
|
config_dict["ocr_captcha"]["image_source"] = combo_ocr_captcha_image_source.get().strip()
|
||||||
|
|
||||||
if is_arm():
|
if util.is_arm():
|
||||||
config_dict["ocr_captcha"]["enable"] = False
|
config_dict["ocr_captcha"]["enable"] = False
|
||||||
config_dict["ocr_captcha"]["force_submit"] = False
|
config_dict["ocr_captcha"]["force_submit"] = False
|
||||||
|
|
||||||
|
@ -1161,7 +1078,7 @@ def btn_save_act(slience_mode=False):
|
||||||
|
|
||||||
config_dict["advanced"]["auto_reload_page_interval"] = float(txt_auto_reload_page_interval.get().strip())
|
config_dict["advanced"]["auto_reload_page_interval"] = float(txt_auto_reload_page_interval.get().strip())
|
||||||
config_dict["advanced"]["max_dwell_time"] = int(txt_max_dwell_time.get().strip())
|
config_dict["advanced"]["max_dwell_time"] = int(txt_max_dwell_time.get().strip())
|
||||||
config_dict["advanced"]["reset_browser_interval"] = float(txt_reset_browser_interval.get().strip())
|
config_dict["advanced"]["reset_browser_interval"] = int(txt_reset_browser_interval.get().strip())
|
||||||
config_dict["advanced"]["proxy_server_port"] = txt_proxy_server_port.get().strip()
|
config_dict["advanced"]["proxy_server_port"] = txt_proxy_server_port.get().strip()
|
||||||
config_dict["advanced"]["window_size"] = txt_window_size.get().strip()
|
config_dict["advanced"]["window_size"] = txt_window_size.get().strip()
|
||||||
|
|
||||||
|
@ -1183,17 +1100,13 @@ def btn_save_act(slience_mode=False):
|
||||||
if not file_to_save is None:
|
if not file_to_save is None:
|
||||||
if len(file_to_save) > 0:
|
if len(file_to_save) > 0:
|
||||||
print("save as to:", file_to_save)
|
print("save as to:", file_to_save)
|
||||||
save_json(config_dict, file_to_save)
|
util.save_json(config_dict, file_to_save)
|
||||||
else:
|
else:
|
||||||
# slience
|
# slience
|
||||||
save_json(config_dict, config_filepath)
|
util.save_json(config_dict, config_filepath)
|
||||||
|
|
||||||
return is_all_data_correct
|
return is_all_data_correct
|
||||||
|
|
||||||
def save_json(config_dict, target_path):
|
|
||||||
json_str = json.dumps(config_dict, indent=4)
|
|
||||||
with open(target_path, 'w') as outfile:
|
|
||||||
outfile.write(json_str)
|
|
||||||
|
|
||||||
def btn_run_clicked(language_code):
|
def btn_run_clicked(language_code):
|
||||||
print('run button pressed.')
|
print('run button pressed.')
|
||||||
|
@ -1212,7 +1125,7 @@ def show_preview_text():
|
||||||
with open(CONST_MAXBOT_ANSWER_ONLINE_FILE, "r") as text_file:
|
with open(CONST_MAXBOT_ANSWER_ONLINE_FILE, "r") as text_file:
|
||||||
answer_text = text_file.readline()
|
answer_text = text_file.readline()
|
||||||
|
|
||||||
answer_text = format_config_keyword_for_json(answer_text)
|
answer_text = util.format_config_keyword_for_json(answer_text)
|
||||||
|
|
||||||
date_array = []
|
date_array = []
|
||||||
try:
|
try:
|
||||||
|
@ -1227,45 +1140,6 @@ def show_preview_text():
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def write_string_to_file(filename, data):
|
|
||||||
outfile = None
|
|
||||||
if platform.system() == 'Windows':
|
|
||||||
outfile = open(filename, 'w', encoding='UTF-8')
|
|
||||||
else:
|
|
||||||
outfile = open(filename, 'w')
|
|
||||||
|
|
||||||
if not outfile is None:
|
|
||||||
outfile.write("%s" % data)
|
|
||||||
|
|
||||||
def save_url_to_file(new_remote_url, force_write = False):
|
|
||||||
html_text = ""
|
|
||||||
if len(new_remote_url) > 0:
|
|
||||||
html_result = None
|
|
||||||
try:
|
|
||||||
html_result = requests.get(new_remote_url , timeout=0.5, allow_redirects=False)
|
|
||||||
except Exception as exc:
|
|
||||||
html_result = None
|
|
||||||
#print(exc)
|
|
||||||
if not html_result is None:
|
|
||||||
status_code = html_result.status_code
|
|
||||||
#print("status_code:", status_code)
|
|
||||||
if status_code == 200:
|
|
||||||
html_text = html_result.text
|
|
||||||
#print("html_text:", html_text)
|
|
||||||
|
|
||||||
is_write_to_file = False
|
|
||||||
if force_write:
|
|
||||||
is_write_to_file = True
|
|
||||||
if len(html_text) > 0:
|
|
||||||
is_write_to_file = True
|
|
||||||
|
|
||||||
if is_write_to_file:
|
|
||||||
html_text = format_config_keyword_for_json(html_text)
|
|
||||||
working_dir = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
target_path = os.path.join(working_dir, CONST_MAXBOT_ANSWER_ONLINE_FILE)
|
|
||||||
write_string_to_file(target_path, html_text)
|
|
||||||
return is_write_to_file
|
|
||||||
|
|
||||||
def btn_preview_text_clicked():
|
def btn_preview_text_clicked():
|
||||||
global txt_remote_url
|
global txt_remote_url
|
||||||
remote_url = ""
|
remote_url = ""
|
||||||
|
@ -1274,7 +1148,7 @@ def btn_preview_text_clicked():
|
||||||
remote_url = txt_remote_url.get("1.0",END).strip()
|
remote_url = txt_remote_url.get("1.0",END).strip()
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
pass
|
||||||
remote_url = format_config_keyword_for_json(remote_url)
|
remote_url = util.format_config_keyword_for_json(remote_url)
|
||||||
|
|
||||||
if len(remote_url) > 0:
|
if len(remote_url) > 0:
|
||||||
url_array = []
|
url_array = []
|
||||||
|
@ -1288,7 +1162,7 @@ def btn_preview_text_clicked():
|
||||||
force_write = True
|
force_write = True
|
||||||
for each_url in url_array:
|
for each_url in url_array:
|
||||||
#print("new_remote_url:", new_remote_url)
|
#print("new_remote_url:", new_remote_url)
|
||||||
is_write_to_file = save_url_to_file(each_url, force_write=force_write)
|
is_write_to_file = util.save_url_to_file(each_url, CONST_MAXBOT_ANSWER_ONLINE_FILE, force_write=force_write)
|
||||||
if is_write_to_file:
|
if is_write_to_file:
|
||||||
break
|
break
|
||||||
show_preview_text()
|
show_preview_text()
|
||||||
|
@ -1339,26 +1213,9 @@ def btn_preview_sound_clicked():
|
||||||
global txt_play_sound_filename
|
global txt_play_sound_filename
|
||||||
new_sound_filename = txt_play_sound_filename.get().strip()
|
new_sound_filename = txt_play_sound_filename.get().strip()
|
||||||
#print("new_sound_filename:", new_sound_filename)
|
#print("new_sound_filename:", new_sound_filename)
|
||||||
app_root = get_app_root()
|
app_root = util.get_app_root()
|
||||||
new_sound_filename = os.path.join(app_root, new_sound_filename)
|
new_sound_filename = os.path.join(app_root, new_sound_filename)
|
||||||
play_mp3_async(new_sound_filename)
|
util.play_mp3_async(new_sound_filename)
|
||||||
|
|
||||||
def play_mp3_async(sound_filename):
|
|
||||||
threading.Thread(target=play_mp3, args=(sound_filename,)).start()
|
|
||||||
|
|
||||||
def play_mp3(sound_filename):
|
|
||||||
from playsound import playsound
|
|
||||||
try:
|
|
||||||
playsound(sound_filename)
|
|
||||||
except Exception as exc:
|
|
||||||
msg=str(exc)
|
|
||||||
#print("play sound exeption:", msg)
|
|
||||||
if platform.system() == 'Windows':
|
|
||||||
import winsound
|
|
||||||
try:
|
|
||||||
winsound.PlaySound(sound_filename, winsound.SND_FILENAME)
|
|
||||||
except Exception as exc2:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def open_url(url):
|
def open_url(url):
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
@ -2332,7 +2189,7 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
|
|
||||||
global lbl_ocr_captcha_not_support_arm
|
global lbl_ocr_captcha_not_support_arm
|
||||||
lbl_ocr_captcha_not_support_arm = Label(frame_group_ddddocr_enable, fg="red", text=translate[language_code]['ocr_captcha_not_support_arm'])
|
lbl_ocr_captcha_not_support_arm = Label(frame_group_ddddocr_enable, fg="red", text=translate[language_code]['ocr_captcha_not_support_arm'])
|
||||||
if is_arm():
|
if util.is_arm():
|
||||||
lbl_ocr_captcha_not_support_arm.grid(column=1, row=0, sticky = E)
|
lbl_ocr_captcha_not_support_arm.grid(column=1, row=0, sticky = E)
|
||||||
|
|
||||||
frame_group_ddddocr_enable.grid(column=1, row=group_row_count, sticky = W)
|
frame_group_ddddocr_enable.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
@ -2450,7 +2307,7 @@ def ServerTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
lbl_server_url = Label(frame_group_header, text=translate[language_code]['server_url'])
|
lbl_server_url = Label(frame_group_header, text=translate[language_code]['server_url'])
|
||||||
lbl_server_url.grid(column=0, row=group_row_count, sticky = E)
|
lbl_server_url.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
local_ip = get_ip_address()
|
local_ip = util.get_ip_address()
|
||||||
ip_address = "http://%s:%d/" % (local_ip, CONST_SERVER_PORT)
|
ip_address = "http://%s:%d/" % (local_ip, CONST_SERVER_PORT)
|
||||||
global lbl_ip_address
|
global lbl_ip_address
|
||||||
lbl_ip_address = Label(frame_group_header, text=ip_address)
|
lbl_ip_address = Label(frame_group_header, text=ip_address)
|
||||||
|
@ -2548,7 +2405,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_facebook_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_facebook_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_facebook_password
|
global txt_facebook_password
|
||||||
txt_facebook_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["facebook_password"].strip()))
|
txt_facebook_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["facebook_password"].strip()))
|
||||||
txt_facebook_password = Entry(frame_group_header, width=15, textvariable = txt_facebook_password_value, show="*")
|
txt_facebook_password = Entry(frame_group_header, width=15, textvariable = txt_facebook_password_value, show="*")
|
||||||
txt_facebook_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_facebook_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2564,7 +2421,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_kktix_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_kktix_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_kktix_password
|
global txt_kktix_password
|
||||||
txt_kktix_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["kktix_password"].strip()))
|
txt_kktix_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["kktix_password"].strip()))
|
||||||
txt_kktix_password = Entry(frame_group_header, width=15, textvariable = txt_kktix_password_value, show="*")
|
txt_kktix_password = Entry(frame_group_header, width=15, textvariable = txt_kktix_password_value, show="*")
|
||||||
txt_kktix_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_kktix_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2580,7 +2437,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_fami_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_fami_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_fami_password
|
global txt_fami_password
|
||||||
txt_fami_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["fami_password"].strip()))
|
txt_fami_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["fami_password"].strip()))
|
||||||
txt_fami_password = Entry(frame_group_header, width=15, textvariable = txt_fami_password_value, show="*")
|
txt_fami_password = Entry(frame_group_header, width=15, textvariable = txt_fami_password_value, show="*")
|
||||||
txt_fami_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_fami_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2596,7 +2453,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_cityline_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_cityline_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_cityline_password
|
global txt_cityline_password
|
||||||
txt_cityline_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["cityline_password"].strip()))
|
txt_cityline_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["cityline_password"].strip()))
|
||||||
txt_cityline_password = Entry(frame_group_header, width=15, textvariable = txt_cityline_password_value, show="*")
|
txt_cityline_password = Entry(frame_group_header, width=15, textvariable = txt_cityline_password_value, show="*")
|
||||||
txt_cityline_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_cityline_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2612,7 +2469,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_urbtix_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_urbtix_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_urbtix_password
|
global txt_urbtix_password
|
||||||
txt_urbtix_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["urbtix_password"].strip()))
|
txt_urbtix_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["urbtix_password"].strip()))
|
||||||
txt_urbtix_password = Entry(frame_group_header, width=15, textvariable = txt_urbtix_password_value, show="*")
|
txt_urbtix_password = Entry(frame_group_header, width=15, textvariable = txt_urbtix_password_value, show="*")
|
||||||
txt_urbtix_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_urbtix_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2628,7 +2485,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_hkticketing_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_hkticketing_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_hkticketing_password
|
global txt_hkticketing_password
|
||||||
txt_hkticketing_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["hkticketing_password"].strip()))
|
txt_hkticketing_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["hkticketing_password"].strip()))
|
||||||
txt_hkticketing_password = Entry(frame_group_header, width=15, textvariable = txt_hkticketing_password_value, show="*")
|
txt_hkticketing_password = Entry(frame_group_header, width=15, textvariable = txt_hkticketing_password_value, show="*")
|
||||||
txt_hkticketing_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_hkticketing_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2644,7 +2501,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_kham_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_kham_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_kham_password
|
global txt_kham_password
|
||||||
txt_kham_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["kham_password"].strip()))
|
txt_kham_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["kham_password"].strip()))
|
||||||
txt_kham_password = Entry(frame_group_header, width=15, textvariable = txt_kham_password_value, show="*")
|
txt_kham_password = Entry(frame_group_header, width=15, textvariable = txt_kham_password_value, show="*")
|
||||||
txt_kham_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_kham_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2660,7 +2517,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_ticket_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_ticket_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_ticket_password
|
global txt_ticket_password
|
||||||
txt_ticket_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["ticket_password"].strip()))
|
txt_ticket_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["ticket_password"].strip()))
|
||||||
txt_ticket_password = Entry(frame_group_header, width=15, textvariable = txt_ticket_password_value, show="*")
|
txt_ticket_password = Entry(frame_group_header, width=15, textvariable = txt_ticket_password_value, show="*")
|
||||||
txt_ticket_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_ticket_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2676,7 +2533,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_udn_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_udn_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_udn_password
|
global txt_udn_password
|
||||||
txt_udn_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["udn_password"].strip()))
|
txt_udn_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["udn_password"].strip()))
|
||||||
txt_udn_password = Entry(frame_group_header, width=15, textvariable = txt_udn_password_value, show="*")
|
txt_udn_password = Entry(frame_group_header, width=15, textvariable = txt_udn_password_value, show="*")
|
||||||
txt_udn_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_udn_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2692,7 +2549,7 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_ticketplus_account.grid(column=1, row=group_row_count, sticky = W)
|
txt_ticketplus_account.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
global txt_ticketplus_password
|
global txt_ticketplus_password
|
||||||
txt_ticketplus_password_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["ticketplus_password"].strip()))
|
txt_ticketplus_password_value = StringVar(frame_group_header, value=util.decryptMe(config_dict["advanced"]["ticketplus_password"].strip()))
|
||||||
txt_ticketplus_password = Entry(frame_group_header, width=15, textvariable = txt_ticketplus_password_value, show="*")
|
txt_ticketplus_password = Entry(frame_group_header, width=15, textvariable = txt_ticketplus_password_value, show="*")
|
||||||
txt_ticketplus_password.grid(column=2, row=group_row_count, sticky = W)
|
txt_ticketplus_password.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
@ -2704,33 +2561,6 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
|
|
||||||
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
|
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
|
||||||
|
|
||||||
def is_text_match_keyword(keyword_string, text):
|
|
||||||
is_match_keyword = True
|
|
||||||
if len(keyword_string) > 0 and len(text) > 0:
|
|
||||||
is_match_keyword = False
|
|
||||||
keyword_array = []
|
|
||||||
try:
|
|
||||||
keyword_array = json.loads("["+ keyword_string +"]")
|
|
||||||
except Exception as exc:
|
|
||||||
keyword_array = []
|
|
||||||
for item_list in keyword_array:
|
|
||||||
if len(item_list) > 0:
|
|
||||||
if ' ' in item_list:
|
|
||||||
keyword_item_array = item_list.split(' ')
|
|
||||||
is_match_all = True
|
|
||||||
for each_item in keyword_item_array:
|
|
||||||
if not each_item in text:
|
|
||||||
is_match_all = False
|
|
||||||
if is_match_all:
|
|
||||||
is_match_keyword = True
|
|
||||||
else:
|
|
||||||
if item_list in text:
|
|
||||||
is_match_keyword = True
|
|
||||||
else:
|
|
||||||
is_match_keyword = True
|
|
||||||
if is_match_keyword:
|
|
||||||
break
|
|
||||||
return is_match_keyword
|
|
||||||
|
|
||||||
def change_maxbot_status_by_keyword():
|
def change_maxbot_status_by_keyword():
|
||||||
config_filepath, config_dict = load_json()
|
config_filepath, config_dict = load_json()
|
||||||
|
@ -2739,24 +2569,24 @@ def change_maxbot_status_by_keyword():
|
||||||
current_time = system_clock_data.strftime('%H:%M:%S')
|
current_time = system_clock_data.strftime('%H:%M:%S')
|
||||||
#print('Current Time is:', current_time)
|
#print('Current Time is:', current_time)
|
||||||
if len(config_dict["advanced"]["idle_keyword"]) > 0:
|
if len(config_dict["advanced"]["idle_keyword"]) > 0:
|
||||||
is_matched = is_text_match_keyword(config_dict["advanced"]["idle_keyword"], current_time)
|
is_matched = util.is_text_match_keyword(config_dict["advanced"]["idle_keyword"], current_time)
|
||||||
if is_matched:
|
if is_matched:
|
||||||
#print("match to idle:", current_time)
|
#print("match to idle:", current_time)
|
||||||
do_maxbot_idle()
|
do_maxbot_idle()
|
||||||
if len(config_dict["advanced"]["resume_keyword"]) > 0:
|
if len(config_dict["advanced"]["resume_keyword"]) > 0:
|
||||||
is_matched = is_text_match_keyword(config_dict["advanced"]["resume_keyword"], current_time)
|
is_matched = util.is_text_match_keyword(config_dict["advanced"]["resume_keyword"], current_time)
|
||||||
if is_matched:
|
if is_matched:
|
||||||
#print("match to resume:", current_time)
|
#print("match to resume:", current_time)
|
||||||
do_maxbot_resume()
|
do_maxbot_resume()
|
||||||
|
|
||||||
current_time = system_clock_data.strftime('%S')
|
current_time = system_clock_data.strftime('%S')
|
||||||
if len(config_dict["advanced"]["idle_keyword_second"]) > 0:
|
if len(config_dict["advanced"]["idle_keyword_second"]) > 0:
|
||||||
is_matched = is_text_match_keyword(config_dict["advanced"]["idle_keyword_second"], current_time)
|
is_matched = util.is_text_match_keyword(config_dict["advanced"]["idle_keyword_second"], current_time)
|
||||||
if is_matched:
|
if is_matched:
|
||||||
#print("match to idle:", current_time)
|
#print("match to idle:", current_time)
|
||||||
do_maxbot_idle()
|
do_maxbot_idle()
|
||||||
if len(config_dict["advanced"]["resume_keyword_second"]) > 0:
|
if len(config_dict["advanced"]["resume_keyword_second"]) > 0:
|
||||||
is_matched = is_text_match_keyword(config_dict["advanced"]["resume_keyword_second"], current_time)
|
is_matched = util.is_text_match_keyword(config_dict["advanced"]["resume_keyword_second"], current_time)
|
||||||
if is_matched:
|
if is_matched:
|
||||||
#print("match to resume:", current_time)
|
#print("match to resume:", current_time)
|
||||||
do_maxbot_resume()
|
do_maxbot_resume()
|
||||||
|
@ -2781,37 +2611,37 @@ def check_maxbot_config_unsaved(config_dict):
|
||||||
date_keyword = ""
|
date_keyword = ""
|
||||||
if 'txt_date_keyword' in globals():
|
if 'txt_date_keyword' in globals():
|
||||||
date_keyword = txt_date_keyword.get("1.0",END).strip()
|
date_keyword = txt_date_keyword.get("1.0",END).strip()
|
||||||
date_keyword = format_config_keyword_for_json(date_keyword)
|
date_keyword = util.format_config_keyword_for_json(date_keyword)
|
||||||
|
|
||||||
area_keyword = ""
|
area_keyword = ""
|
||||||
if 'txt_area_keyword' in globals():
|
if 'txt_area_keyword' in globals():
|
||||||
area_keyword = txt_area_keyword.get("1.0",END).strip()
|
area_keyword = txt_area_keyword.get("1.0",END).strip()
|
||||||
area_keyword = format_config_keyword_for_json(area_keyword)
|
area_keyword = util.format_config_keyword_for_json(area_keyword)
|
||||||
|
|
||||||
keyword_exclude = ""
|
keyword_exclude = ""
|
||||||
if 'txt_keyword_exclude' in globals():
|
if 'txt_keyword_exclude' in globals():
|
||||||
keyword_exclude = txt_keyword_exclude.get("1.0",END).strip()
|
keyword_exclude = txt_keyword_exclude.get("1.0",END).strip()
|
||||||
keyword_exclude = format_config_keyword_for_json(keyword_exclude)
|
keyword_exclude = util.format_config_keyword_for_json(keyword_exclude)
|
||||||
|
|
||||||
idle_keyword = ""
|
idle_keyword = ""
|
||||||
if 'txt_idle_keyword' in globals():
|
if 'txt_idle_keyword' in globals():
|
||||||
idle_keyword = txt_idle_keyword.get("1.0",END).strip()
|
idle_keyword = txt_idle_keyword.get("1.0",END).strip()
|
||||||
idle_keyword = format_config_keyword_for_json(idle_keyword)
|
idle_keyword = util.format_config_keyword_for_json(idle_keyword)
|
||||||
|
|
||||||
resume_keyword = ""
|
resume_keyword = ""
|
||||||
if 'txt_resume_keyword' in globals():
|
if 'txt_resume_keyword' in globals():
|
||||||
resume_keyword = txt_resume_keyword.get("1.0",END).strip()
|
resume_keyword = txt_resume_keyword.get("1.0",END).strip()
|
||||||
resume_keyword = format_config_keyword_for_json(resume_keyword)
|
resume_keyword = util.format_config_keyword_for_json(resume_keyword)
|
||||||
|
|
||||||
idle_keyword_second = ""
|
idle_keyword_second = ""
|
||||||
if 'txt_idle_keyword_second' in globals():
|
if 'txt_idle_keyword_second' in globals():
|
||||||
idle_keyword_second = txt_idle_keyword_second.get("1.0",END).strip()
|
idle_keyword_second = txt_idle_keyword_second.get("1.0",END).strip()
|
||||||
idle_keyword_second = format_config_keyword_for_json(idle_keyword_second)
|
idle_keyword_second = util.format_config_keyword_for_json(idle_keyword_second)
|
||||||
|
|
||||||
resume_keyword_second = ""
|
resume_keyword_second = ""
|
||||||
if 'txt_resume_keyword_second' in globals():
|
if 'txt_resume_keyword_second' in globals():
|
||||||
resume_keyword_second = txt_resume_keyword_second.get("1.0",END).strip()
|
resume_keyword_second = txt_resume_keyword_second.get("1.0",END).strip()
|
||||||
resume_keyword_second = format_config_keyword_for_json(resume_keyword_second)
|
resume_keyword_second = util.format_config_keyword_for_json(resume_keyword_second)
|
||||||
|
|
||||||
highlightthickness = 0
|
highlightthickness = 0
|
||||||
if 'combo_homepage' in globals():
|
if 'combo_homepage' in globals():
|
||||||
|
@ -2879,7 +2709,7 @@ def settgins_gui_timer():
|
||||||
break
|
break
|
||||||
|
|
||||||
def clean_extension_status():
|
def clean_extension_status():
|
||||||
Root_Dir = get_app_root()
|
Root_Dir = util.get_app_root()
|
||||||
webdriver_path = os.path.join(Root_Dir, "webdriver")
|
webdriver_path = os.path.join(Root_Dir, "webdriver")
|
||||||
target_path = os.path.join(webdriver_path, CONST_MAXBOT_EXTENSION_NAME)
|
target_path = os.path.join(webdriver_path, CONST_MAXBOT_EXTENSION_NAME)
|
||||||
target_path = os.path.join(target_path, "data")
|
target_path = os.path.join(target_path, "data")
|
||||||
|
@ -2892,7 +2722,7 @@ def clean_extension_status():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def sync_status_to_extension(status):
|
def sync_status_to_extension(status):
|
||||||
Root_Dir = get_app_root()
|
Root_Dir = util.get_app_root()
|
||||||
webdriver_path = os.path.join(Root_Dir, "webdriver")
|
webdriver_path = os.path.join(Root_Dir, "webdriver")
|
||||||
target_path = os.path.join(webdriver_path, CONST_MAXBOT_EXTENSION_NAME)
|
target_path = os.path.join(webdriver_path, CONST_MAXBOT_EXTENSION_NAME)
|
||||||
target_path = os.path.join(target_path, "data")
|
target_path = os.path.join(target_path, "data")
|
||||||
|
@ -3286,17 +3116,10 @@ def main_gui():
|
||||||
os.remove(icon_filepath)
|
os.remove(icon_filepath)
|
||||||
|
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
print("exit settings")
|
#print("exit settings")
|
||||||
GLOBAL_SERVER_SHUTDOWN=True
|
GLOBAL_SERVER_SHUTDOWN=True
|
||||||
clean_extension_status()
|
clean_extension_status()
|
||||||
|
|
||||||
def force_remove_file(filepath):
|
|
||||||
if os.path.exists(filepath):
|
|
||||||
try:
|
|
||||||
os.remove(filepath)
|
|
||||||
except Exception as exc:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def clean_tmp_file():
|
def clean_tmp_file():
|
||||||
remove_file_list = [CONST_MAXBOT_LAST_URL_FILE
|
remove_file_list = [CONST_MAXBOT_LAST_URL_FILE
|
||||||
,CONST_MAXBOT_INT28_FILE
|
,CONST_MAXBOT_INT28_FILE
|
||||||
|
@ -3304,10 +3127,10 @@ def clean_tmp_file():
|
||||||
,CONST_MAXBOT_QUESTION_FILE
|
,CONST_MAXBOT_QUESTION_FILE
|
||||||
]
|
]
|
||||||
for filepath in remove_file_list:
|
for filepath in remove_file_list:
|
||||||
force_remove_file(filepath)
|
util.force_remove_file(filepath)
|
||||||
|
|
||||||
def btn_copy_ip_clicked():
|
def btn_copy_ip_clicked():
|
||||||
local_ip = get_ip_address()
|
local_ip = util.get_ip_address()
|
||||||
ip_address = "http://%s:%d/" % (local_ip,CONST_SERVER_PORT)
|
ip_address = "http://%s:%d/" % (local_ip,CONST_SERVER_PORT)
|
||||||
pyperclip.copy(ip_address)
|
pyperclip.copy(ip_address)
|
||||||
|
|
||||||
|
@ -3424,26 +3247,9 @@ async def main_server():
|
||||||
print("server running on port:", CONST_SERVER_PORT)
|
print("server running on port:", CONST_SERVER_PORT)
|
||||||
await asyncio.Event().wait()
|
await asyncio.Event().wait()
|
||||||
|
|
||||||
def is_connectable(port: int, host: Optional[str] = "localhost") -> bool:
|
|
||||||
"""Tries to connect to the server at port to see if it is running.
|
|
||||||
|
|
||||||
:Args:
|
|
||||||
- port - The port to connect.
|
|
||||||
"""
|
|
||||||
socket_ = None
|
|
||||||
_is_connectable_exceptions = (socket.error, ConnectionResetError)
|
|
||||||
try:
|
|
||||||
socket_ = socket.create_connection((host, port), 1)
|
|
||||||
result = True
|
|
||||||
except _is_connectable_exceptions:
|
|
||||||
result = False
|
|
||||||
finally:
|
|
||||||
if socket_:
|
|
||||||
socket_.close()
|
|
||||||
return result
|
|
||||||
|
|
||||||
def web_server():
|
def web_server():
|
||||||
is_port_binded = is_connectable(CONST_SERVER_PORT)
|
is_port_binded = util.is_connectable(CONST_SERVER_PORT)
|
||||||
#print("is_port_binded:", is_port_binded)
|
#print("is_port_binded:", is_port_binded)
|
||||||
if not is_port_binded:
|
if not is_port_binded:
|
||||||
asyncio.run(main_server())
|
asyncio.run(main_server())
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_sound": {"ticket": true, "order": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "facebook_password_plaintext": "", "kktix_password_plaintext": "", "fami_password_plaintext": "", "urbtix_password_plaintext": "", "cityline_password_plaintext": "", "hkticketing_password_plaintext": "", "kham_password_plaintext": "", "ticket_password_plaintext": "", "udn_password_plaintext": "", "ticketplus_password_plaintext": "", "chrome_extension": true, "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.05, "reset_browser_interval": 0.0, "max_dwell_time": 60, "proxy_server_port": "", "window_size": "512,1024", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}, "domain_filter": ["*google-analytics.com/*", "*googletagmanager.com/*", "*googletagservices.com/*", "*lndata.com/*", "*a.amnet.tw/*", "*adx.c.appier.net/*", "*clarity.ms/*", "*cloudfront.com/*", "*cms.analytics.yahoo.com/*", "*doubleclick.net/*", "*e2elog.fetnet.net/*", "*fundingchoicesmessages.google.com/*", "*ghtinc.com/*", "*match.adsrvr.org/*", "*onead.onevision.com.tw/*", "*popin.cc/*", "*rollbar.com/*", "*sb.scorecardresearch.com/*", "*tagtoo.co/*", "*.ssp.hinet.net/*", "*ticketmaster.sg/js/adblock*", "*.googlesyndication.com/*", "*treasuredata.com/*", "*play.google.com/log?*", "*www.youtube.com/youtubei/v1/player/heartbeat*", "*tixcraft.com/js/analytics.js*", "*ticketmaster.sg/js/adblock.js*", "*img.uniicreative.com/*", "*cdn.cookielaw.org/*", "*tixcraft.com/js/custom.js*", "*tixcraft.com/js/common.js*", "*cdnjs.cloudflare.com/ajax/libs/clipboard.js/*"]}
|
{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_sound": {"ticket": true, "order": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "facebook_password_plaintext": "", "kktix_password_plaintext": "", "fami_password_plaintext": "", "urbtix_password_plaintext": "", "cityline_password_plaintext": "", "hkticketing_password_plaintext": "", "kham_password_plaintext": "", "ticket_password_plaintext": "", "udn_password_plaintext": "", "ticketplus_password_plaintext": "", "chrome_extension": true, "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.05, "reset_browser_interval": 0, "max_dwell_time": 60, "proxy_server_port": "", "window_size": "512,1024", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}, "domain_filter": ["*google-analytics.com/*", "*googletagmanager.com/*", "*googletagservices.com/*", "*lndata.com/*", "*a.amnet.tw/*", "*adx.c.appier.net/*", "*clarity.ms/*", "*cloudfront.com/*", "*cms.analytics.yahoo.com/*", "*doubleclick.net/*", "*e2elog.fetnet.net/*", "*fundingchoicesmessages.google.com/*", "*ghtinc.com/*", "*match.adsrvr.org/*", "*onead.onevision.com.tw/*", "*popin.cc/*", "*rollbar.com/*", "*sb.scorecardresearch.com/*", "*tagtoo.co/*", "*.ssp.hinet.net/*", "*ticketmaster.sg/js/adblock*", "*.googlesyndication.com/*", "*treasuredata.com/*", "*play.google.com/log?*", "*www.youtube.com/youtubei/v1/player/heartbeat*", "*tixcraft.com/js/analytics.js*", "*ticketmaster.sg/js/adblock.js*", "*img.uniicreative.com/*", "*cdn.cookielaw.org/*", "*tixcraft.com/js/custom.js*", "*tixcraft.com/js/common.js*", "*cdnjs.cloudflare.com/ajax/libs/clipboard.js/*"]}
|
|
@ -1 +1 @@
|
||||||
{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_sound": {"ticket": true, "order": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "facebook_password_plaintext": "", "kktix_password_plaintext": "", "fami_password_plaintext": "", "urbtix_password_plaintext": "", "cityline_password_plaintext": "", "hkticketing_password_plaintext": "", "kham_password_plaintext": "", "ticket_password_plaintext": "", "udn_password_plaintext": "", "ticketplus_password_plaintext": "", "chrome_extension": true, "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.05, "reset_browser_interval": 0.0, "max_dwell_time": 60, "proxy_server_port": "", "window_size": "512,1024", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}}
|
{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_sound": {"ticket": true, "order": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "facebook_password_plaintext": "", "kktix_password_plaintext": "", "fami_password_plaintext": "", "urbtix_password_plaintext": "", "cityline_password_plaintext": "", "hkticketing_password_plaintext": "", "kham_password_plaintext": "", "ticket_password_plaintext": "", "udn_password_plaintext": "", "ticketplus_password_plaintext": "", "chrome_extension": true, "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.05, "reset_browser_interval": 0, "max_dwell_time": 60, "proxy_server_port": "", "window_size": "512,1024", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}}
|
Loading…
Reference in New Issue