2023-04-21, KKTIX support to guess a new question style.
parent
a59d4af622
commit
e44ad8c352
|
@ -49,11 +49,12 @@ except Exception as exc:
|
||||||
|
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import argparse
|
import argparse
|
||||||
|
import itertools
|
||||||
|
|
||||||
import ssl
|
import ssl
|
||||||
ssl._create_default_https_context = ssl._create_unverified_context
|
ssl._create_default_https_context = ssl._create_unverified_context
|
||||||
|
|
||||||
CONST_APP_VERSION = u"MaxBot (2023.04.19)"
|
CONST_APP_VERSION = u"MaxBot (2023.04.21)"
|
||||||
|
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
|
CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
|
||||||
|
@ -240,6 +241,26 @@ def find_continuous_pattern(allowed_char, text):
|
||||||
is_allowed_char_start = False
|
is_allowed_char_start = False
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def is_all_alpha_or_numeric(text):
|
||||||
|
ret = False
|
||||||
|
alpha_count = 0
|
||||||
|
numeric_count = 0
|
||||||
|
for char in text:
|
||||||
|
try:
|
||||||
|
if char.encode('UTF-8').isalpha():
|
||||||
|
alpha_count += 1
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if char.isnumeric():
|
||||||
|
numeric_count += 1
|
||||||
|
|
||||||
|
if (alpha_count + numeric_count) == len(text):
|
||||||
|
ret = True
|
||||||
|
|
||||||
|
#print("text/is_all_alpha_or_numeric:",text,ret)
|
||||||
|
return ret
|
||||||
|
|
||||||
def get_favoriate_extension_path(webdriver_path):
|
def get_favoriate_extension_path(webdriver_path):
|
||||||
print("webdriver_path:", webdriver_path)
|
print("webdriver_path:", webdriver_path)
|
||||||
no_google_analytics_path = os.path.join(webdriver_path,"no_google_analytics_1.1.0.0.crx")
|
no_google_analytics_path = os.path.join(webdriver_path,"no_google_analytics_1.1.0.0.crx")
|
||||||
|
@ -773,6 +794,15 @@ def guess_answer_list_from_multi_options(tmp_text):
|
||||||
if len(return_list) <= 2:
|
if len(return_list) <= 2:
|
||||||
return_list = None
|
return_list = None
|
||||||
|
|
||||||
|
# remove chinese work options.
|
||||||
|
if not return_list is None:
|
||||||
|
new_list = []
|
||||||
|
for item in return_list:
|
||||||
|
if is_all_alpha_or_numeric(item):
|
||||||
|
new_list.append(item)
|
||||||
|
if len(new_list) >=3:
|
||||||
|
return_list = new_list
|
||||||
|
|
||||||
return return_list
|
return return_list
|
||||||
|
|
||||||
#PS: this may get a wrong answer list. XD
|
#PS: this may get a wrong answer list. XD
|
||||||
|
@ -1029,6 +1059,7 @@ def guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captch
|
||||||
search_result = pattern.search(my_options)
|
search_result = pattern.search(my_options)
|
||||||
if not search_result is None:
|
if not search_result is None:
|
||||||
(span_start, span_end) = search_result.span()
|
(span_start, span_end) = search_result.span()
|
||||||
|
maybe_delimitor=""
|
||||||
if len(my_options) > (span_end+1)+1:
|
if len(my_options) > (span_end+1)+1:
|
||||||
maybe_delimitor = my_options[span_end+0:span_end+1]
|
maybe_delimitor = my_options[span_end+0:span_end+1]
|
||||||
if maybe_delimitor in allow_delimitor_symbols:
|
if maybe_delimitor in allow_delimitor_symbols:
|
||||||
|
@ -1058,6 +1089,11 @@ def guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captch
|
||||||
# re-sample for this case.
|
# re-sample for this case.
|
||||||
return_list = re.findall(my_anwser_formated, my_options)
|
return_list = re.findall(my_anwser_formated, my_options)
|
||||||
|
|
||||||
|
if len(return_list) == 1:
|
||||||
|
# if use pattern to find matched only one, means it is for example text.
|
||||||
|
return_list = None
|
||||||
|
|
||||||
|
if not return_list is None:
|
||||||
# clean delimitor
|
# clean delimitor
|
||||||
if is_trim_quota:
|
if is_trim_quota:
|
||||||
return_list_length = len(return_list)
|
return_list_length = len(return_list)
|
||||||
|
@ -1068,7 +1104,7 @@ def guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captch
|
||||||
if show_debug_message:
|
if show_debug_message:
|
||||||
print("cleaned return_list:" , return_list)
|
print("cleaned return_list:" , return_list)
|
||||||
|
|
||||||
return return_list
|
return return_list, offical_hint_string_anwser
|
||||||
|
|
||||||
def format_question_string(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text):
|
def format_question_string(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text):
|
||||||
tmp_text = captcha_text_div_text
|
tmp_text = captcha_text_div_text
|
||||||
|
@ -1077,6 +1113,15 @@ def format_question_string(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_tex
|
||||||
# for hint
|
# for hint
|
||||||
tmp_text = tmp_text.replace(u'*',u'*')
|
tmp_text = tmp_text.replace(u'*',u'*')
|
||||||
|
|
||||||
|
# stop word.
|
||||||
|
tmp_text = tmp_text.replace(u'輸入法',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請問',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請將',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請在',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請以',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請回答',u'')
|
||||||
|
tmp_text = tmp_text.replace(u'請',u'')
|
||||||
|
|
||||||
# replace ex.
|
# replace ex.
|
||||||
tmp_text = tmp_text.replace(u'例如', CONST_EXAMPLE_SYMBOL)
|
tmp_text = tmp_text.replace(u'例如', CONST_EXAMPLE_SYMBOL)
|
||||||
tmp_text = tmp_text.replace(u'如:', CONST_EXAMPLE_SYMBOL)
|
tmp_text = tmp_text.replace(u'如:', CONST_EXAMPLE_SYMBOL)
|
||||||
|
@ -1110,6 +1155,29 @@ def format_question_string(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_tex
|
||||||
|
|
||||||
return tmp_text
|
return tmp_text
|
||||||
|
|
||||||
|
def permutations(iterable, r=None):
|
||||||
|
pool = tuple(iterable)
|
||||||
|
n = len(pool)
|
||||||
|
r = n if r is None else r
|
||||||
|
if r > n:
|
||||||
|
return
|
||||||
|
indices = list(range(n))
|
||||||
|
cycles = list(range(n, n-r, -1))
|
||||||
|
yield tuple(pool[i] for i in indices[:r])
|
||||||
|
while n:
|
||||||
|
for i in reversed(range(r)):
|
||||||
|
cycles[i] -= 1
|
||||||
|
if cycles[i] == 0:
|
||||||
|
indices[i:] = indices[i+1:] + indices[i:i+1]
|
||||||
|
cycles[i] = n - i
|
||||||
|
else:
|
||||||
|
j = cycles[i]
|
||||||
|
indices[i], indices[-j] = indices[-j], indices[i]
|
||||||
|
yield tuple(pool[i] for i in indices[:r])
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
def get_answer_list_by_question(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text):
|
def get_answer_list_by_question(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text):
|
||||||
show_debug_message = True # debug.
|
show_debug_message = True # debug.
|
||||||
show_debug_message = False # online
|
show_debug_message = False # online
|
||||||
|
@ -1125,8 +1193,39 @@ def get_answer_list_by_question(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captch
|
||||||
if not return_list is None:
|
if not return_list is None:
|
||||||
print("guess_answer_list_from_multi_options:", return_list)
|
print("guess_answer_list_from_multi_options:", return_list)
|
||||||
|
|
||||||
|
offical_hint_string_anwser = ""
|
||||||
if return_list is None:
|
if return_list is None:
|
||||||
return_list = guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text)
|
return_list, offical_hint_string_anwser = guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text)
|
||||||
|
else:
|
||||||
|
is_match_factorial = False
|
||||||
|
mutiple = 0
|
||||||
|
|
||||||
|
return_list_2, offical_hint_string_anwser = guess_answer_list_from_hint(CONST_EXAMPLE_SYMBOL, CONST_INPUT_SYMBOL, captcha_text_div_text)
|
||||||
|
if return_list_2 is None:
|
||||||
|
if len(offical_hint_string_anwser) >=3:
|
||||||
|
if len(return_list) >=3:
|
||||||
|
mutiple = int(len(offical_hint_string_anwser) / len(return_list[0]))
|
||||||
|
if mutiple >=3 :
|
||||||
|
is_match_factorial = True
|
||||||
|
|
||||||
|
if show_debug_message:
|
||||||
|
print("mutiple:", mutiple)
|
||||||
|
print("is_match_factorial:", is_match_factorial)
|
||||||
|
if is_match_factorial:
|
||||||
|
is_match_factorial = False
|
||||||
|
order_string_list = ['排列','排序','依序','順序','遞增','遞減','升冪','降冪','新到舊','舊到新','小到大','大到小','高到低','低到高']
|
||||||
|
for order_string in order_string_list:
|
||||||
|
if order_string in tmp_text:
|
||||||
|
is_match_factorial = True
|
||||||
|
|
||||||
|
if is_match_factorial:
|
||||||
|
new_array = permutations(return_list, mutiple)
|
||||||
|
#print("new_array:", new_array)
|
||||||
|
|
||||||
|
return_list = []
|
||||||
|
for item_tuple in new_array:
|
||||||
|
return_list.append(''.join(item_tuple))
|
||||||
|
|
||||||
if show_debug_message:
|
if show_debug_message:
|
||||||
if not return_list is None:
|
if not return_list is None:
|
||||||
print("guess_answer_list_from_hint:", return_list)
|
print("guess_answer_list_from_hint:", return_list)
|
||||||
|
@ -2111,15 +2210,21 @@ def guess_tixcraft_question(driver):
|
||||||
|
|
||||||
return inferred_answer_string, answer_list
|
return inferred_answer_string, answer_list
|
||||||
|
|
||||||
def tixcraft_verify(driver, presale_code, presale_code_delimiter, answer_index):
|
def tixcraft_verify(driver, config_dict, answer_index):
|
||||||
show_debug_message = True # debug.
|
show_debug_message = True # debug.
|
||||||
show_debug_message = False # online
|
show_debug_message = False # online
|
||||||
|
|
||||||
|
if config_dict["advanced"]["verbose"]:
|
||||||
|
show_debug_message = True
|
||||||
|
|
||||||
inferred_answer_string = None
|
inferred_answer_string = None
|
||||||
answer_list = []
|
answer_list = []
|
||||||
|
|
||||||
is_retry_user_single_answer = False
|
is_retry_user_single_answer = False
|
||||||
|
|
||||||
|
presale_code = config_dict["tixcraft"]["presale_code"]
|
||||||
|
presale_code_delimiter = config_dict["tixcraft"]["presale_code_delimiter"]
|
||||||
|
|
||||||
if len(presale_code) > 0:
|
if len(presale_code) > 0:
|
||||||
if len(presale_code_delimiter) > 0:
|
if len(presale_code_delimiter) > 0:
|
||||||
if presale_code_delimiter in presale_code:
|
if presale_code_delimiter in presale_code:
|
||||||
|
@ -2133,12 +2238,13 @@ def tixcraft_verify(driver, presale_code, presale_code_delimiter, answer_index):
|
||||||
inferred_answer_string = presale_code
|
inferred_answer_string = presale_code
|
||||||
|
|
||||||
if inferred_answer_string is None:
|
if inferred_answer_string is None:
|
||||||
inferred_answer_string, answer_list = guess_tixcraft_question(driver)
|
if config_dict["advanced"]["auto_guess_options"]:
|
||||||
if inferred_answer_string is None:
|
inferred_answer_string, answer_list = guess_tixcraft_question(driver)
|
||||||
if not answer_list is None:
|
if inferred_answer_string is None:
|
||||||
if len(answer_list) > 0:
|
if not answer_list is None:
|
||||||
if answer_index < len(answer_list)-1:
|
if len(answer_list) > 0:
|
||||||
inferred_answer_string = answer_list[answer_index+1]
|
if answer_index < len(answer_list)-1:
|
||||||
|
inferred_answer_string = answer_list[answer_index+1]
|
||||||
|
|
||||||
if show_debug_message:
|
if show_debug_message:
|
||||||
print("answer_index:", answer_index)
|
print("answer_index:", answer_index)
|
||||||
|
@ -3588,13 +3694,10 @@ def kktix_reg_captcha(driver, config_dict, answer_index, is_finish_checkbox_clic
|
||||||
if show_debug_message:
|
if show_debug_message:
|
||||||
print("found captcha_inner_div layor.")
|
print("found captcha_inner_div layor.")
|
||||||
|
|
||||||
auto_guess_options = config_dict["kktix"]["auto_guess_options"]
|
|
||||||
user_guess_string = config_dict["kktix"]["user_guess_string"]
|
|
||||||
|
|
||||||
if len(user_guess_string) > 0:
|
if len(user_guess_string) > 0:
|
||||||
inferred_answer_string = user_guess_string
|
inferred_answer_string = config_dict["kktix"]["user_guess_string"]
|
||||||
else:
|
else:
|
||||||
if auto_guess_options:
|
if config_dict["advanced"]["auto_guess_options"]:
|
||||||
inferred_answer_string, answer_list = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div)
|
inferred_answer_string, answer_list = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div)
|
||||||
|
|
||||||
if inferred_answer_string is not None:
|
if inferred_answer_string is not None:
|
||||||
|
@ -6308,9 +6411,7 @@ def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
|
||||||
|
|
||||||
|
|
||||||
if '/ticket/verify/' in url:
|
if '/ticket/verify/' in url:
|
||||||
presale_code = config_dict["tixcraft"]["presale_code"]
|
tixcraft_dict["answer_index"] = tixcraft_verify(driver, config_dict, tixcraft_dict["answer_index"])
|
||||||
presale_code_delimiter = config_dict["tixcraft"]["presale_code_delimiter"]
|
|
||||||
tixcraft_dict["answer_index"] = tixcraft_verify(driver, presale_code, presale_code_delimiter, tixcraft_dict["answer_index"])
|
|
||||||
else:
|
else:
|
||||||
tixcraft_dict["answer_index"] = -1
|
tixcraft_dict["answer_index"] = -1
|
||||||
|
|
||||||
|
@ -10056,6 +10157,7 @@ if __name__ == "__main__":
|
||||||
#captcha_text_div_text = "魏如萱得過什麼獎?(1) 金馬獎 最佳女主角(2) 金鐘獎 戲劇節目女主角(3) 金曲獎 最佳華語女歌手(4) 走鐘獎 好好聽音樂獎 (請輸入半形數字)"
|
#captcha_text_div_text = "魏如萱得過什麼獎?(1) 金馬獎 最佳女主角(2) 金鐘獎 戲劇節目女主角(3) 金曲獎 最佳華語女歌手(4) 走鐘獎 好好聽音樂獎 (請輸入半形數字)"
|
||||||
#captcha_text_div_text = "Love in the Air 是由哪兩本小說改篇而成呢?(A)Love Strom & Love Sky (B)Love Rain & Love Cloud (C)Love Wind & Love Sun (D)Love Dry & Love Cold (請輸入選項大寫英文單字 範例:E)"
|
#captcha_text_div_text = "Love in the Air 是由哪兩本小說改篇而成呢?(A)Love Strom & Love Sky (B)Love Rain & Love Cloud (C)Love Wind & Love Sun (D)Love Dry & Love Cold (請輸入選項大寫英文單字 範例:E)"
|
||||||
#captcha_text_div_text = "請問以下哪一部戲劇是Off Gun合作出演的戲劇?【1G】Midnight Museum 【2F】10 Years Ticket 【8B】Not Me (請以半形輸入法作答,大小寫/阿拉伯數字需要一模一樣,範例:9A)"
|
#captcha_text_div_text = "請問以下哪一部戲劇是Off Gun合作出演的戲劇?【1G】Midnight Museum 【2F】10 Years Ticket 【8B】Not Me (請以半形輸入法作答,大小寫/阿拉伯數字需要一模一樣,範例:9A)"
|
||||||
|
#captcha_text_div_text = "請將以下【歌曲】已發行日期由「新到舊」依序排列 【H1】 After LIKE 【22】 I AM 【R3】 ELEVEN 【74】LOVE DIVE 請以半形輸入法輸入正確答案之\"選項\",大小寫/阿拉伯數字需要一模一樣,範例:A142X384"
|
||||||
captcha_text_div_text = "請將以下【歌曲】已發行日期由「新到舊」依序排列 【H】 After LIKE 【2】 I AM 【R】 ELEVEN 【7】LOVE DIVE 請以半形輸入法輸入正確答案之\"選項\",大小寫/阿拉伯數字需要一模一樣,範例:A4X8"
|
captcha_text_div_text = "請將以下【歌曲】已發行日期由「新到舊」依序排列 【H】 After LIKE 【2】 I AM 【R】 ELEVEN 【7】LOVE DIVE 請以半形輸入法輸入正確答案之\"選項\",大小寫/阿拉伯數字需要一模一樣,範例:A4X8"
|
||||||
inferred_answer_string, answer_list = get_answer_list_from_question_string(None, captcha_text_div_text)
|
inferred_answer_string, answer_list = get_answer_list_from_question_string(None, captcha_text_div_text)
|
||||||
print("inferred_answer_string:", inferred_answer_string)
|
print("inferred_answer_string:", inferred_answer_string)
|
||||||
|
|
Loading…
Reference in New Issue