diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py index b860353..210969f 100644 --- a/chrome_tixcraft.py +++ b/chrome_tixcraft.py @@ -44,7 +44,7 @@ except Exception as exc: print(exc) pass -CONST_APP_VERSION = "MaxBot (2024.04.23)" +CONST_APP_VERSION = "MaxBot (2024.04.24)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -52,6 +52,7 @@ CONST_MAXBOT_EXTENSION_NAME = "Maxbotplus_1.0.0" CONST_MAXBOT_INT28_FILE = "MAXBOT_INT28_IDLE.txt" CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt" CONST_MAXBOT_QUESTION_FILE = "MAXBOT_QUESTION.txt" +CONST_MAXBOT_SENDKEY_FILE = "MAXBOT_SENDKEY.txt" CONST_MAXBLOCK_EXTENSION_NAME = "Maxblockplus_1.0.0" CONST_MAXBLOCK_EXTENSION_FILTER =[ "*.doubleclick.net/*", @@ -10866,6 +10867,54 @@ def check_refresh_datetime_occur(driver, target_time): return is_refresh_datetime_sent +def sendkey_to_browser(driver): + all_command_done = True + + sendkey_dict = None + try: + with open(CONST_MAXBOT_SENDKEY_FILE) as json_data: + sendkey_dict = json.load(json_data) + print(sendkey_dict) + #os.unlink(CONST_MAXBOT_SENDKEY_FILE) + except Exception as e: + print("error on open file") + print(e) + pass + + if sendkey_dict: + if "command" in sendkey_dict: + for cmd_dict in sendkey_dict["command"]: + print("cmd_dict", cmd_dict) + if cmd_dict["type"] == "sendkey": + print("sendkey") + try: + form_input_1 = driver.find_element(By.CSS_SELECTOR, cmd_dict["selector"]) + form_input_1.clear() + form_input_1.click() + form_input_1.send_keys(cmd_dict["text"]) + except Exception as exc: + all_command_done = False + print("error on sendkey") + print(exc) + pass + if cmd_dict["type"] == "click": + print("click") + try: + form_input_1 = driver.find_element(By.CSS_SELECTOR, cmd_dict["selector"]) + form_input_1.click() + except Exception as exc: + all_command_done = False + print("error on click") + print(exc) + pass + time.sleep(0.05) + + if all_command_done: + try: + os.unlink(CONST_MAXBOT_SENDKEY_FILE) + except Exception as e: + pass + def main(args): config_dict = get_config_dict(args) @@ -10948,6 +10997,9 @@ def main(args): time.sleep(0.1) continue + if os.path.exists(CONST_MAXBOT_SENDKEY_FILE): + sendkey_to_browser(driver) + if config_dict["advanced"]["reset_browser_interval"] > 0: maxbot_running_time = time.time() - maxbot_last_reset_time if maxbot_running_time > config_dict["advanced"]["reset_browser_interval"]: diff --git a/config_launcher.py b/config_launcher.py index a62d7ae..3f9ea10 100644 --- a/config_launcher.py +++ b/config_launcher.py @@ -24,7 +24,7 @@ import webbrowser import util -CONST_APP_VERSION = "MaxBot (2024.04.23)" +CONST_APP_VERSION = "MaxBot (2024.04.24)" CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json" CONST_MAXBOT_CONFIG_FILE = "settings.json" diff --git a/nodriver_tixcraft.py b/nodriver_tixcraft.py index 128d669..aa22200 100644 --- a/nodriver_tixcraft.py +++ b/nodriver_tixcraft.py @@ -32,7 +32,7 @@ except Exception as exc: print(exc) pass -CONST_APP_VERSION = "MaxBot (2024.04.23)" +CONST_APP_VERSION = "MaxBot (2024.04.24)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" diff --git a/settings.json b/settings.json index 6bfdcdd..e48f3f2 100644 --- a/settings.json +++ b/settings.json @@ -1,7 +1,7 @@ { "homepage": "about:blank", "browser": "chrome", - "language": "\u7e41\u9ad4\u4e2d\u6587", + "language": "English", "ticket_number": 2, "refresh_datetime": "", "ocr_captcha": { @@ -25,7 +25,7 @@ "kktix": { "auto_press_next_step_button": true, "auto_fill_ticket_number": true, - "max_dwell_time": 60 + "max_dwell_time": 90 }, "cityline": { "cityline_queue_retry": true @@ -78,12 +78,12 @@ "block_facebook_network": false, "headless": false, "verbose": false, - "auto_guess_options": true, + "auto_guess_options": false, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, "auto_reload_overheat_count": 4, - "auto_reload_overheat_cd": 1.0, + "auto_reload_overheat_cd": 1, "reset_browser_interval": 0, "proxy_server_port": "", "window_size": "480,1024", diff --git a/settings.py b/settings.py index 1000bac..3d4b6e0 100644 --- a/settings.py +++ b/settings.py @@ -39,7 +39,7 @@ try: except Exception as exc: pass -CONST_APP_VERSION = "MaxBot (2024.04.23)" +CONST_APP_VERSION = "MaxBot (2024.04.24)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -48,6 +48,7 @@ CONST_MAXBOT_EXTENSION_STATUS_JSON = "status.json" CONST_MAXBOT_INT28_FILE = "MAXBOT_INT28_IDLE.txt" CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt" CONST_MAXBOT_QUESTION_FILE = "MAXBOT_QUESTION.txt" +CONST_MAXBOT_SENDKEY_FILE = "MAXBOT_SENDKEY.txt" CONST_SERVER_PORT = 16888 @@ -127,7 +128,7 @@ def get_default_config(): config_dict['kktix']={} config_dict["kktix"]["auto_press_next_step_button"] = True config_dict["kktix"]["auto_fill_ticket_number"] = True - config_dict["kktix"]["max_dwell_time"] = 60 + config_dict["kktix"]["max_dwell_time"] = 90 config_dict['cityline']={} config_dict["cityline"]["cityline_queue_retry"] = True @@ -185,7 +186,7 @@ def get_default_config(): config_dict["advanced"]["headless"] = False config_dict["advanced"]["verbose"] = False - config_dict["advanced"]["auto_guess_options"] = True + config_dict["advanced"]["auto_guess_options"] = False config_dict["advanced"]["user_guess_string"] = "" # remote_url not under ocr, due to not only support ocr features. @@ -380,6 +381,7 @@ def clean_tmp_file(): ,CONST_MAXBOT_INT28_FILE ,CONST_MAXBOT_ANSWER_ONLINE_FILE ,CONST_MAXBOT_QUESTION_FILE + ,CONST_MAXBOT_SENDKEY_FILE ] for filepath in remove_file_list: util.force_remove_file(filepath) @@ -479,6 +481,34 @@ class SaveJsonHandler(tornado.web.RequestHandler): self.finish() +class SendkeyHandler(tornado.web.RequestHandler): + def post(self): + self.set_header("Access-Control-Allow-Origin", "*") + self.set_header("Access-Control-Allow-Headers", "x-requested-with") + self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') + + _body = None + is_pass_check = True + errorMessage = "" + errorCode = 0 + + if is_pass_check: + is_pass_check = False + try : + _body = json.loads(self.request.body) + is_pass_check = True + except Exception: + errorMessage = "wrong json format" + errorCode = 1001 + pass + + if is_pass_check: + app_root = util.get_app_root() + config_filepath = os.path.join(app_root, CONST_MAXBOT_SENDKEY_FILE) + util.save_json(_body, config_filepath) + + self.write({"return": True}) + class OcrHandler(tornado.web.RequestHandler): def get(self): self.write({"answer": "1234"}) @@ -560,6 +590,7 @@ async def main_server(): app = Application([ ("/version", VersionHandler), ("/shutdown", ShutdownHandler), + ("/sendkey", SendkeyHandler), # status api ("/status", StatusHandler), diff --git a/settings_old.py b/settings_old.py index 4c73d07..d061841 100644 --- a/settings_old.py +++ b/settings_old.py @@ -34,7 +34,7 @@ try: except Exception as exc: pass -CONST_APP_VERSION = "MaxBot (2024.04.23)" +CONST_APP_VERSION = "MaxBot (2024.04.24)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -43,6 +43,7 @@ CONST_MAXBOT_EXTENSION_STATUS_JSON = "status.json" CONST_MAXBOT_INT28_FILE = "MAXBOT_INT28_IDLE.txt" CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt" CONST_MAXBOT_QUESTION_FILE = "MAXBOT_QUESTION.txt" +CONST_MAXBOT_SENDKEY_FILE = "MAXBOT_SENDKEY.txt" CONST_SERVER_PORT = 16888 @@ -618,7 +619,7 @@ def get_default_config(): config_dict['kktix']={} config_dict["kktix"]["auto_press_next_step_button"] = True config_dict["kktix"]["auto_fill_ticket_number"] = True - config_dict["kktix"]["max_dwell_time"] = 60 + config_dict["kktix"]["max_dwell_time"] = 90 config_dict['cityline']={} config_dict["cityline"]["cityline_queue_retry"] = True @@ -676,7 +677,7 @@ def get_default_config(): config_dict["advanced"]["headless"] = False config_dict["advanced"]["verbose"] = False - config_dict["advanced"]["auto_guess_options"] = True + config_dict["advanced"]["auto_guess_options"] = False config_dict["advanced"]["user_guess_string"] = "" config_dict["advanced"]["remote_url"] = "http://127.0.0.1:%d/" % (CONST_SERVER_PORT) @@ -3194,6 +3195,7 @@ def clean_tmp_file(): ,CONST_MAXBOT_INT28_FILE ,CONST_MAXBOT_ANSWER_ONLINE_FILE ,CONST_MAXBOT_QUESTION_FILE + ,CONST_MAXBOT_SENDKEY_FILE ] for filepath in remove_file_list: util.force_remove_file(filepath) @@ -3246,6 +3248,34 @@ class VersionHandler(tornado.web.RequestHandler): def get(self): self.write({"version":self.application.version}) +class SendkeyHandler(tornado.web.RequestHandler): + def post(self): + self.set_header("Access-Control-Allow-Origin", "*") + self.set_header("Access-Control-Allow-Headers", "x-requested-with") + self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') + + _body = None + is_pass_check = True + errorMessage = "" + errorCode = 0 + + if is_pass_check: + is_pass_check = False + try : + _body = json.loads(self.request.body) + is_pass_check = True + except Exception: + errorMessage = "wrong json format" + errorCode = 1001 + pass + + if is_pass_check: + app_root = util.get_app_root() + config_filepath = os.path.join(app_root, CONST_MAXBOT_SENDKEY_FILE) + util.save_json(_body, config_filepath) + + self.write({"return": True}) + class OcrHandler(tornado.web.RequestHandler): def get(self): self.write({"answer": "1234"}) @@ -3305,6 +3335,8 @@ async def main_server(): app = Application([ ("/", MainHandler), ("/version", VersionHandler), + ("/sendkey", SendkeyHandler), + ("/ocr", OcrHandler), ("/query", MainHandler), ("/question", QuestionHandler), diff --git a/webdriver/Maxblockplus_1.0.0/data/settings.json b/webdriver/Maxblockplus_1.0.0/data/settings.json index bfac101..7e25dac 100644 --- a/webdriver/Maxblockplus_1.0.0/data/settings.json +++ b/webdriver/Maxblockplus_1.0.0/data/settings.json @@ -1 +1 @@ -{"homepage": "about:blank", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "refresh_datetime": "", "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, "max_dwell_time": 60}, "cityline": {"cityline_queue_retry": 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": false, "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.1, "auto_reload_overheat_count": 4, "auto_reload_overheat_cd": 1.0, "reset_browser_interval": 0, "proxy_server_port": "", "window_size": "480,1024,0", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}, "domain_filter": ["*.doubleclick.net/*", "*.googlesyndication.com/*", "*.ssp.hinet.net/*", "*a.amnet.tw/*", "*adx.c.appier.net/*", "*cdn.cookielaw.org/*", "*cdnjs.cloudflare.com/ajax/libs/clipboard.js/*", "*clarity.ms/*", "*cloudfront.com/*", "*cms.analytics.yahoo.com/*", "*e2elog.fetnet.net/*", "*fundingchoicesmessages.google.com/*", "*ghtinc.com/*", "*google-analytics.com/*", "*googletagmanager.com/*", "*googletagservices.com/*", "*img.uniicreative.com/*", "*lndata.com/*", "*match.adsrvr.org/*", "*onead.onevision.com.tw/*", "*play.google.com/log?*", "*popin.cc/*", "*rollbar.com/*", "*sb.scorecardresearch.com/*", "*tagtoo.co/*", "*ticketmaster.sg/js/adblock*", "*ticketmaster.sg/js/adblock.js*", "*tixcraft.com/js/analytics.js*", "*tixcraft.com/js/common.js*", "*tixcraft.com/js/custom.js*", "*treasuredata.com/*", "*www.youtube.com/youtubei/v1/player/heartbeat*"]} \ No newline at end of file +{"homepage": "about:blank", "browser": "chrome", "language": "English", "ticket_number": 2, "refresh_datetime": "", "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, "max_dwell_time": 90}, "cityline": {"cityline_queue_retry": 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": false, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": false, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, "auto_reload_overheat_count": 4, "auto_reload_overheat_cd": 1, "reset_browser_interval": 0, "proxy_server_port": "", "window_size": "480,1024,0", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}, "domain_filter": ["*.doubleclick.net/*", "*.googlesyndication.com/*", "*.ssp.hinet.net/*", "*a.amnet.tw/*", "*adx.c.appier.net/*", "*cdn.cookielaw.org/*", "*cdnjs.cloudflare.com/ajax/libs/clipboard.js/*", "*clarity.ms/*", "*cloudfront.com/*", "*cms.analytics.yahoo.com/*", "*e2elog.fetnet.net/*", "*fundingchoicesmessages.google.com/*", "*ghtinc.com/*", "*google-analytics.com/*", "*googletagmanager.com/*", "*googletagservices.com/*", "*img.uniicreative.com/*", "*lndata.com/*", "*match.adsrvr.org/*", "*onead.onevision.com.tw/*", "*play.google.com/log?*", "*popin.cc/*", "*rollbar.com/*", "*sb.scorecardresearch.com/*", "*tagtoo.co/*", "*ticketmaster.sg/js/adblock*", "*ticketmaster.sg/js/adblock.js*", "*tixcraft.com/js/analytics.js*", "*tixcraft.com/js/common.js*", "*tixcraft.com/js/custom.js*", "*treasuredata.com/*", "*www.youtube.com/youtubei/v1/player/heartbeat*"]} \ No newline at end of file diff --git a/webdriver/Maxbotplus_1.0.0/background.js b/webdriver/Maxbotplus_1.0.0/background.js index c99c578..46b0974 100644 --- a/webdriver/Maxbotplus_1.0.0/background.js +++ b/webdriver/Maxbotplus_1.0.0/background.js @@ -153,6 +153,48 @@ async function ocr(data_url, image_data, tabId) ); } +async function post(data_url, post_body, tabId) +{ + //console.log("data_url:"+data_url); + fetch(data_url,{ + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: post_body + }) + .then(response => + { + if (response.ok) + { + return response.json(); + } + else if (response.status === 404) + { + let result_json={"answer": "", "fail": 'error 404'}; + //console.log(result_json); + //sendResponse(result_json); + return Promise.reject('error 404') + } + } + ) + .then((data) => + { + if (data) + { + let result_json=data; + console.log(result_json); + chrome.tabs.sendMessage(tabId, result_json); + } + } + ) + .catch(error => + { + console.log('error is', error) + } + ); +} + // for avoid overheat. chrome.storage.local.set( { @@ -179,6 +221,11 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { ocr(request_json.data.url, request_json.data.image_data, tabId); } + if(request_json.action=="post") { + const tabId = sender.tab.id; + post(request_json.data.url, request_json.data.post_data, tabId); + } + if(request_json.action=="status") { result_json={"status": answer}; const tabId = sender.tab.id; diff --git a/webdriver/Maxbotplus_1.0.0/data/settings.json b/webdriver/Maxbotplus_1.0.0/data/settings.json index b28d7fb..0a11acb 100644 --- a/webdriver/Maxbotplus_1.0.0/data/settings.json +++ b/webdriver/Maxbotplus_1.0.0/data/settings.json @@ -1 +1 @@ -{"homepage": "about:blank", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "refresh_datetime": "", "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, "max_dwell_time": 60}, "cityline": {"cityline_queue_retry": 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": false, "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.1, "auto_reload_overheat_count": 4, "auto_reload_overheat_cd": 1.0, "reset_browser_interval": 0, "proxy_server_port": "", "window_size": "480,1024,0", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}} \ No newline at end of file +{"homepage": "about:blank", "browser": "chrome", "language": "English", "ticket_number": 2, "refresh_datetime": "", "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, "max_dwell_time": 90}, "cityline": {"cityline_queue_retry": 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": false, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": false, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, "auto_reload_overheat_count": 4, "auto_reload_overheat_cd": 1, "reset_browser_interval": 0, "proxy_server_port": "", "window_size": "480,1024,0", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}} \ No newline at end of file diff --git a/webdriver/Maxbotplus_1.0.0/js/ibon_eventbuy.js b/webdriver/Maxbotplus_1.0.0/js/ibon_eventbuy.js new file mode 100644 index 0000000..f92ccee --- /dev/null +++ b/webdriver/Maxbotplus_1.0.0/js/ibon_eventbuy.js @@ -0,0 +1,215 @@ +const storage = chrome.storage.local; +var settings = null; +$("footer").remove(); + +function ibon_assign_ticket_number(ticket_number) { + let $main_table = $("div > table.table[id] > tbody"); + if ($main_table.length > 0) { + //console.log("found main table"); + let $ticket_tr = $main_table.find("tr"); + if ($ticket_tr.length) { + let $ticket_options = $main_table.find("select:first option"); + if ($ticket_options.length) { + let is_ticket_number_assign = false; + if (ticket_number > 0) { + console.log("target ticket_number:" + ticket_number); + $ticket_options.each(function() { + if ($(this).val() == ticket_number) { + $(this).prop('selected', true); + $(this).trigger("change"); + is_ticket_number_assign = true; + return false; + } + }); + } + //console.log("is_ticket_number_assign:"+is_ticket_number_assign); + if (!is_ticket_number_assign) { + $ticket_options.last().prop('selected', true); + $ticket_options.trigger("change"); + is_ticket_number_assign = true; + } + if (is_ticket_number_assign) { + let select_tag = document.querySelector("div > table.table[id] > tbody select"); + if(select_tag) { + //console.log("trigger select click"); + select_tag.dispatchEvent(new Event('change')); + } + + start_ibon_ocr(); + } + } else { + //console.log("target option empty"); + } + } else { + setTimeout(function() { + ibon_assign_ticket_number(ticket_number) + }, 200); + } + + } +} + +function ibon_assign_adjacent_seat(flag) { + //console.log("disable_adjacent_seat flag:"+flag); + if (flag) { + $('input[type=checkbox]').each(function() { + $(this).prop('checked', true); + }); + } +} + +function ibon_focus_on_captcha() { + $("div.editor-box > div > input[type='text']").focus(); +} + +var myInterval = null; + +function ibon_get_ocr_image() { + //console.log("get_ocr_image"); + let image_data = ""; + + // PS: tixcraft have different domain to use the same content script. + const currentUrl = window.location.href; + const domain = currentUrl.split('/')[2]; + + let canvas = document.querySelector("div.editor-box > div > canvas"); + if (canvas != null) { + let img_data = canvas.toDataURL(); + if (img_data) { + image_data = img_data.split(",")[1]; + //console.log(image_data); + } + } + return image_data; +} + +chrome.runtime.onMessage.addListener((message) => { + //console.log('sent from background', message); + if(message.answer) { + ibon_set_ocr_answer(message.answer); + } +}); + +function ibon_set_ocr_answer(answer) { + console.log("answer:" + answer); + if (answer.length > 0) { + //$("div.editor-box > div > input[type='text']").val(answer); + + let input_tag = document.querySelector("div.editor-box > div > input[type='text']"); + if(input_tag) { + //console.log("click on captcha input.") + //input_tag.click(); + //input_tag.value=answer; + //input_tag.dispatchEvent(new Event('change')); + if(input_tag.value != answer) { + console.log("set new answer as:" + answer); + ibon_set_ocr_answer_api(answer); + } + } + } +} + +async function ibon_set_ocr_answer_api(answer) { + let api_url = get_remote_url(settings); + let body = { + command: [ + {type: 'sendkey', selector: "div.editor-box > div > input[type='text']", text: answer}, + {type: 'click', selector: 'div#ticket-wrap a.btn.btn-primary[href]'} + ]}; + body = JSON.stringify(body); + + let bundle = { + action: 'post', + data: { + 'url': api_url + 'sendkey', + 'post_data': body, + } + }; + + let bundle_string = JSON.stringify(bundle); + const return_answer = await chrome.runtime.sendMessage(bundle); + //console.log(return_answer); +} + +async function ibon_get_ocr_answer(api_url, image_data) { + let bundle = { + action: 'ocr', + data: { + 'url': api_url + 'ocr', + 'image_data': image_data, + } + }; + + let bundle_string = JSON.stringify(bundle); + const return_answer = await chrome.runtime.sendMessage(bundle); + //console.log(return_answer); +} + +function ibon_orc_image_ready(api_url) { + let ret = false; + let image_data = ibon_get_ocr_image(); + if (image_data.length > 0) { + ret = true; + if (myInterval) clearInterval(myInterval); + ibon_get_ocr_answer(api_url, image_data); + } + console.log("ibon_orc_image_ready:" + ret); + return ret; +} + +storage.get('settings', function(items) { + if (items.settings) { + settings = items.settings; + } else { + console.log('no settings found'); + } +}); + + +storage.get('settings', function(items) { + if (items.settings) { + settings = items.settings; + } +}); + +function get_remote_url(settings) { + let remote_url_string = ""; + if (settings) { + let remote_url_array = []; + if (settings.advanced.remote_url.length > 0) { + remote_url_array = JSON.parse('[' + settings.advanced.remote_url + ']'); + } + if (remote_url_array.length) { + remote_url_string = remote_url_array[0]; + } + } + return remote_url_string; +} + +function start_ibon_ocr() { + // ocr + if (settings.ocr_captcha.enable) { + let remote_url_string = get_remote_url(settings); + if (!ibon_orc_image_ready(remote_url_string)) { + myInterval = setInterval(() => { + ibon_orc_image_ready(remote_url_string); + }, 100); + } + } else { + // no orc, just focus; + ibon_focus_on_captcha(); + } +} + +storage.get('status', function(items) { + if (items.status && items.status == 'ON') { + //console.log("ticket_number:"+ settings.ticket_number); + // ajax. + setTimeout(function() { + ibon_assign_ticket_number(settings.ticket_number); + ibon_assign_adjacent_seat(settings.advanced.disable_adjacent_seat); + }, 100); + } else { + console.log('no status found'); + } +}); \ No newline at end of file diff --git a/webdriver/Maxbotplus_1.0.0/js/ibon_ticket_next.js b/webdriver/Maxbotplus_1.0.0/js/ibon_ticket_next.js index de7d6c9..4a7c2ec 100644 --- a/webdriver/Maxbotplus_1.0.0/js/ibon_ticket_next.js +++ b/webdriver/Maxbotplus_1.0.0/js/ibon_ticket_next.js @@ -1,5 +1,4 @@ var myInterval = null; - function dom_ready() { let ret=false; @@ -8,15 +7,29 @@ function dom_ready() ret=true; if(myInterval) clearInterval(myInterval); (function () { - $("div#ticket-wrap a[onclick]").click(); + var btn_e = document.createEvent('MouseEvents'); + btn_e.initEvent('click', true, true ); + + let btn1 = document.querySelector("div#ticket-wrap > a[onclick]"); + if(btn1 > 0) { + console.log("trigger btn1 click"); + //btn1.click(); + let btn1 = document.querySelector("div#ticket-wrap > a[onclick]"); + btn1.dispatchEvent(btn_e); + } else { + let btn2 = document.querySelector("div#ticket-wrap > a[href]"); + if(btn2) { + console.log("trigger btn2 click"); + //btn2.click(); + btn2.dispatchEvent(btn_e); + } + } })(); } - //console.log("dom_ready:"+ret); + console.log("dom_ready:"+ret); return ret; } -if(!dom_ready()) { - myInterval = setInterval(() => { - dom_ready(); - }, 100); -} +myInterval = setInterval(() => { + dom_ready(); +}, 1000); diff --git a/webdriver/Maxbotplus_1.0.0/js/kktix_events.js b/webdriver/Maxbotplus_1.0.0/js/kktix_events.js index 8188228..02b4c29 100644 --- a/webdriver/Maxbotplus_1.0.0/js/kktix_events.js +++ b/webdriver/Maxbotplus_1.0.0/js/kktix_events.js @@ -1,8 +1,5 @@ const storage = chrome.storage.local; -$("div.description").remove(); -$("footer").remove(); - function kktix_event_redirect() { const currentUrl = window.location.href; diff --git a/webdriver/Maxbotplus_1.0.0/js/kktix_home.js b/webdriver/Maxbotplus_1.0.0/js/kktix_home.js deleted file mode 100644 index d7fdca9..0000000 --- a/webdriver/Maxbotplus_1.0.0/js/kktix_home.js +++ /dev/null @@ -1,5 +0,0 @@ -$("div.headlines").remove(); -$("section.app-intro").remove(); -$("section.copywriting").remove(); -$("section.partner-venues").remove(); -$("footer").remove(); diff --git a/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_assign.js b/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_assign.js index 17f4f8a..dd6e8aa 100644 --- a/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_assign.js +++ b/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_assign.js @@ -1,6 +1,4 @@ var myInterval = null; -var checkboxInterval = null; -//console.log("assign appear"); function kktix_verification_conditions(settings) { @@ -35,14 +33,6 @@ function kktix_verification_conditions(settings) return is_text_sent; } -function kktix_agree() -{ - $('input[type=checkbox]:not(:checked)').each(function() { - $(this).click(); - if(checkboxInterval) clearInterval(checkboxInterval); - }); -} - function kktix_area_keyword(settings) { let area_keyword_array = []; @@ -91,20 +81,6 @@ function kktix_area_keyword(settings) let ticket_number = settings.ticket_number; if(ticket_number>0) { - /* - // trigger events by jQuery. - let target_input = target_area.find("input"); - target_input.click(); - target_input.prop("value", ticket_number); - let down = $.Event('keydown'); - down.key=""+ticket_number; - target_input.trigger(down); - - let up = $.Event('keyup'); - up.key=""+ticket_number; - target_input.trigger(up); - */ - //console.log(base_info); let is_verification_conditions_popup = false; @@ -176,20 +152,8 @@ function dom_ready() return ret; } -const rootElement = document.documentElement; -if(rootElement) { - if(!dom_ready()) { - myInterval = setInterval(() => { - dom_ready(); - }, 200); - - checkboxInterval= setInterval(() => { - //console.log("kktix_agree") - kktix_agree(); - }, 200); - } - $("footer").remove(); - $("div.banner-wrapper div.img-wrapper img").remove(); +if(!dom_ready()) { + myInterval = setInterval(() => { + dom_ready(); + }, 200); } - - diff --git a/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_reload.js b/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_reload.js index a733f91..7d54e8b 100644 --- a/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_reload.js +++ b/webdriver/Maxbotplus_1.0.0/js/kktix_registrations_reload.js @@ -1,6 +1,19 @@ const storage = chrome.storage.local; var settings = null; -var myInterval = null; +var checkboxInterval = null; +var notNowInterval = null; + +function kktix_agree() +{ + $('input[type=checkbox]:not(:checked)').each(function() { + $(this).click(); + }); +} + +function kktix_not_now() +{ + $("#guestModal.modal.in > div.modal-dialog > div > div.modal-footer > button.btn-default.pull-right").click(); +} function kktix_clean_exclude(settings) { @@ -42,7 +55,7 @@ function kktix_force_auto_reload_by_timer() if(max_dwell_time <= 10) { max_dwell_time = 10; } - console.log('We are going to force reload after few seconeds.'); + console.log('We are going to force reload after '+ max_dwell_time +' seconeds.'); setTimeout(function () { location.reload(); }, max_dwell_time * 1000); @@ -62,6 +75,13 @@ storage.get('status', function (items) { if (items.status && items.status=='ON') { + checkboxInterval = setInterval(() => { + kktix_agree(); + }, 100); + + notNowInterval = setInterval(() => { + kktix_not_now(); + }, 200); kktix_force_auto_reload_by_timer(); setTimeout(function () { diff --git a/webdriver/Maxbotplus_1.0.0/manifest.json b/webdriver/Maxbotplus_1.0.0/manifest.json index 15cfe59..9eef0db 100644 --- a/webdriver/Maxbotplus_1.0.0/manifest.json +++ b/webdriver/Maxbotplus_1.0.0/manifest.json @@ -291,6 +291,16 @@ "js/ibon_ticket_next.js" ] }, + { + "matches": [ + "https://ticket.ibon.com.tw/EventBuy/*/*/*" + ], + "run_at": "document_end", + "js": [ + "jquery.min.js", + "js/ibon_eventbuy.js" + ] + }, { "matches": [ "https://orders.ibon.com.tw/application/utk02/UTK0201_0.aspx?*PERFORMANCE_ID=*PRODUCT_ID=*", @@ -415,16 +425,6 @@ "js/ticketplus_order.js" ] }, - { - "matches": [ - "https://kktix.com/" - ], - "run_at": "document_end", - "js": [ - "jquery.min.js", - "js/kktix_home.js" - ] - }, { "matches": [ "https://*.kktix.cc/events/*" @@ -435,17 +435,6 @@ "js/kktix_events.js" ] }, - { - "matches": [ - "https://kktix.com/events/*/registrations/new" - ], - "world": "MAIN", - "run_at": "document_end", - "js": [ - "js/common.js", - "js/kktix_registrations_assign.js" - ] - }, { "matches": [ "https://kktix.com/events/*/registrations/new" @@ -476,7 +465,7 @@ "js/fantopia_fill.js" ] } - + ], - "version": "1.0.28" + "version": "1.0.29" } diff --git a/www/settings.html b/www/settings.html index cf6813a..2ee2a46 100644 --- a/www/settings.html +++ b/www/settings.html @@ -432,6 +432,14 @@ + +
+ +
+ +
+
+ diff --git a/www/settings.js b/www/settings.js index fcd6796..ef55ca5 100644 --- a/www/settings.js +++ b/www/settings.js @@ -52,6 +52,7 @@ const PUBLIC_SERVER_URL = "http://maxbot.dropboxlike.com:16888/"; // dictionary const user_guess_string = document.querySelector('#user_guess_string'); +const auto_guess_options = document.querySelector('#auto_guess_options'); // auto fill @@ -158,6 +159,7 @@ function load_settins_to_form(settings) if(user_guess_string.value=='""') { user_guess_string.value=''; } + auto_guess_options.checked = settings.advanced.auto_guess_options; // auto fill tixcraft_sid.value = settings.advanced.tixcraft_sid; @@ -405,6 +407,8 @@ function save_changes_to_dict(silent_flag) } settings.advanced.user_guess_string = user_guess_string_string; + settings.advanced.auto_guess_options = auto_guess_options.checked; + // auto fill settings.advanced.tixcraft_sid = tixcraft_sid.value; settings.advanced.ibonqware = ibonqware.value;