2024-03-14 07:46:26 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#encoding=utf-8
|
2024-03-15 07:55:38 +00:00
|
|
|
# if you want to run on command mode to monitor kktix status, try:
|
|
|
|
# python kktix_status.py --silent true
|
2024-03-14 07:46:26 +00:00
|
|
|
try:
|
|
|
|
# for Python2
|
|
|
|
import tkMessageBox as messagebox
|
|
|
|
import ttk
|
|
|
|
from Tkinter import *
|
|
|
|
except ImportError:
|
|
|
|
# for Python3
|
2024-03-15 08:05:56 +00:00
|
|
|
try:
|
|
|
|
from tkinter import *
|
2024-03-17 07:02:25 +00:00
|
|
|
from tkinter import filedialog, messagebox, ttk
|
2024-03-15 08:05:56 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
import argparse
|
2024-03-14 07:46:26 +00:00
|
|
|
import base64
|
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import platform
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import threading
|
|
|
|
import time
|
2024-03-17 07:02:25 +00:00
|
|
|
import webbrowser
|
2024-03-14 07:46:26 +00:00
|
|
|
from datetime import datetime
|
|
|
|
|
2024-03-17 07:02:25 +00:00
|
|
|
import requests
|
|
|
|
|
2024-04-02 04:15:12 +00:00
|
|
|
CONST_APP_VERSION = "MaxBot (2024.03.19)"
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
2024-03-15 07:55:38 +00:00
|
|
|
CONST_MAXBOT_KKTIX_CONFIG_FILE = "kktix.json"
|
|
|
|
CONST_MAXBOT_KKTIX_LOG_FILE = "kktix.log"
|
2024-03-14 07:46:26 +00:00
|
|
|
CONST_CAPTCHA_SOUND_FILENAME_DEFAULT = "ding-dong.wav"
|
|
|
|
|
|
|
|
translate={}
|
|
|
|
|
|
|
|
URL_DONATE = 'https://max-everyday.com/about/#donate'
|
|
|
|
URL_HELP = 'https://max-everyday.com/2018/08/max-auto-reg-bot/'
|
|
|
|
URL_RELEASE = 'https://github.com/max32002/joint_bot/releases'
|
|
|
|
URL_FB = 'https://www.facebook.com/maxbot.ticket'
|
|
|
|
URL_CHROME_DRIVER = 'https://chromedriver.chromium.org/'
|
|
|
|
URL_FIREFOX_DRIVER = 'https://github.com/mozilla/geckodriver/releases'
|
|
|
|
URL_EDGE_DRIVER = 'https://developer.microsoft.com/zh-tw/microsoft-edge/tools/webdriver/'
|
|
|
|
|
2024-03-27 02:12:52 +00:00
|
|
|
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"
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
def load_translate():
|
|
|
|
translate = {}
|
|
|
|
en_us={}
|
|
|
|
|
|
|
|
zh_tw={}
|
|
|
|
zh_tw["language"] = '語言'
|
|
|
|
zh_tw["enable"] = '啟用'
|
|
|
|
|
|
|
|
zh_tw["config_list"] = '設定檔管理'
|
|
|
|
zh_tw["advanced"] = '進階設定'
|
|
|
|
zh_tw["autofill"] = '自動填表單'
|
|
|
|
zh_tw["about"] = '關於'
|
|
|
|
|
|
|
|
zh_tw["url"] = '活動網址'
|
|
|
|
zh_tw["check_interval"] = '檢查間隔(秒)'
|
2024-03-15 04:06:18 +00:00
|
|
|
|
|
|
|
zh_tw["status_in_stock"] = "當狀態為 IN_STOCK"
|
|
|
|
zh_tw["play_ticket_sound"] = '有票時播放音效'
|
2024-03-14 07:46:26 +00:00
|
|
|
zh_tw["play_sound_filename"] = '音效檔'
|
2024-03-15 04:06:18 +00:00
|
|
|
zh_tw["ticket_exec_maxbot"] = '有票時執行MaxBot'
|
|
|
|
zh_tw["maxbot_config"] = 'MaxBot 設定檔'
|
|
|
|
zh_tw["ticket_exec_command"] = '有票時執行指令'
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
zh_tw["log"] = '事件記錄'
|
|
|
|
zh_tw["last_status"] = '上一個狀態'
|
|
|
|
|
|
|
|
zh_tw["browse"] = '瀏覽...'
|
|
|
|
zh_tw["save"] = '存檔'
|
|
|
|
zh_tw["exit"] = '關閉'
|
|
|
|
zh_tw["copy"] = '複製'
|
|
|
|
zh_tw["restore_defaults"] = '恢復預設值'
|
|
|
|
zh_tw["done"] = '完成'
|
|
|
|
|
|
|
|
zh_tw["maxbot_slogan"] = 'MaxRegBot是一個免費、開放原始碼的搶票機器人。\n祝您掛號成功。'
|
|
|
|
zh_tw["donate"] = '打賞'
|
|
|
|
zh_tw["release"] = '所有可用版本'
|
|
|
|
zh_tw["help"] = '使用教學'
|
|
|
|
|
|
|
|
zh_cn={}
|
|
|
|
|
|
|
|
ja_jp={}
|
|
|
|
|
|
|
|
translate['en_us']=en_us
|
|
|
|
translate['zh_tw']=zh_tw
|
|
|
|
translate['zh_cn']=zh_cn
|
|
|
|
translate['ja_jp']=ja_jp
|
|
|
|
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
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
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
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
def get_app_root():
|
2024-03-29 09:29:39 +00:00
|
|
|
app_root = ""
|
2024-03-14 07:46:26 +00:00
|
|
|
if hasattr(sys, 'frozen'):
|
|
|
|
basis = sys.executable
|
2024-03-29 09:29:39 +00:00
|
|
|
app_root = os.path.dirname(basis)
|
2024-03-14 07:46:26 +00:00
|
|
|
else:
|
2024-03-29 09:29:39 +00:00
|
|
|
app_root = os.getcwd()
|
2024-03-14 07:46:26 +00:00
|
|
|
return app_root
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
def load_json():
|
|
|
|
app_root = get_app_root()
|
2024-03-15 07:55:38 +00:00
|
|
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
2024-03-15 04:06:18 +00:00
|
|
|
|
|
|
|
config_dict = None
|
|
|
|
if os.path.isfile(config_filepath):
|
|
|
|
with open(config_filepath) as json_data:
|
|
|
|
config_dict = json.load(json_data)
|
|
|
|
else:
|
|
|
|
config_dict = get_default_config()
|
|
|
|
return config_filepath, config_dict
|
|
|
|
|
|
|
|
def btn_restore_defaults_clicked(language_code):
|
|
|
|
app_root = get_app_root()
|
2024-03-15 07:55:38 +00:00
|
|
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
2024-03-15 04:06:18 +00:00
|
|
|
if os.path.exists(str(config_filepath)):
|
|
|
|
try:
|
|
|
|
os.unlink(str(config_filepath))
|
|
|
|
except Exception as exc:
|
|
|
|
print(exc)
|
|
|
|
pass
|
|
|
|
|
|
|
|
config_dict = get_default_config()
|
|
|
|
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
|
|
|
|
|
|
|
global root
|
|
|
|
load_GUI(root, config_dict)
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
def btn_preview_sound_clicked():
|
|
|
|
global txt_play_sound_filename
|
|
|
|
new_sound_filename = txt_play_sound_filename.get().strip()
|
|
|
|
#print("new_sound_filename:", new_sound_filename)
|
|
|
|
app_root = get_app_root()
|
|
|
|
new_sound_filename = os.path.join(app_root, new_sound_filename)
|
|
|
|
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
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
def btn_save_clicked():
|
|
|
|
btn_save_act()
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def get_config_dict_from_ui():
|
2024-03-15 04:06:18 +00:00
|
|
|
app_root = get_app_root()
|
2024-03-15 07:55:38 +00:00
|
|
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
2024-03-15 04:06:18 +00:00
|
|
|
|
|
|
|
config_dict = get_default_config()
|
|
|
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
|
|
|
|
|
|
|
is_all_data_correct = True
|
|
|
|
|
|
|
|
#global combo_language
|
|
|
|
if is_all_data_correct:
|
|
|
|
#config_dict["advanced"]["language"] = combo_language.get().strip()
|
|
|
|
# display as new language.
|
|
|
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
|
|
|
|
|
|
|
global txt_file_name
|
|
|
|
filelist = []
|
|
|
|
for i in range(1):
|
|
|
|
filelist.append(txt_file_name[i].get().strip())
|
|
|
|
|
|
|
|
if is_all_data_correct:
|
|
|
|
config_dict["list"]=filelist
|
|
|
|
|
|
|
|
global txt_url
|
|
|
|
global combo_check_interval
|
|
|
|
|
|
|
|
global chk_state_play_ticket_sound
|
|
|
|
global txt_play_sound_filename
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_maxbot
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_command
|
|
|
|
global txt_new_process
|
|
|
|
|
|
|
|
if is_all_data_correct:
|
2024-03-15 07:55:38 +00:00
|
|
|
try:
|
|
|
|
config_dict["url"] = txt_url.get().strip()
|
|
|
|
config_dict["check_interval"] = int(combo_check_interval.get().strip())
|
|
|
|
|
|
|
|
config_dict["advanced"]["play_sound"]["ticket"] = bool(chk_state_play_ticket_sound.get())
|
|
|
|
config_dict["advanced"]["play_sound"]["filename"] = txt_play_sound_filename.get().strip()
|
|
|
|
|
|
|
|
config_dict["ticket_exec_maxbot"] = bool(chk_state_ticket_exec_maxbot.get())
|
|
|
|
|
|
|
|
config_dict["ticket_exec_command"] = bool(chk_state_ticket_exec_command.get())
|
|
|
|
config_dict["new_process"] = txt_new_process.get().strip()
|
|
|
|
except Exception as e:
|
|
|
|
raise e
|
2024-03-15 04:06:18 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
return is_all_data_correct, config_dict
|
|
|
|
|
|
|
|
def btn_save_act(slience_mode=True):
|
|
|
|
is_all_data_correct, config_dict = get_config_dict_from_ui()
|
|
|
|
|
|
|
|
# slience
|
|
|
|
app_root = get_app_root()
|
|
|
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_CONFIG_FILE)
|
|
|
|
save_json(config_dict, config_filepath)
|
|
|
|
|
|
|
|
if not slience_mode:
|
|
|
|
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
2024-03-15 04:06:18 +00:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
def open_url(url):
|
|
|
|
webbrowser.open_new(url)
|
|
|
|
|
|
|
|
def btn_exit_clicked():
|
|
|
|
root.destroy()
|
|
|
|
|
|
|
|
def btn_donate_clicked():
|
|
|
|
open_url.open(URL_DONATE)
|
|
|
|
|
|
|
|
def btn_help_clicked():
|
|
|
|
open_url.open(URL_HELP)
|
|
|
|
|
|
|
|
def callbackLanguageOnChange(event):
|
|
|
|
applyNewLanguage()
|
|
|
|
|
|
|
|
def get_language_code_by_name(new_language):
|
|
|
|
language_code = "en_us"
|
|
|
|
if u'繁體中文' in new_language:
|
|
|
|
language_code = 'zh_tw'
|
|
|
|
if u'簡体中文' in new_language:
|
|
|
|
language_code = 'zh_cn'
|
|
|
|
if u'日本語' in new_language:
|
|
|
|
language_code = 'ja_jp'
|
|
|
|
#print("new language code:", language_code)
|
|
|
|
|
|
|
|
return language_code
|
|
|
|
|
|
|
|
def applyNewLanguage():
|
|
|
|
global combo_language
|
|
|
|
new_language = combo_language.get().strip()
|
|
|
|
#print("new language value:", new_language)
|
|
|
|
|
|
|
|
language_code=get_language_code_by_name(new_language)
|
|
|
|
|
|
|
|
global lbl_language
|
|
|
|
|
|
|
|
lbl_language.config(text=translate[language_code]["language"])
|
|
|
|
|
|
|
|
global tabControl
|
|
|
|
|
|
|
|
tabControl.tab(0, text=translate[language_code]["config_list"])
|
|
|
|
tabControl.tab(1, text=translate[language_code]["advanced"])
|
|
|
|
tabControl.tab(2, text=translate[language_code]["about"])
|
|
|
|
|
|
|
|
global lbl_slogan
|
|
|
|
global lbl_help
|
|
|
|
global lbl_donate
|
|
|
|
global lbl_release
|
|
|
|
|
|
|
|
lbl_slogan.config(text=translate[language_code]["maxbot_slogan"])
|
|
|
|
lbl_help.config(text=translate[language_code]["help"])
|
|
|
|
lbl_donate.config(text=translate[language_code]["donate"])
|
|
|
|
lbl_release.config(text=translate[language_code]["release"])
|
|
|
|
|
|
|
|
global btn_browse
|
|
|
|
for i in range(1):
|
|
|
|
btn_browse[i].config(text=translate[language_code]['browse'] + " " + str(i+1))
|
|
|
|
|
|
|
|
|
|
|
|
# PS: nothing need to do, at current process.
|
|
|
|
def callbackHomepageOnChange(event):
|
|
|
|
showHideBlocks()
|
|
|
|
|
|
|
|
def showHideBlocks(all_layout_visible=False):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def btn_items_browse_event(event):
|
|
|
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
#btn_index = int(str(event.widget['text']).split(" ")[1])
|
|
|
|
btn_index = 1
|
|
|
|
global txt_file_name_value
|
|
|
|
file_path = filedialog.askopenfilename(initialdir=working_dir, defaultextension=".json",filetypes=[("json Documents","*.json"),("All Files","*.*")])
|
|
|
|
if not file_path is None:
|
|
|
|
display_path = file_path
|
|
|
|
if len(file_path) > len(working_dir):
|
|
|
|
if file_path[:len(working_dir)]==working_dir:
|
|
|
|
display_path = file_path[len(working_dir)+1:]
|
|
|
|
#print("json file path:", file_path)
|
|
|
|
txt_file_name_value[btn_index-1].set(display_path)
|
|
|
|
#print("new json file path:", txt_file_name[btn_index-1].get().strip())
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
def btn_new_process_browse_event(event):
|
|
|
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
global txt_new_process_value
|
|
|
|
file_path = filedialog.askopenfilename(initialdir=working_dir, filetypes=[("All Files","*.*")])
|
|
|
|
if not file_path is None:
|
|
|
|
display_path = file_path
|
|
|
|
if len(file_path) > len(working_dir):
|
|
|
|
if file_path[:len(working_dir)]==working_dir:
|
|
|
|
display_path = file_path[len(working_dir)+1:]
|
|
|
|
print(display_path)
|
|
|
|
txt_new_process_value.set(display_path)
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
def btn_items_run_event(event):
|
|
|
|
#btn_index = int(str(event.widget['text']).split(" ")[1])
|
|
|
|
btn_index = 1
|
|
|
|
global txt_file_name
|
|
|
|
filename=txt_file_name[btn_index-1].get().strip()
|
|
|
|
threading.Thread(target=launch_maxbot, args=(filename,)).start()
|
|
|
|
|
2024-03-29 09:29:39 +00:00
|
|
|
def launch_maxbot(filename, homepage="", kktix_account = "", kktix_password=""):
|
|
|
|
cmd_argument = []
|
|
|
|
if len(filename) > 0:
|
|
|
|
cmd_argument.append('--input=' + filename)
|
|
|
|
if len(homepage) > 0:
|
|
|
|
cmd_argument.append('--homepage=' + homepage)
|
|
|
|
if len(kktix_account) > 0:
|
|
|
|
cmd_argument.append('--kktix_account=' + kktix_account)
|
|
|
|
if len(kktix_password) > 0:
|
|
|
|
cmd_argument.append('--kktix_password=' + kktix_password)
|
|
|
|
|
|
|
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
if hasattr(sys, 'frozen'):
|
|
|
|
print("execute in frozen mode")
|
|
|
|
# check platform here.
|
|
|
|
cmd = './chrome_tixcraft' + ' '.join(cmd_argument)
|
|
|
|
if platform.system() == 'Darwin':
|
|
|
|
print("execute MacOS python script")
|
|
|
|
if platform.system() == 'Linux':
|
|
|
|
print("execute linux binary")
|
|
|
|
if platform.system() == 'Windows':
|
|
|
|
print("execute .exe binary.")
|
|
|
|
cmd = 'chrome_tixcraft.exe ' + ' '.join(cmd_argument)
|
|
|
|
subprocess.Popen(cmd, shell=True, cwd=working_dir)
|
|
|
|
else:
|
|
|
|
interpreter_binary = 'python'
|
|
|
|
interpreter_binary_alt = 'python3'
|
|
|
|
if platform.system() != 'Windows':
|
|
|
|
interpreter_binary = 'python3'
|
|
|
|
interpreter_binary_alt = 'python'
|
|
|
|
print("execute in shell mode.")
|
|
|
|
|
|
|
|
script_name = "chrome_tixcraft"
|
|
|
|
try:
|
|
|
|
print('try', interpreter_binary)
|
|
|
|
cmd_array = [interpreter_binary, script_name + '.py'] + cmd_argument
|
|
|
|
s=subprocess.Popen(cmd_array, cwd=working_dir)
|
|
|
|
except Exception as exc:
|
|
|
|
print('try', interpreter_binary_alt)
|
2024-03-14 07:46:26 +00:00
|
|
|
try:
|
2024-03-29 09:29:39 +00:00
|
|
|
cmd_array = [interpreter_binary_alt, script_name + '.py'] + cmd_argument
|
|
|
|
s=subprocess.Popen(cmd_array, cwd=working_dir)
|
2024-03-14 07:46:26 +00:00
|
|
|
except Exception as exc:
|
2024-03-29 09:29:39 +00:00
|
|
|
msg=str(exc)
|
|
|
|
print("exeption:", msg)
|
|
|
|
pass
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
|
|
|
|
def ConfigListTab(root, config_dict, language_code, UI_PADDING_X):
|
|
|
|
# output to GUI.
|
|
|
|
row_count = 0
|
|
|
|
|
|
|
|
frame_group_header = Frame(root)
|
|
|
|
group_row_count = 0
|
|
|
|
|
|
|
|
global lbl_file_name
|
|
|
|
global txt_file_name
|
|
|
|
global txt_file_name_value
|
|
|
|
global btn_browse
|
|
|
|
global btn_run
|
|
|
|
lbl_file_name = {}
|
|
|
|
txt_file_name = {}
|
|
|
|
txt_file_name_value = {}
|
|
|
|
btn_browse = {}
|
|
|
|
btn_run = {}
|
|
|
|
|
|
|
|
#print("config_dict[list]:",config_dict["list"])
|
|
|
|
#print("config_dict[list]:",len(config_dict["list"]))
|
|
|
|
|
|
|
|
# assign default value.
|
|
|
|
play_sound_filename = config_dict["advanced"]["play_sound"]["filename"].strip()
|
|
|
|
if play_sound_filename is None:
|
|
|
|
play_sound_filename = ""
|
|
|
|
if len(play_sound_filename)==0:
|
|
|
|
play_sound_filename = play_sound_filename_default
|
|
|
|
|
|
|
|
global lbl_url
|
|
|
|
lbl_url = Label(frame_group_header, text=translate[language_code]['url'])
|
|
|
|
lbl_url.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global txt_url
|
|
|
|
txt_url_value = StringVar(frame_group_header, value=config_dict["url"])
|
|
|
|
txt_url = Entry(frame_group_header, width=30, textvariable = txt_url_value)
|
|
|
|
txt_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_check_interval
|
|
|
|
lbl_check_interval = Label(frame_group_header, text=translate[language_code]['check_interval'])
|
|
|
|
lbl_check_interval.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
global combo_check_interval
|
2024-03-15 07:55:38 +00:00
|
|
|
combo_check_interval = ttk.Combobox(frame_group_header, width=30)
|
|
|
|
combo_check_interval['values']= ("1","3","8","15","30","60","180","300","600","3600")
|
2024-03-15 04:06:18 +00:00
|
|
|
combo_check_interval.set(str(config_dict["check_interval"]))
|
|
|
|
combo_check_interval.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_status_IN_STOCK_hr
|
|
|
|
lbl_status_IN_STOCK_hr = Label(frame_group_header, text="")
|
|
|
|
lbl_status_IN_STOCK_hr.grid(column=0, row=group_row_count, sticky = E)
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_status_IN_STOCK
|
2024-03-15 04:06:18 +00:00
|
|
|
lbl_status_IN_STOCK = Label(frame_group_header, text=translate[language_code]['status_in_stock'])
|
2024-03-14 07:46:26 +00:00
|
|
|
lbl_status_IN_STOCK.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
global lbl_play_ticket_sound
|
|
|
|
lbl_play_ticket_sound = Label(frame_group_header, text=translate[language_code]['play_ticket_sound'])
|
|
|
|
lbl_play_ticket_sound.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global chk_state_play_ticket_sound
|
|
|
|
chk_state_play_ticket_sound = BooleanVar()
|
|
|
|
chk_state_play_ticket_sound.set(config_dict["advanced"]["play_sound"]["ticket"])
|
|
|
|
|
|
|
|
global chk_play_ticket_sound
|
|
|
|
chk_play_ticket_sound = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_play_ticket_sound)
|
|
|
|
chk_play_ticket_sound.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
global lbl_play_sound_filename
|
|
|
|
lbl_play_sound_filename = Label(frame_group_header, text=translate[language_code]['play_sound_filename'])
|
|
|
|
lbl_play_sound_filename.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global txt_play_sound_filename
|
|
|
|
txt_play_sound_filename_value = StringVar(frame_group_header, value=play_sound_filename)
|
|
|
|
txt_play_sound_filename = Entry(frame_group_header, width=30, textvariable = txt_play_sound_filename_value)
|
|
|
|
txt_play_sound_filename.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
icon_play_filename = "icon_play_1.gif"
|
|
|
|
icon_play_img = PhotoImage(file=icon_play_filename)
|
|
|
|
|
|
|
|
lbl_icon_play = Label(frame_group_header, image=icon_play_img, cursor="hand2")
|
|
|
|
lbl_icon_play.image = icon_play_img
|
|
|
|
lbl_icon_play.grid(column=2, row=group_row_count, sticky = W)
|
|
|
|
lbl_icon_play.bind("<Button-1>", lambda e: btn_preview_sound_clicked())
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_ticket_exec_maxbot
|
|
|
|
lbl_ticket_exec_maxbot = Label(frame_group_header, text=translate[language_code]['ticket_exec_maxbot'])
|
|
|
|
lbl_ticket_exec_maxbot.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_maxbot
|
|
|
|
chk_state_ticket_exec_maxbot = BooleanVar()
|
|
|
|
chk_state_ticket_exec_maxbot.set(config_dict["ticket_exec_maxbot"])
|
|
|
|
|
|
|
|
global chk_ticket_exec_maxbot
|
|
|
|
chk_ticket_exec_maxbot = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_ticket_exec_maxbot)
|
|
|
|
chk_ticket_exec_maxbot.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
for i in range(1):
|
|
|
|
filename = ""
|
|
|
|
if i <= len(config_dict["list"])-1:
|
|
|
|
filename = config_dict["list"][i]
|
2024-03-15 04:06:18 +00:00
|
|
|
lbl_file_name[i] = Label(frame_group_header, text=translate[language_code]['maxbot_config'])
|
2024-03-14 07:46:26 +00:00
|
|
|
lbl_file_name[i].grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
txt_file_name_value[i] = StringVar(frame_group_header, value=filename)
|
|
|
|
txt_file_name[i] = Entry(frame_group_header, width=20, textvariable = txt_file_name_value[i])
|
|
|
|
txt_file_name[i].grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
#btn_browse[i] = ttk.Button(frame_group_header, text=translate[language_code]['browse'] + " " + str(i+1))
|
|
|
|
btn_browse[i] = ttk.Button(frame_group_header, text=translate[language_code]['browse'])
|
|
|
|
btn_browse[i].grid(column=2, row=group_row_count, sticky = W)
|
|
|
|
btn_browse[i].bind('<Button-1>', btn_items_browse_event)
|
|
|
|
|
|
|
|
group_row_count+=1
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
global lbl_ticket_exec_command
|
|
|
|
lbl_ticket_exec_command = Label(frame_group_header, text=translate[language_code]['ticket_exec_command'])
|
|
|
|
lbl_ticket_exec_command.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_command
|
|
|
|
chk_state_ticket_exec_command = BooleanVar()
|
|
|
|
chk_state_ticket_exec_command.set(config_dict["ticket_exec_command"])
|
|
|
|
|
|
|
|
global chk_ticket_exec_command
|
|
|
|
chk_ticket_exec_command = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_ticket_exec_command)
|
|
|
|
chk_ticket_exec_command.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_new_processes
|
|
|
|
lbl_new_processes = Label(frame_group_header, text=translate[language_code]['ticket_exec_command'])
|
|
|
|
lbl_new_processes.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global txt_new_process
|
|
|
|
global txt_new_process_value
|
|
|
|
txt_new_process_value = StringVar(frame_group_header, value=config_dict["new_process"])
|
|
|
|
txt_new_process = Entry(frame_group_header, width=30, textvariable = txt_new_process_value)
|
|
|
|
txt_new_process.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
global btn_new_process_browse
|
|
|
|
btn_new_process_browse = ttk.Button(frame_group_header, text=translate[language_code]['browse'])
|
|
|
|
btn_new_process_browse.grid(column=2, row=group_row_count, sticky = W)
|
|
|
|
btn_new_process_browse.bind('<Button-1>', btn_new_process_browse_event)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_status_log_hr
|
|
|
|
lbl_status_log_hr = Label(frame_group_header, text="")
|
|
|
|
lbl_status_log_hr.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
global lbl_status_log
|
|
|
|
lbl_status_log = Label(frame_group_header, text=translate[language_code]['log'])
|
|
|
|
lbl_status_log.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_last_status
|
|
|
|
lbl_last_status = Label(frame_group_header, text=translate[language_code]['last_status'])
|
|
|
|
lbl_last_status.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global status_variable
|
|
|
|
status_variable = StringVar()
|
|
|
|
status_variable.set("")
|
|
|
|
|
|
|
|
global lbl_last_status_value
|
|
|
|
lbl_last_status_value = Label(frame_group_header, textvariable=status_variable)
|
|
|
|
lbl_last_status_value.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global txt_status_log
|
2024-03-15 04:06:18 +00:00
|
|
|
txt_status_log = Text(frame_group_header, width=40, height=12)
|
2024-03-14 07:46:26 +00:00
|
|
|
txt_status_log.grid(column=1, row=group_row_count, sticky = W, columnspan=2)
|
|
|
|
txt_status_log.insert("1.0", "")
|
|
|
|
|
|
|
|
# add first block to UI.
|
|
|
|
frame_group_header.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
|
|
|
|
|
|
|
|
|
|
|
|
def AboutTab(root, language_code):
|
|
|
|
row_count = 0
|
|
|
|
|
|
|
|
frame_group_header = Frame(root)
|
|
|
|
group_row_count = 0
|
|
|
|
|
|
|
|
logo_filename = "maxbot_logo2_single.ppm"
|
|
|
|
logo_img = PhotoImage(file=logo_filename)
|
|
|
|
|
|
|
|
lbl_logo = Label(frame_group_header, image=logo_img)
|
|
|
|
lbl_logo.image = logo_img
|
|
|
|
lbl_logo.grid(column=0, row=group_row_count, columnspan=2)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
global lbl_slogan
|
|
|
|
global lbl_help
|
|
|
|
global lbl_donate
|
|
|
|
global lbl_release
|
|
|
|
|
|
|
|
lbl_slogan = Label(frame_group_header, text=translate[language_code]['maxbot_slogan'], wraplength=400, justify="center")
|
|
|
|
lbl_slogan.grid(column=0, row=group_row_count, columnspan=2)
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_help = Label(frame_group_header, text=translate[language_code]['help'])
|
|
|
|
lbl_help.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_help_url = Label(frame_group_header, text=URL_HELP, fg="blue", cursor="hand2")
|
|
|
|
lbl_help_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_help_url.bind("<Button-1>", lambda e: open_url(URL_HELP))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_donate = Label(frame_group_header, text=translate[language_code]['donate'])
|
|
|
|
lbl_donate.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_donate_url = Label(frame_group_header, text=URL_DONATE, fg="blue", cursor="hand2")
|
|
|
|
lbl_donate_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_donate_url.bind("<Button-1>", lambda e: open_url(URL_DONATE))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_release = Label(frame_group_header, text=translate[language_code]['release'])
|
|
|
|
lbl_release.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_release_url = Label(frame_group_header, text=URL_RELEASE, fg="blue", cursor="hand2")
|
|
|
|
lbl_release_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_release_url.bind("<Button-1>", lambda e: open_url(URL_RELEASE))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_fb_fans = Label(frame_group_header, text=u'Facebook')
|
|
|
|
lbl_fb_fans.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_fb_fans_url = Label(frame_group_header, text=URL_FB, fg="blue", cursor="hand2")
|
|
|
|
lbl_fb_fans_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_fb_fans_url.bind("<Button-1>", lambda e: open_url(URL_FB))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_chrome_driver = Label(frame_group_header, text=u'Chrome Driver')
|
|
|
|
lbl_chrome_driver.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_chrome_driver_url = Label(frame_group_header, text=URL_CHROME_DRIVER, fg="blue", cursor="hand2")
|
|
|
|
lbl_chrome_driver_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_chrome_driver_url.bind("<Button-1>", lambda e: open_url(URL_CHROME_DRIVER))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_firefox_driver = Label(frame_group_header, text=u'Firefox Driver')
|
|
|
|
lbl_firefox_driver.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_firefox_driver_url = Label(frame_group_header, text=URL_FIREFOX_DRIVER, fg="blue", cursor="hand2")
|
|
|
|
lbl_firefox_driver_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_firefox_driver_url.bind("<Button-1>", lambda e: open_url(URL_FIREFOX_DRIVER))
|
|
|
|
|
|
|
|
group_row_count +=1
|
|
|
|
|
|
|
|
lbl_edge_driver = Label(frame_group_header, text=u'Edge Driver')
|
|
|
|
lbl_edge_driver.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
lbl_edge_driver_url = Label(frame_group_header, text=URL_EDGE_DRIVER, fg="blue", cursor="hand2")
|
|
|
|
lbl_edge_driver_url.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
lbl_edge_driver_url.bind("<Button-1>", lambda e: open_url(URL_EDGE_DRIVER))
|
|
|
|
|
|
|
|
frame_group_header.grid(column=0, row=row_count)
|
|
|
|
|
|
|
|
def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
|
|
|
|
row_count = 0
|
|
|
|
|
|
|
|
frame_group_header = Frame(root)
|
|
|
|
group_row_count = 0
|
|
|
|
|
|
|
|
# for kktix
|
|
|
|
print("==[advanced]==")
|
|
|
|
print(config_dict["advanced"])
|
|
|
|
|
|
|
|
global lbl_language
|
|
|
|
lbl_language = Label(frame_group_header, text=translate[language_code]['language'])
|
|
|
|
lbl_language.grid(column=0, row=group_row_count, sticky = E)
|
|
|
|
|
|
|
|
global combo_language
|
|
|
|
combo_language = ttk.Combobox(frame_group_header, state="readonly")
|
|
|
|
combo_language['values']= ("English","繁體中文","簡体中文","日本語")
|
|
|
|
combo_language.set(config_dict["advanced"]['language'])
|
|
|
|
combo_language.bind("<<ComboboxSelected>>", callbackLanguageOnChange)
|
|
|
|
combo_language.grid(column=1, row=group_row_count, sticky = W)
|
|
|
|
|
|
|
|
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
|
|
|
|
|
|
|
|
|
|
|
|
def get_action_bar(root, language_code):
|
|
|
|
frame_action = Frame(root)
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
#global btn_save
|
2024-03-14 07:46:26 +00:00
|
|
|
global btn_restore_defaults
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
#btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked() )
|
|
|
|
#btn_save.grid(column=1, row=0)
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
|
|
|
|
btn_restore_defaults.grid(column=2, row=0)
|
|
|
|
|
|
|
|
return frame_action
|
|
|
|
|
|
|
|
def clearFrame(frame):
|
|
|
|
# destroy all widgets from frame
|
|
|
|
for widget in frame.winfo_children():
|
|
|
|
widget.destroy()
|
|
|
|
|
|
|
|
def load_GUI(root, config_dict):
|
|
|
|
clearFrame(root)
|
|
|
|
|
|
|
|
language_code="zh_tw"
|
|
|
|
#language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
|
|
|
|
|
|
|
row_count = 0
|
|
|
|
|
|
|
|
global tabControl
|
|
|
|
tabControl = ttk.Notebook(root)
|
|
|
|
tab1 = Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text=translate[language_code]['config_list'])
|
|
|
|
|
|
|
|
#tab2 = Frame(tabControl)
|
|
|
|
#tabControl.add(tab2, text=translate[language_code]['advanced'])
|
|
|
|
|
|
|
|
tab3 = Frame(tabControl)
|
|
|
|
tabControl.add(tab3, text=translate[language_code]['about'])
|
|
|
|
tabControl.grid(column=0, row=row_count)
|
|
|
|
|
|
|
|
tabControl.select(tab1)
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
row_count+=1
|
|
|
|
frame_action = get_action_bar(root, language_code)
|
|
|
|
frame_action.grid(column=0, row=row_count)
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
global UI_PADDING_X
|
|
|
|
ConfigListTab(tab1, config_dict, language_code, UI_PADDING_X)
|
|
|
|
#AdvancedTab(tab2, config_dict, language_code, UI_PADDING_X)
|
|
|
|
AboutTab(tab3, language_code)
|
|
|
|
|
|
|
|
def get_default_config():
|
|
|
|
config_dict={}
|
|
|
|
|
|
|
|
config_dict["list"] = [CONST_MAXBOT_CONFIG_FILE]
|
2024-03-15 07:55:38 +00:00
|
|
|
config_dict["check_interval"]=3
|
2024-03-14 07:46:26 +00:00
|
|
|
config_dict["url"]=""
|
|
|
|
|
|
|
|
config_dict["advanced"] = {}
|
|
|
|
config_dict["advanced"]["language"] = "繁體中文"
|
|
|
|
|
|
|
|
config_dict["advanced"]["play_sound"] = {}
|
2024-03-15 04:06:18 +00:00
|
|
|
config_dict["advanced"]["play_sound"]["ticket"] = True
|
2024-03-14 07:46:26 +00:00
|
|
|
config_dict["advanced"]["play_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
config_dict["ticket_exec_maxbot"] = True
|
|
|
|
config_dict["ticket_exec_command"] = True
|
|
|
|
config_dict["new_process"] = ""
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
return config_dict
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def main_gui():
|
2024-03-14 07:46:26 +00:00
|
|
|
global translate
|
|
|
|
# only need to load translate once.
|
|
|
|
translate = load_translate()
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
global config_filepath
|
|
|
|
global config_dict
|
|
|
|
# only need to load json file once.
|
|
|
|
config_filepath, config_dict = load_json()
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
global root
|
|
|
|
root = Tk()
|
|
|
|
root.title(CONST_APP_VERSION)
|
|
|
|
|
|
|
|
global UI_PADDING_X
|
|
|
|
UI_PADDING_X = 15
|
|
|
|
|
|
|
|
load_GUI(root, config_dict)
|
|
|
|
|
|
|
|
GUI_SIZE_WIDTH = 580
|
2024-03-15 04:06:18 +00:00
|
|
|
GUI_SIZE_HEIGHT = 600
|
2024-03-14 07:46:26 +00:00
|
|
|
|
|
|
|
GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT)
|
|
|
|
GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-55)
|
|
|
|
|
|
|
|
GUI_SIZE =GUI_SIZE_MACOS
|
|
|
|
|
|
|
|
if platform.system() == 'Windows':
|
|
|
|
GUI_SIZE = GUI_SIZE_WINDOWS
|
|
|
|
|
|
|
|
root.geometry(GUI_SIZE)
|
|
|
|
|
|
|
|
# for icon.
|
|
|
|
icon_filepath = 'tmp.ico'
|
|
|
|
|
|
|
|
# icon format.
|
|
|
|
iconImg = 'AAABAAEAAAAAAAEAIAD4MgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAAAFzUkdCAK7OHOkAAABQZVhJZk1NACoAAAAIAAIBEgADAAAAAQABAACHaQAEAAAAAQAAACYAAAAAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAQCgAwAEAAAAAQAAAQAAAAAAdTc0VwAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAMPFJREFUeAHtndmTJNd13rP36e7pWXt6OFiHGAxACssApChTskRZom1J3ETS9ov/AIclO/Tm8JMj/OxQBMNhO0IRdvjNtB0SSYirTFEiJZoSTBAidoAAZjCYAYazb73M9O7vdzKzOqu6qmvLyr5VeW5MT3VXVea997s3v3vOueecO/SlmYnNyIsj4AiUEoHhUvbaO+0IOAKGgBOATwRHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECDgBlHjwveuOgBOAzwFHoMQIOAGUePC9646AE4DPAUegxAg4AZR48L3rjoATgM8BR6DECIzuWt83N3et6oGpeGioflf6FFtmhPWoUb/q9zafd4VZpf587ljIXSpt7hCz4glADR0ZH49GJiai4dHRaGh4JErbbvOW/2wweAVD+68QMPupks2NzWhlfj7a3FivavbQ8HA0PjMjXPtRuBuK1u7eidbu3KnqUxF/jAmzkbFxVdVv820o2lhbjVYWFuy5aRer4glALYQAJg/PRlNzc9H00Q/o9aj9znt7Dh6MJvbtj8amp6ORPXs0KGPR0MiIloYhWx02Y5aAI+IO2y/tdru/v8/DffPM6eh7f/D70Z1r1wRNLAlsbmxEhz704eiTX/pP0fi+fR1NiN1EhnF+/X99OfrJl/6wMAJjPk3NHok++R//c3TgoRMi1I3dhKDtusHswt/+KPrBv/030cbqStvXF08AAnzl9u1oWT9MYiYvnRgeHYtG90zYgz8+s09EcCianD0cTR2Zi6ZEEtMpSRw5Ek3qs4n9B6KxvXuj0clJkyTa7nmfXzD/3nvRqlg/ffjpDpN37tRT0T2//CuFPUB5w3jw5MlC2765vh7d92ufiD7425+yhSnv/hRxv6uvvhJtSgropBRPALQyWc3TBjMI6/xI/Lt784Zmsj4RUcSrPd/XP6kKqAwj4yKJqSkTcycOHIgmDx2OJkUK00clRSREwd+8z+eQydjUpF1nkkRaaZ+/XnnpBROVs33i96NPfaTQByhvGMen91r7i1qJmUuPfPGf9u3DD/4LF96PNvT8dKL27Q4BNJo1Rgw87fEXkpfKtyGKtaXFaFU/S1cuV5OEvgUAw0gTUjGQDMYlIUzsOxDtOSRpQqRgKsecpAmRxaQki8nZROUQSYxK5RjFLiGVI/SysbYWXX7pRSPICkYizHH14ciTp0Jv/o7tG4MANIZFEADzafaxx6P7fvUTO7Yp9A8Xf37B8Op/AmgF6VR60Cul8gAk1yI1rC8vS5q4G929fl0k8e6WJMH3uR6S0IM+KhsDtgb05T0HUDkSuwTqhtkmpH5IP4RAzC6ByqFrIJis6J1UXdgL/brx5s+q2kC/p4/dEx04caKwdvSiIlZkJL2NFemzyRj3oh67pxaME5/9XRv3ntXR4xtDYgsXL3ZcS1gSQMfdqHMhD3oDkuDbG6uynGqSLd+6FUUXxKB6gPRffCOuRZrQREQqGDWVA5KQNHE4sUuIJEztgCwkXeyRysHnWOBHJ6dsl6MTRq7Tk21v3X73bDQvsS97f1bMQ49+yNqy7YI+egOsi5DCwGvvPfdGJz71mT5CZ3tT15bvRkuXLm1fCbd/te47g0sAdbtb82YTkoBdVxcXoxX9LF1uoHKIJIa1fTQmlQOjZGyXQJpA5ciQhHY80l0Os0tMQxKSJnR9u+Xqa6+aITW7QkJ2GABpSz8XCICdH6i4VrrLs18QwAO/8ZvRwUcezfO2hd9rdWFRO0FXK4tduw1of/a1W0O/fx+SoA96tRf7f+s/JtK6WBgD5p3r16JIq3PFeKmvVascIgmpHBP7k12OZCvUjJcYMc0ukVU5ZJfYIwMmdomkfmrGAIgdIEse2Dzmnnp6q2F9+hsqFoZek8Yyfc61O5L0sA898oV/UoVhrnUUdDMk2OVbN1VbZ3TpBJDXQEEUDUiCKrZUjpuy2r4XaxuJymEkYSrHmHwf0l2OfbE0AUlgwBRB4DOx58DB6MKzz1bq4t6QEEbOQ498iD/7uqBygUEvC3hBlvd8/Fd6WU0h976rRQcnoHTutVupE0C7iHXz/WYksb4WbSzEXl2L6HUiiCppItnlMPFYhsy0bG5uRAdPPCwj4LH0rb59xUN0VKpRzJC96QZG4Id/9wtGsL2pobi7Ll6+ZAbvrITYTu1OAO2gVcR3IQnqaSBNZAmh0hwxAtt/WND7vWDDwIjaq8Lqv//B49EHf+t3elVFofdd1A7AugzanUoA/egwXijA/VAZrtVzcgAahGLbsyKyODQn/x5BoA/+o39sbr/53734O8Y+ANXxIO20wgmgHbQC/C4TGrfp2V94LMDWtd8kDJsmySQ7su3fYYcrhBX+HCc//8WqLdQdrgj+o4Wf/1zqUufNdALoHLswrpRIu+/48Wjm/vvDaE+XrcCTk52SXpQNYfWBX/yYfn6pF7cv/J7rK8vyAejcCYgGOwEUPmz5VogEcOSxJ7S1uD/fG+/S3TDQ4U/RizIi6YLVny3AQShrS0tyib/Ssf4PBk4AfT4TEJnnnmb/v7N94BC7T0BQ3sWMfw+diI5L/x+Usqx8EHdvyN09MRh30i8ngE5QC+Uarf64Hh954slQWpRLO0wCyJvPhBWW/30PPJhLG0O4yfKNG0oKc7srCaCYbUAYSgNAsW0sfk//jt+1//2/xggMDQ1vM1yxqs3ce1+0//gHG1/Yh59YRqM8JRrNNQK6Tmrvf5AK4v+q1IBuJICeEwDbOkTUEYpLIA2ebHGMfhwww+cE
|
|
|
|
if platform.system() == 'Linux':
|
|
|
|
# PNG format.
|
|
|
|
iconImg = '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
|
|
|
|
|
|
|
|
tmpIcon = open(icon_filepath, 'wb+')
|
|
|
|
tmpIcon.write(base64.b64decode(iconImg))
|
|
|
|
tmpIcon.close()
|
|
|
|
if platform.system() == 'Windows':
|
|
|
|
root.iconbitmap(icon_filepath)
|
|
|
|
if platform.system() == 'Darwin':
|
|
|
|
#from PIL import Image, ImageTk
|
|
|
|
#logo = ImageTk.PhotoImage(Image.open(icon_filepath).convert('RGB'))
|
|
|
|
#root.call('wm', 'iconphoto', root._w, logo)
|
|
|
|
pass
|
|
|
|
if platform.system() == 'Linux':
|
|
|
|
logo = PhotoImage(file=icon_filepath)
|
|
|
|
root.call('wm', 'iconphoto', root._w, logo)
|
|
|
|
os.remove(icon_filepath)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
2024-03-17 07:02:25 +00:00
|
|
|
registerStatus = ""
|
2024-03-14 07:46:26 +00:00
|
|
|
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
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def kktix_in_stock_play_sound():
|
2024-03-15 04:06:18 +00:00
|
|
|
global chk_state_play_ticket_sound
|
2024-03-17 07:02:25 +00:00
|
|
|
if 'chk_state_play_ticket_sound' in globals():
|
|
|
|
try:
|
2024-03-15 07:55:38 +00:00
|
|
|
if bool(chk_state_play_ticket_sound.get()):
|
|
|
|
btn_preview_sound_clicked()
|
2024-03-17 07:02:25 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def get_kktix_status_by_url(url):
|
|
|
|
registerStatus = ""
|
2024-03-14 07:46:26 +00:00
|
|
|
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)
|
2024-03-15 07:55:38 +00:00
|
|
|
return registerStatus
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def update_kktix_status(registerStatus):
|
|
|
|
global status_variable
|
2024-03-17 07:02:25 +00:00
|
|
|
if 'status_variable' in globals():
|
|
|
|
try:
|
2024-03-15 07:55:38 +00:00
|
|
|
status_variable.set(registerStatus)
|
2024-03-17 07:02:25 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def append_kktix_status_log(output_log):
|
|
|
|
global txt_status_log
|
2024-03-17 07:02:25 +00:00
|
|
|
if 'txt_status_log' in globals():
|
|
|
|
try:
|
2024-03-15 07:55:38 +00:00
|
|
|
txt_status_log.insert("1.0", output_log + "\n")
|
2024-03-17 07:02:25 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
2024-03-15 07:55:38 +00:00
|
|
|
|
|
|
|
def append_kktix_status_log_file(output_log):
|
|
|
|
app_root = get_app_root()
|
|
|
|
log_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_LOG_FILE)
|
|
|
|
file1 = open(log_filepath, "a") # append mode
|
|
|
|
file1.write(output_log)
|
|
|
|
file1.close()
|
|
|
|
|
|
|
|
def kktix_status_query(config_dict, last_status, log_file=False):
|
|
|
|
url = config_dict["url"]
|
|
|
|
datetime_string = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
|
|
|
registerStatus = ""
|
|
|
|
if len(url) > 0:
|
|
|
|
registerStatus = get_kktix_status_by_url(url)
|
|
|
|
update_kktix_status(registerStatus)
|
|
|
|
|
|
|
|
if len(registerStatus) > 0:
|
|
|
|
output_log = datetime_string + ", " + registerStatus
|
|
|
|
print(output_log)
|
|
|
|
if log_file:
|
|
|
|
append_kktix_status_log_file(output_log + "\n")
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
if registerStatus=="IN_STOCK":
|
|
|
|
# each time to play sound.
|
|
|
|
kktix_in_stock_play_sound()
|
|
|
|
|
|
|
|
if registerStatus != last_status:
|
|
|
|
# run once.
|
|
|
|
append_kktix_status_log(output_log)
|
|
|
|
|
|
|
|
if registerStatus=="IN_STOCK":
|
|
|
|
btn_index = 1
|
2024-03-14 07:46:26 +00:00
|
|
|
try:
|
2024-03-18 04:51:30 +00:00
|
|
|
print(config_dict["ticket_exec_maxbot"])
|
2024-03-15 07:55:38 +00:00
|
|
|
if config_dict["ticket_exec_maxbot"]:
|
2024-03-18 04:51:30 +00:00
|
|
|
filename=config_dict["list"][btn_index-1]
|
|
|
|
print("filename", filename)
|
|
|
|
if len(filename) > 0:
|
|
|
|
threading.Thread(target=launch_maxbot, args=(filename,)).start()
|
2024-03-15 07:55:38 +00:00
|
|
|
|
2024-03-18 04:51:30 +00:00
|
|
|
print(config_dict["ticket_exec_command"], config_dict["new_process"])
|
2024-03-15 07:55:38 +00:00
|
|
|
if config_dict["ticket_exec_command"]:
|
2024-03-18 04:51:30 +00:00
|
|
|
if len(config_dict["new_process"]) > 0:
|
|
|
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
subprocess.Popen(config_dict["new_process"] , shell=True, cwd=working_dir)
|
2024-03-14 07:46:26 +00:00
|
|
|
except Exception as e:
|
2024-03-18 04:51:30 +00:00
|
|
|
print(e)
|
2024-03-14 07:46:26 +00:00
|
|
|
pass
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
return registerStatus
|
2024-03-15 04:06:18 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def collect_ui_config():
|
2024-03-15 04:06:18 +00:00
|
|
|
global combo_check_interval
|
2024-03-15 07:55:38 +00:00
|
|
|
global txt_url
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_maxbot
|
|
|
|
global txt_file_name
|
|
|
|
|
|
|
|
global chk_state_ticket_exec_command
|
|
|
|
global txt_new_process
|
2024-03-15 04:06:18 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
is_ui_ready = True
|
|
|
|
check_interval = 3
|
|
|
|
config_filepath, config_dict = load_json()
|
2024-03-15 04:06:18 +00:00
|
|
|
|
2024-03-17 07:02:25 +00:00
|
|
|
if 'combo_check_interval' in globals():
|
|
|
|
try:
|
2024-03-15 04:06:18 +00:00
|
|
|
check_interval = int(combo_check_interval.get().strip())
|
2024-03-15 07:55:38 +00:00
|
|
|
config_dict["check_interval"] = check_interval
|
2024-03-17 07:02:25 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
is_ui_ready = False
|
2024-03-15 07:55:38 +00:00
|
|
|
|
|
|
|
url = ""
|
|
|
|
filename = ""
|
|
|
|
#print("is_ui_ready:", is_ui_ready)
|
|
|
|
if is_ui_ready:
|
|
|
|
try:
|
|
|
|
if 'txt_url' in globals():
|
|
|
|
url = txt_url.get().strip()
|
|
|
|
config_dict["url"] = url
|
|
|
|
|
|
|
|
if 'chk_state_ticket_exec_maxbot' in globals():
|
|
|
|
config_dict["ticket_exec_maxbot"] = bool(chk_state_ticket_exec_maxbot.get())
|
|
|
|
|
|
|
|
# current only 1 config file.
|
|
|
|
btn_index = 1
|
|
|
|
if 'txt_file_name' in globals():
|
|
|
|
filename=txt_file_name[btn_index-1].get().strip()
|
|
|
|
config_dict["list"] = [filename]
|
|
|
|
|
|
|
|
if 'chk_state_ticket_exec_command' in globals():
|
|
|
|
config_dict["ticket_exec_command"] = bool(chk_state_ticket_exec_command.get())
|
|
|
|
|
|
|
|
if 'txt_new_process' in globals():
|
|
|
|
config_dict["new_process"] = txt_new_process.get().strip()
|
2024-03-15 04:06:18 +00:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
return is_ui_ready, config_dict
|
|
|
|
|
|
|
|
def resetful_api_timer(log_file=False):
|
|
|
|
checkpoint_time = time.time()
|
|
|
|
last_status = ""
|
|
|
|
|
|
|
|
config_filepath, config_dict = load_json()
|
|
|
|
json_str_old = json.dumps(config_dict)
|
|
|
|
|
|
|
|
while True:
|
2024-03-15 04:06:18 +00:00
|
|
|
elapsed_time = time.time() - checkpoint_time
|
2024-03-15 07:55:38 +00:00
|
|
|
is_ui_ready, config_dict = collect_ui_config()
|
|
|
|
#print(is_ui_ready, config_dict)
|
|
|
|
|
|
|
|
if elapsed_time > config_dict["check_interval"]:
|
|
|
|
# main program.
|
|
|
|
last_status = kktix_status_query(config_dict, last_status, log_file=log_file)
|
2024-03-15 04:06:18 +00:00
|
|
|
checkpoint_time = time.time()
|
2024-03-15 07:55:38 +00:00
|
|
|
|
|
|
|
if is_ui_ready:
|
|
|
|
json_str_new = json.dumps(config_dict)
|
|
|
|
if json_str_new != json_str_old:
|
|
|
|
save_json(config_dict, config_filepath)
|
|
|
|
json_str_old = json_str_new
|
|
|
|
|
2024-03-15 04:06:18 +00:00
|
|
|
time.sleep(0.5)
|
2024-03-14 07:46:26 +00:00
|
|
|
|
2024-03-15 07:55:38 +00:00
|
|
|
def main(args):
|
|
|
|
silent_flag = False
|
|
|
|
if not args.silent is None:
|
|
|
|
silent_flag = t_or_f(args.silent)
|
|
|
|
#print("silent_flag:",silent_flag)
|
|
|
|
|
|
|
|
if not silent_flag:
|
|
|
|
threading.Thread(target=resetful_api_timer, daemon=True).start()
|
|
|
|
main_gui()
|
|
|
|
else:
|
|
|
|
resetful_api_timer(log_file=True)
|
|
|
|
|
|
|
|
|
2024-03-14 07:46:26 +00:00
|
|
|
if __name__ == "__main__":
|
2024-03-15 07:55:38 +00:00
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
description="MaxBot Aggument Parser")
|
|
|
|
|
|
|
|
parser.add_argument("--silent",
|
|
|
|
help="command line mode",
|
|
|
|
default='False',
|
|
|
|
type=str)
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
main(args)
|