2024-03-20, move some function to util. (this version is not stable!)

master
Your Name 2024-04-03 12:05:10 +08:00
parent 13a6297149
commit faec30f561
9 changed files with 1783 additions and 1989 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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)

View File

@ -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)

View File

@ -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:

View File

@ -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",

View File

@ -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())

1487
util.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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/*"]}

View File

@ -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": ""}}