gui.py 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250
  1. import os
  2. import re
  3. import tkinter
  4. import threading
  5. import crawler.controller
  6. import crawler.template
  7. from newtkinter import askdirectory
  8. SCREEN = tkinter.Tk()
  9. database_list = []
  10. attributes_dict = {}
  11. PATH = os.getcwd()
  12. cookies_list = []
  13. bg_color = "#FFFAFA" # 主颜色
  14. buttom_bg_color = "#FFFAFA" # 按钮颜色
  15. word_color = "#000000" # 文字颜色
  16. SCREEN["bg"] = bg_color
  17. FONT = ("黑体", 11) # 设置字体
  18. start_loader_stop = False
  19. user_agent_input = None
  20. requests_data = None
  21. mode_input = None
  22. time_out = None
  23. applied_cookies = None
  24. url_box = None
  25. filter_func_box = None
  26. cookies_fixed = None
  27. cookies_BOX = None
  28. new_cookies = None
  29. search_all = None
  30. search_key = None
  31. parser_func_box = None
  32. operation_object = None
  33. object_index = None
  34. send_text = None
  35. password = None
  36. select_object = None
  37. wait_time = None
  38. js_code = None
  39. now_running = None
  40. status_output = None
  41. variable_box = None
  42. cookies_name_input = None
  43. element_name = None
  44. attributes_name = None
  45. attribute_regex = None
  46. attributes_value = None
  47. attributes_box = None
  48. find_text = None
  49. is_recursive = None
  50. text_regex = None
  51. limit = None
  52. find_path = None
  53. data_format = None
  54. database_name = None
  55. database_box = None
  56. url_tag = None
  57. chains = None
  58. drag_element = None
  59. drag_element_index = None
  60. type_value = None
  61. run_time = None
  62. is_special_keys = None
  63. save_dir = None
  64. url = None
  65. loader = None
  66. page_parser = None
  67. database = None
  68. class UIAPI:
  69. @staticmethod
  70. def get_db_index_gui(object_index):
  71. try:
  72. index = eval(object_index.get(), {})
  73. except BaseException:
  74. index = slice(None, None)
  75. return index
  76. @staticmethod
  77. def get_datadase_name_gui():
  78. global database_box, database_list
  79. try:
  80. return database_list[database_box.curselection()[0]]
  81. except BaseException:
  82. try:
  83. return database_list[0]
  84. except BaseException:
  85. return None
  86. @staticmethod
  87. def update_database_box_gui():
  88. global database_box, database_list
  89. database_list = database.return_database()
  90. database_box.delete(0, tkinter.END)
  91. database_box.insert(tkinter.END, *database_list)
  92. @staticmethod
  93. def update_run_status_gui(now_func, status, value_box):
  94. global now_running, status_output, variable_box
  95. now_running.set(now_func)
  96. status_output.set(status)
  97. variable_box.delete(0, tkinter.END)
  98. variable_box.insert(0, *value_box)
  99. @staticmethod
  100. def get_attributes_box_index_gui():
  101. return attributes_box.curselection()[0]
  102. @staticmethod
  103. def add_attributes_gui():
  104. name = attributes_name.get()
  105. value = attributes_value.get()
  106. if name == "" or value == "":
  107. raise Exception
  108. value = re.compile(value) if bool(attribute_regex.get()) else value
  109. return name, value
  110. @staticmethod
  111. def update_attributes_box_gui():
  112. global attributes_box, attributes_dict
  113. show = []
  114. for i in attributes_dict:
  115. show.append(f"{i} -> {attributes_dict[i]}")
  116. attributes_box.delete(0, tkinter.END)
  117. attributes_box.insert(tkinter.END, *show)
  118. @staticmethod
  119. def third_func_args_gui(): # 方法args统一转换(第三栏目)
  120. global is_special_keys, chains, drag_element, drag_element_index, run_time, operation_object, object_index
  121. global type_value
  122. try:
  123. index = int(object_index.get())
  124. except BaseException:
  125. index = 0
  126. try:
  127. index2 = int(drag_element_index.get())
  128. except BaseException:
  129. index2 = 0
  130. try:
  131. time = int(run_time.get())
  132. except BaseException:
  133. time = 1
  134. return dict(
  135. Chains=chains.get(),
  136. element_value=operation_object.get(),
  137. index=index,
  138. element_value2=drag_element.get(),
  139. index2=index2,
  140. run_time=time,
  141. is_special_keys=bool(is_special_keys.get()),
  142. key=type_value.get(),
  143. )
  144. @staticmethod
  145. def second_func_args_gui(): # 方法args统一转换(第二栏目)
  146. global cookies_name_input, new_cookies, element_name, attributes_dict, operation_object, object_index
  147. global find_text, text_regex, limit, is_recursive, find_path
  148. try:
  149. index = eval(object_index.get(), {})
  150. except BaseException:
  151. index = slice(None, None)
  152. try:
  153. cookies = eval(new_cookies.get(), {})
  154. except BaseException:
  155. cookies = {}
  156. return dict(
  157. element_value=operation_object.get(),
  158. index=index,
  159. cookies_name=cookies_name_input.get(),
  160. cookies=cookies,
  161. tag=element_name.get().split(","),
  162. attribute=attributes_dict,
  163. text=re.compile(find_text.get()) if bool(text_regex.get()) else find_text.get(),
  164. limit=limit.get(),
  165. recursive=bool(is_recursive.get()),
  166. path=find_path.get(),
  167. )
  168. @staticmethod
  169. def first_func_args_gui(): # 方法args统一转换(不支持Frame)
  170. global operation_object, object_index, send_text, password, select_object, js_code, wait_time
  171. try:
  172. time = int(wait_time.get())
  173. except BaseException:
  174. time = 2
  175. try:
  176. index = int(object_index.get())
  177. except BaseException:
  178. index = 0
  179. return dict(
  180. element_value=operation_object.get(),
  181. index=index,
  182. text=send_text.get(),
  183. User=password.get(),
  184. Passwd=password.get(),
  185. deselect=select_object.get(),
  186. JS=js_code.get(),
  187. time=time,
  188. )
  189. @staticmethod
  190. def get_parser_func_box_index_gui():
  191. return parser_func_box.curselection()[0]
  192. @staticmethod
  193. def update_parser_func_box_gui():
  194. global parser_func_box, page_parser
  195. parser_func_box.delete(0, tkinter.END)
  196. parser_func_box.insert(tkinter.END, *page_parser.return_func(False)[::-1])
  197. @staticmethod
  198. def get_new_cookies_gui():
  199. return eval(new_cookies.get(), {})
  200. @staticmethod
  201. def get_cookies_fix_gui():
  202. return bool(cookies_fixed.get())
  203. @staticmethod
  204. def get_cookies_box_index_gui():
  205. return cookies_BOX.curselection()[0]
  206. @staticmethod
  207. def update_cookies_box_gui(cookies):
  208. global cookies_BOX, cookies_list
  209. if API.get_cookies_fix_gui():
  210. cookies_list = cookies
  211. cookies_BOX.delete(0, tkinter.END)
  212. cookies_BOX.insert(0, *cookies)
  213. @staticmethod
  214. def get_filter_func_box_index_gui():
  215. return filter_func_box.curselection()[0]
  216. @staticmethod
  217. def update_filter_func_box_gui():
  218. global url, filter_func_box
  219. filter_func_box.delete(0, tkinter.END)
  220. filter_func_box.insert(tkinter.END, *url.return_filter_func())
  221. @staticmethod
  222. def get_url_box_index_gui():
  223. return url_box.curselection()[0]
  224. @staticmethod
  225. def get_url_parameter_gui():
  226. try:
  227. data = eval(requests_data.get(), {})
  228. except BaseException:
  229. data = {}
  230. try:
  231. the_time_out = int(time_out.get())
  232. except BaseException:
  233. the_time_out = 5
  234. re = dict(
  235. func=mode_input.get(),
  236. UA=user_agent_input.get(),
  237. cookies=applied_cookies.get(),
  238. data=data,
  239. time_out=the_time_out,
  240. )
  241. name = ["no_js", "no_java", "no_plugins", "first_run", "head", "no_img", "new"]
  242. for i in range(len(name)):
  243. re[name[i]] = bool(url_parameter[i].get())
  244. return re
  245. @staticmethod
  246. def get_new_url_name_gui():
  247. return url_input.get()
  248. @staticmethod
  249. def add_url_from_tag_gui():
  250. try:
  251. index = eval(object_index.get(), {})
  252. except BaseException:
  253. index = slice(None, None)
  254. return dict(
  255. element_value=operation_object.get(),
  256. index=index,
  257. url_name=url_tag.get(),
  258. update_func=API.update_url_box_gui,
  259. url_args=API.get_url_parameter_gui(),
  260. )
  261. @staticmethod
  262. def update_url_box_gui():
  263. global url, url_box
  264. url_box.delete(0, tkinter.END)
  265. url_box.insert(tkinter.END, *url.return_url())
  266. @staticmethod
  267. def to_database_gui():
  268. index = API.get_db_index_gui(object_index)
  269. return dict(element_value=operation_object.get(),
  270. index=index,
  271. data=data_format.get(),
  272. dataBase_name=API.get_datadase_name_gui(),)
  273. class API(UIAPI):
  274. @staticmethod
  275. def to_database(is_tag=True):
  276. global object_index, operation_object, data_format, page_parser
  277. if is_tag:
  278. func = page_parser.to_database
  279. else:
  280. func = page_parser.to_database_by_re
  281. func(**API.to_database_gui())
  282. API.update_parser_func_box_gui()
  283. @staticmethod
  284. def close():
  285. name = API.get_datadase_name_gui()
  286. database.close(name)
  287. API.update_database_box_gui()
  288. @staticmethod
  289. def out():
  290. name = API.get_datadase_name_gui()
  291. database.out(name, save_dir)
  292. API.update_database_box_gui()
  293. @staticmethod
  294. def remove_database():
  295. name = API.get_datadase_name_gui()
  296. database.rm_database(name)
  297. API.update_database_box_gui()
  298. @staticmethod
  299. def add_database():
  300. name = database_name.get()
  301. database.add_database(name)
  302. API.update_database_box_gui()
  303. @staticmethod
  304. def clean_attributes():
  305. global attributes_dict
  306. attributes_dict = {}
  307. API.update_attributes_box_gui()
  308. @staticmethod
  309. def del_attributes():
  310. del attributes_dict[list(attributes_dict.keys())[API.get_attributes_box_index_gui()]]
  311. API.update_attributes_box_gui()
  312. @staticmethod
  313. def add_attributes():
  314. try:
  315. name, value = API.add_attributes_gui()
  316. except BaseException:
  317. return False
  318. attributes_dict[name] = value
  319. API.update_attributes_box_gui()
  320. @staticmethod
  321. def third_add_action_func(func):
  322. args = API.third_func_args_gui()
  323. func = {
  324. "make_ActionChains": page_parser.make_action_chains,
  325. "click": page_parser.action_click,
  326. "double_click": page_parser.action_double_click,
  327. "click_right": page_parser.action_click_right,
  328. "click_and_hold": page_parser.action_click_and_hold,
  329. "release": page_parser.action_release,
  330. "drag_and_drop": page_parser.action_drag_and_drop,
  331. "move": page_parser.action_move,
  332. "key_down": page_parser.action_key_down,
  333. "key_up": page_parser.action_key_up,
  334. "send_keys_to_element": page_parser.action_send_keys_to_element,
  335. "send_keys": page_parser.action_send_keys,
  336. "ActionChains_run": page_parser.action_run,
  337. }.get(func, page_parser.make_action_chains)
  338. func(**args)
  339. API.update_parser_func_box_gui()
  340. @staticmethod
  341. def second_add_action_func(func):
  342. args = API.second_func_args_gui()
  343. func = {
  344. "del_all_cookies": page_parser.del_all_cookies,
  345. "del_cookies": page_parser.del_cookies,
  346. "add_cookies": page_parser.add_cookies,
  347. "update_cookies": page_parser.update_cookies,
  348. "get_cookies": page_parser.get_cookies,
  349. "get_all_cookies": page_parser.get_all_cookies,
  350. "make_bs": page_parser.make_bs,
  351. "findAll": page_parser.findall,
  352. "findAll_by_text": page_parser.findall_by_text,
  353. "get_children": page_parser.get_children,
  354. "get_offspring": page_parser.get_offspring,
  355. "get_up": page_parser.get_up,
  356. "get_down": page_parser.get_down,
  357. "get_by_path": page_parser.get_by_path,
  358. "brothers": page_parser.get_brothers,
  359. "png": page_parser.webpage_snapshot,
  360. "to_json": page_parser.to_json,
  361. }.get(func, page_parser.make_bs)
  362. func(**args)
  363. API.update_parser_func_box_gui()
  364. @staticmethod
  365. def first_add_action_func(func):
  366. args = API.first_func_args_gui()
  367. func = {
  368. "send_keys": page_parser.send_keys,
  369. "clear": page_parser.clear,
  370. "click": page_parser.click,
  371. "User_Passwd": page_parser.authentication,
  372. "accept": page_parser.accept,
  373. "dismiss": page_parser.dismiss,
  374. "submit": page_parser.submit,
  375. "deselect_by_index": page_parser.deselect_by_index,
  376. "deselect_by_value": page_parser.deselect_by_value,
  377. "deselect_by_text": page_parser.deselect_by_text,
  378. "select_by_index": page_parser.select_by_index,
  379. "select_by_value": page_parser.select_by_value,
  380. "select_by_text": page_parser.select_by_text,
  381. "back": page_parser.back,
  382. "forward": page_parser.forward,
  383. "refresh": page_parser.refresh,
  384. "wait_sleep": page_parser.wait_sleep,
  385. "set_wait": page_parser.set_wait,
  386. "run_JS": page_parser.run_js,
  387. "out": page_parser.out_html,
  388. "get_Page": page_parser.to_text,
  389. "get_all_windows": page_parser.get_all_windows,
  390. "get_now_windows": page_parser.get_now_windows,
  391. "switch_to_windwos": page_parser.switch_to_windwos,
  392. }.get(func, page_parser.send_keys)
  393. func(**args)
  394. API.update_parser_func_box_gui()
  395. @staticmethod
  396. def add_frame_func_father(is_main=True):
  397. search = None if is_main else ""
  398. page_parser.find_switch_to_frame(search, True)
  399. API.update_parser_func_box_gui()
  400. @staticmethod
  401. def add_frame_func_id():
  402. search = API.get_search_key()
  403. page_parser.find_switch_to_frame(search, True)
  404. API.update_parser_func_box_gui()
  405. @staticmethod
  406. def add_find_func(func):
  407. not_all = not (bool(search_all.get()))
  408. search = API.get_search_key()
  409. func = {
  410. "id": page_parser.find_id,
  411. "name": page_parser.find_name,
  412. "class": page_parser.find_class,
  413. "xpath": page_parser.find_xpath,
  414. "css": page_parser.find_css,
  415. "tag": page_parser.find_tag_name,
  416. "link": page_parser.find_link_text,
  417. "partial_link": page_parser.find_partial_link_text,
  418. "alert": page_parser.find_switch_to_alert,
  419. "active_element": page_parser.find_switch_to_active_element,
  420. "frame": page_parser.find_switch_to_frame,
  421. }.get(func, page_parser.find_id)
  422. func(search, not_all=not_all)
  423. API.update_parser_func_box_gui()
  424. @staticmethod
  425. def get_search_key():
  426. search = search_key.get()
  427. return search
  428. @staticmethod
  429. def del_parser_func():
  430. try:
  431. index = API.get_parser_func_box_index_gui()
  432. page_parser.del_func(index, True)
  433. API.update_parser_func_box_gui()
  434. except BaseException:
  435. pass
  436. @staticmethod
  437. def clean_parser_func():
  438. try:
  439. page_parser.tra_func()
  440. API.update_parser_func_box_gui()
  441. except BaseException:
  442. pass
  443. @staticmethod
  444. def update_cookies():
  445. cookies = API.get_new_cookies_gui()
  446. if API.get_cookies_fix_gui():
  447. return False
  448. try:
  449. name = cookies_list[API.get_cookies_box_index_gui()].get("name")
  450. loader.monitoring_update_cookies(name, cookies)
  451. API.set_cookies_fix()
  452. except BaseException:
  453. pass
  454. @staticmethod
  455. def add_cookies():
  456. cookies = API.get_new_cookies_gui()
  457. if API.get_cookies_fix_gui():
  458. return False
  459. try:
  460. loader.monitoring_add_cookies(cookies)
  461. API.set_cookies_fix()
  462. except BaseException:
  463. raise
  464. @staticmethod
  465. def clean_cookies():
  466. if API.get_cookies_fix_gui():
  467. return False
  468. try:
  469. loader.monitoring_clear_cookier()
  470. API.set_cookies_fix()
  471. except BaseException:
  472. pass
  473. @staticmethod
  474. def set_cookies_fix(fix=0):
  475. cookies_fixed.set(fix)
  476. @staticmethod
  477. def del_cookies():
  478. if API.get_cookies_fix_gui():
  479. return False
  480. try:
  481. name = cookies_list[API.get_cookies_box_index_gui()].get("name")
  482. loader.monitoring_del_cookies(name)
  483. API.set_cookies_fix()
  484. except BaseException:
  485. pass
  486. @staticmethod
  487. def crawler_stop():
  488. global start_loader_stop
  489. start_loader_stop = False
  490. loader.stop()
  491. @staticmethod
  492. def crawler_run():
  493. def start_loader():
  494. global start_loader_stop
  495. start_loader_stop = True
  496. loader.stop() # 把之前的停止
  497. while start_loader_stop:
  498. if url.is_finish():
  499. break
  500. loader.start_to_run(func_cookie=API.update_cookies_box_gui)
  501. API.update_url_box_gui()
  502. page_parser.element_interaction(API.update_run_status_gui)
  503. loader.stop()
  504. new = threading.Thread(target=start_loader)
  505. new.start()
  506. API.update_url_box_gui()
  507. @staticmethod
  508. def crawler_run_one():
  509. def start_loader():
  510. global loader, page_parser
  511. if url.is_finish():
  512. return
  513. loader.start_to_run(func_cookie=API.update_cookies_box_gui)
  514. API.update_url_box_gui()
  515. page_parser.element_interaction(API.update_run_status_gui)
  516. loader.stop()
  517. new = threading.Thread(target=start_loader)
  518. new.start()
  519. @staticmethod
  520. def add_filter_func_https():
  521. url.add_filter_func(lambda url: re.match(re.compile("^https://"), url), "HTTPS过滤")
  522. API.update_filter_func_box_gui()
  523. @staticmethod
  524. def add_filter_func_www():
  525. url.add_filter_func(lambda url: re.match(re.compile(r".*www\."), url), "www过滤")
  526. API.update_filter_func_box_gui()
  527. @staticmethod
  528. def del_filter_func():
  529. index = API.get_filter_func_box_index_gui()
  530. url.del_filter_func(index)
  531. API.update_filter_func_box_gui()
  532. @staticmethod
  533. def del_url():
  534. index = API.get_url_box_index_gui()
  535. url.del_url(index)
  536. API.update_url_box_gui()
  537. @staticmethod
  538. def add_url():
  539. args = API.get_url_parameter_gui()
  540. new_url = API.get_new_url_name_gui()
  541. if new_url == "":
  542. return
  543. url.add_url(new_url, **args)
  544. API.update_url_box_gui()
  545. @staticmethod
  546. def add_url_from_tag():
  547. page_parser.add_url(**API.add_url_from_tag_gui())
  548. API.update_parser_func_box_gui()
  549. def crawler_main():
  550. global SCREEN
  551. SCREEN.mainloop()
  552. loader.stop()
  553. database.close_all()
  554. url.close()
  555. loader.close()
  556. SCREEN.title("CoTan自动化网页")
  557. SCREEN.resizable(width=False, height=False)
  558. SCREEN.geometry("+10+10") # 设置所在位置
  559. gui_width = 13 # 标准宽度
  560. gui_height = 2
  561. row = 0
  562. column = 0
  563. tkinter.Button(
  564. SCREEN,
  565. bg=buttom_bg_color,
  566. fg=word_color,
  567. text="添加url对象",
  568. command=API.add_url,
  569. font=FONT,
  570. width=gui_width,
  571. height=gui_height,
  572. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  573. tkinter.Button(
  574. SCREEN,
  575. bg=buttom_bg_color,
  576. fg=word_color,
  577. text="删除url对象",
  578. command=API.del_url,
  579. font=FONT,
  580. width=gui_width,
  581. height=gui_height,
  582. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  583. tkinter.Button(
  584. SCREEN,
  585. bg=buttom_bg_color,
  586. fg=word_color,
  587. text="应用过滤机制",
  588. font=FONT,
  589. width=gui_width,
  590. height=gui_height,
  591. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  592. row += 1
  593. tkinter.Label(
  594. SCREEN,
  595. text="添加url:",
  596. bg=bg_color,
  597. fg=word_color,
  598. font=FONT,
  599. width=gui_width,
  600. height=gui_height,
  601. ).grid(column=column, row=row)
  602. url_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  603. url_input.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  604. row += 1
  605. url_parameter = []
  606. lable = ["不加载js", "不加载java", "不加载插件"] # 复选框
  607. for i in range(3):
  608. url_parameter.append(tkinter.IntVar())
  609. tkinter.Checkbutton(
  610. SCREEN,
  611. bg=bg_color,
  612. fg=word_color,
  613. activebackground=bg_color,
  614. activeforeground=word_color,
  615. selectcolor=bg_color,
  616. text=lable[i],
  617. variable=url_parameter[-1],
  618. ).grid(column=column + i, row=row, sticky=tkinter.W)
  619. row += 1
  620. lable = ["第一次启动", "隐藏网页", "不加载图片"] # 复选框
  621. for i in range(3):
  622. url_parameter.append(tkinter.IntVar())
  623. tkinter.Checkbutton(
  624. SCREEN,
  625. bg=bg_color,
  626. fg=word_color,
  627. activebackground=bg_color,
  628. activeforeground=word_color,
  629. selectcolor=bg_color,
  630. text=lable[i],
  631. variable=url_parameter[-1],
  632. ).grid(column=column + i, row=row, sticky=tkinter.W)
  633. row += 1
  634. tkinter.Label(
  635. SCREEN,
  636. text="UA设置:",
  637. bg=bg_color,
  638. fg=word_color,
  639. font=FONT,
  640. width=gui_width,
  641. height=gui_height,
  642. ).grid(column=column, row=row)
  643. user_agent_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  644. user_agent_input.grid(
  645. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  646. )
  647. row += 1
  648. tkinter.Label(
  649. SCREEN,
  650. text="DATA:",
  651. bg=bg_color,
  652. fg=word_color,
  653. font=FONT,
  654. width=gui_width,
  655. height=gui_height,
  656. ).grid(column=column, row=row)
  657. requests_data = tkinter.Entry(SCREEN, width=gui_width * 2)
  658. requests_data.grid(
  659. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  660. )
  661. row += 1
  662. tkinter.Label(
  663. SCREEN,
  664. text="请求方式:",
  665. bg=bg_color,
  666. fg=word_color,
  667. font=FONT,
  668. width=gui_width,
  669. height=gui_height,
  670. ).grid(column=column, row=row)
  671. mode_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  672. mode_input.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  673. row += 1
  674. tkinter.Label(
  675. SCREEN,
  676. text="请求超时:",
  677. bg=bg_color,
  678. fg=word_color,
  679. font=FONT,
  680. width=gui_width,
  681. height=gui_height,
  682. ).grid(column=column, row=row)
  683. time_out = tkinter.Entry(SCREEN, width=gui_width * 2)
  684. time_out.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  685. row += 1
  686. tkinter.Label(
  687. SCREEN,
  688. text="Cookies:",
  689. bg=bg_color,
  690. fg=word_color,
  691. font=FONT,
  692. width=gui_width,
  693. height=gui_height,
  694. ).grid(column=column, row=row)
  695. applied_cookies = tkinter.Entry(SCREEN, width=gui_width)
  696. applied_cookies.grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  697. url_parameter.append(tkinter.IntVar())
  698. tkinter.Checkbutton(
  699. SCREEN,
  700. bg=bg_color,
  701. fg=word_color,
  702. activebackground=bg_color,
  703. activeforeground=word_color,
  704. selectcolor=bg_color,
  705. text="新启动网页",
  706. variable=url_parameter[-1],
  707. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  708. row += 1
  709. url_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 4)
  710. url_box.grid(
  711. column=column,
  712. row=row,
  713. columnspan=3,
  714. rowspan=4,
  715. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  716. )
  717. row += 4
  718. tkinter.Button(
  719. SCREEN,
  720. bg=buttom_bg_color,
  721. fg=word_color,
  722. text="HTTPS过滤器",
  723. command=API.add_filter_func_https,
  724. font=FONT,
  725. width=gui_width,
  726. height=gui_height,
  727. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  728. tkinter.Button(
  729. SCREEN,
  730. bg=buttom_bg_color,
  731. fg=word_color,
  732. text="WWW过滤器",
  733. command=API.add_filter_func_www,
  734. font=FONT,
  735. width=gui_width,
  736. height=gui_height,
  737. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  738. tkinter.Button(
  739. SCREEN,
  740. bg=buttom_bg_color,
  741. fg=word_color,
  742. text="删除过滤器",
  743. command=API.del_filter_func,
  744. font=FONT,
  745. width=gui_width,
  746. height=gui_height,
  747. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  748. row += 1
  749. tkinter.Button(
  750. SCREEN,
  751. bg=buttom_bg_color,
  752. fg=word_color,
  753. text="自定义过滤器",
  754. command=API.add_filter_func_https,
  755. font=FONT,
  756. width=gui_width,
  757. height=gui_height,
  758. ).grid(column=column, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  759. tkinter.Button(
  760. SCREEN,
  761. bg=buttom_bg_color,
  762. fg=word_color,
  763. text="清空过滤器",
  764. font=FONT,
  765. width=gui_width,
  766. height=gui_height,
  767. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  768. row += 1
  769. filter_func_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  770. filter_func_box.grid(
  771. column=column,
  772. row=row,
  773. columnspan=3,
  774. rowspan=3,
  775. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  776. )
  777. row += 3
  778. tkinter.Button(
  779. SCREEN,
  780. bg=buttom_bg_color,
  781. fg=word_color,
  782. text="单点爬虫运行",
  783. command=API.crawler_run_one,
  784. font=FONT,
  785. width=gui_width,
  786. height=gui_height,
  787. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  788. tkinter.Button(
  789. SCREEN,
  790. bg=buttom_bg_color,
  791. fg=word_color,
  792. text="爬虫运行",
  793. command=API.crawler_run,
  794. font=FONT,
  795. width=gui_width,
  796. height=gui_height,
  797. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  798. tkinter.Button(
  799. SCREEN,
  800. bg=buttom_bg_color,
  801. fg=word_color,
  802. text="单点爬虫停止",
  803. command=API.crawler_stop,
  804. font=FONT,
  805. width=gui_width,
  806. height=gui_height,
  807. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  808. row += 1
  809. cookies_fixed = tkinter.IntVar()
  810. tkinter.Label(
  811. SCREEN,
  812. text="【曲奇监视】",
  813. bg=bg_color,
  814. fg=word_color,
  815. font=FONT,
  816. width=gui_width,
  817. height=gui_height,
  818. ).grid(
  819. column=column + 1,
  820. row=row,
  821. sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N,
  822. ) # 设置说明
  823. tkinter.Checkbutton(
  824. SCREEN,
  825. bg=bg_color,
  826. fg=word_color,
  827. activebackground=bg_color,
  828. activeforeground=word_color,
  829. selectcolor=bg_color,
  830. text="固定曲奇",
  831. variable=cookies_fixed,
  832. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  833. cookies_fixed.set("0")
  834. row += 1
  835. cookies_BOX = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  836. cookies_BOX.grid(
  837. column=column,
  838. row=row,
  839. columnspan=3,
  840. rowspan=3,
  841. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  842. )
  843. row += 3
  844. tkinter.Button(
  845. SCREEN,
  846. bg=buttom_bg_color,
  847. fg=word_color,
  848. text="清空曲奇",
  849. command=API.clean_cookies,
  850. font=FONT,
  851. width=gui_width,
  852. height=gui_height,
  853. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  854. tkinter.Button(
  855. SCREEN,
  856. bg=buttom_bg_color,
  857. fg=word_color,
  858. text="更新曲奇",
  859. command=API.update_cookies,
  860. font=FONT,
  861. width=gui_width,
  862. height=gui_height,
  863. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  864. tkinter.Button(
  865. SCREEN,
  866. bg=buttom_bg_color,
  867. fg=word_color,
  868. text="删除曲奇",
  869. command=API.del_cookies,
  870. font=FONT,
  871. width=gui_width,
  872. height=gui_height,
  873. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  874. row += 1
  875. new_cookies = tkinter.Entry(SCREEN, width=gui_width * 3)
  876. new_cookies.grid(column=column, row=row, columnspan=3, sticky=tkinter.E + tkinter.W)
  877. tkinter.Button(
  878. SCREEN,
  879. bg=buttom_bg_color,
  880. fg=word_color,
  881. text="添加曲奇",
  882. command=API.add_cookies,
  883. font=FONT,
  884. width=gui_width,
  885. height=gui_height,
  886. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  887. column += 3
  888. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  889. column=column, row=row
  890. ) # 设置说明
  891. column += 1
  892. row = 0
  893. tkinter.Button(
  894. SCREEN,
  895. bg=buttom_bg_color,
  896. fg=word_color,
  897. text="根据id搜查",
  898. command=lambda: API.add_find_func("id"),
  899. font=FONT,
  900. width=gui_width,
  901. height=gui_height,
  902. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  903. tkinter.Button(
  904. SCREEN,
  905. bg=buttom_bg_color,
  906. fg=word_color,
  907. text="根据name搜查",
  908. command=lambda: API.add_find_func("name"),
  909. font=FONT,
  910. width=gui_width,
  911. height=gui_height,
  912. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  913. tkinter.Button(
  914. SCREEN,
  915. bg=buttom_bg_color,
  916. fg=word_color,
  917. text="根据class搜查",
  918. command=lambda: API.add_find_func("class"),
  919. font=FONT,
  920. width=gui_width,
  921. height=gui_height,
  922. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  923. row += 1
  924. tkinter.Button(
  925. SCREEN,
  926. bg=buttom_bg_color,
  927. fg=word_color,
  928. text="根据xpath搜查",
  929. command=lambda: API.add_find_func("xpath"),
  930. font=FONT,
  931. width=gui_width,
  932. height=gui_height,
  933. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  934. tkinter.Button(
  935. SCREEN,
  936. bg=buttom_bg_color,
  937. fg=word_color,
  938. text="根据css搜查",
  939. command=lambda: API.add_find_func("css"),
  940. font=FONT,
  941. width=gui_width,
  942. height=gui_height,
  943. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  944. tkinter.Button(
  945. SCREEN,
  946. bg=buttom_bg_color,
  947. fg=word_color,
  948. text="根据元素名搜查",
  949. command=lambda: API.add_find_func("tag"),
  950. font=FONT,
  951. width=gui_width,
  952. height=gui_height,
  953. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  954. row += 1
  955. search_all = tkinter.Variable()
  956. tkinter.Button(
  957. SCREEN,
  958. bg=buttom_bg_color,
  959. fg=word_color,
  960. text="根据link搜查",
  961. command=lambda: API.add_find_func("link"),
  962. font=FONT,
  963. width=gui_width,
  964. height=gui_height,
  965. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  966. tkinter.Button(
  967. SCREEN,
  968. bg=buttom_bg_color,
  969. fg=word_color,
  970. text="link模糊搜查",
  971. command=lambda: API.add_find_func("partial_link"),
  972. font=FONT,
  973. width=gui_width,
  974. height=gui_height,
  975. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  976. tkinter.Checkbutton(
  977. SCREEN,
  978. bg=bg_color,
  979. fg=word_color,
  980. activebackground=bg_color,
  981. activeforeground=word_color,
  982. selectcolor=bg_color,
  983. text="匹配全部",
  984. variable=search_all,
  985. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  986. search_all.set("0")
  987. row += 1
  988. tkinter.Label(
  989. SCREEN,
  990. text="搜查参数:",
  991. bg=bg_color,
  992. fg=word_color,
  993. font=FONT,
  994. width=gui_width,
  995. height=gui_height,
  996. ).grid(column=column, row=row)
  997. search_key = tkinter.Entry(SCREEN, width=gui_width * 2)
  998. search_key.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  999. row += 1
  1000. tkinter.Button(
  1001. SCREEN,
  1002. bg=buttom_bg_color,
  1003. fg=word_color,
  1004. text="删除方法",
  1005. command=API.del_parser_func,
  1006. font=FONT,
  1007. width=gui_width,
  1008. height=gui_height,
  1009. ).grid(column=column, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1010. tkinter.Button(
  1011. SCREEN,
  1012. bg=buttom_bg_color,
  1013. fg=word_color,
  1014. text="清空方法",
  1015. command=API.clean_parser_func,
  1016. font=FONT,
  1017. width=gui_width,
  1018. height=gui_height,
  1019. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1020. row += 1
  1021. parser_func_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1022. parser_func_box.grid(
  1023. column=column,
  1024. row=row,
  1025. columnspan=3,
  1026. rowspan=5,
  1027. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1028. )
  1029. row += 5
  1030. tkinter.Label(
  1031. SCREEN,
  1032. text="操作元素:",
  1033. bg=bg_color,
  1034. fg=word_color,
  1035. font=FONT,
  1036. width=gui_width,
  1037. height=gui_height,
  1038. ).grid(column=column, row=row)
  1039. operation_object = tkinter.Entry(SCREEN, width=gui_width * 2)
  1040. operation_object.grid(
  1041. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1042. )
  1043. row += 1
  1044. tkinter.Label(
  1045. SCREEN,
  1046. text="操作索引:",
  1047. bg=bg_color,
  1048. fg=word_color,
  1049. font=FONT,
  1050. width=gui_width,
  1051. height=gui_height,
  1052. ).grid(column=column, row=row)
  1053. object_index = tkinter.Entry(SCREEN, width=gui_width * 2)
  1054. object_index.grid(
  1055. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1056. )
  1057. row += 1
  1058. tkinter.Label(
  1059. SCREEN,
  1060. text="发送信息:",
  1061. bg=bg_color,
  1062. fg=word_color,
  1063. font=FONT,
  1064. width=gui_width,
  1065. height=gui_height,
  1066. ).grid(column=column, row=row)
  1067. send_text = tkinter.Entry(SCREEN, width=gui_width * 2)
  1068. send_text.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1069. row += 1
  1070. tkinter.Label(
  1071. SCREEN,
  1072. text="认证用户名:",
  1073. bg=bg_color,
  1074. fg=word_color,
  1075. font=FONT,
  1076. width=gui_width,
  1077. height=gui_height,
  1078. ).grid(column=column, row=row)
  1079. username_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  1080. username_input.grid(
  1081. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1082. )
  1083. row += 1
  1084. tkinter.Label(
  1085. SCREEN,
  1086. text="认证密码:",
  1087. bg=bg_color,
  1088. fg=word_color,
  1089. font=FONT,
  1090. width=gui_width,
  1091. height=gui_height,
  1092. ).grid(column=column, row=row)
  1093. password = tkinter.Entry(SCREEN, width=gui_width * 2)
  1094. password.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1095. row += 1
  1096. tkinter.Label(
  1097. SCREEN,
  1098. text="选择参数:",
  1099. bg=bg_color,
  1100. fg=word_color,
  1101. font=FONT,
  1102. width=gui_width,
  1103. height=gui_height,
  1104. ).grid(column=column, row=row)
  1105. select_object = tkinter.Entry(SCREEN, width=gui_width * 2)
  1106. select_object.grid(
  1107. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1108. )
  1109. row += 1
  1110. tkinter.Label(
  1111. SCREEN,
  1112. text="等待时间:",
  1113. bg=bg_color,
  1114. fg=word_color,
  1115. font=FONT,
  1116. width=gui_width,
  1117. height=gui_height,
  1118. ).grid(column=column, row=row)
  1119. wait_time = tkinter.Entry(SCREEN, width=gui_width * 2)
  1120. wait_time.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1121. row += 1
  1122. tkinter.Label(
  1123. SCREEN,
  1124. text="JavaScript:",
  1125. bg=bg_color,
  1126. fg=word_color,
  1127. font=FONT,
  1128. width=gui_width,
  1129. height=gui_height,
  1130. ).grid(column=column, row=row)
  1131. js_code = tkinter.Entry(SCREEN, width=gui_width * 2)
  1132. js_code.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1133. row += 1
  1134. tkinter.Button(
  1135. SCREEN,
  1136. bg=buttom_bg_color,
  1137. fg=word_color,
  1138. text="发送字符",
  1139. command=lambda: API.first_add_action_func("send_keys"),
  1140. font=FONT,
  1141. width=gui_width,
  1142. height=gui_height,
  1143. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1144. tkinter.Button(
  1145. SCREEN,
  1146. bg=buttom_bg_color,
  1147. fg=word_color,
  1148. text="清空字符",
  1149. command=lambda: API.first_add_action_func("clear"),
  1150. font=FONT,
  1151. width=gui_width,
  1152. height=gui_height,
  1153. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1154. tkinter.Button(
  1155. SCREEN,
  1156. bg=buttom_bg_color,
  1157. fg=word_color,
  1158. text="提交表单",
  1159. command=lambda: API.first_add_action_func("submit"),
  1160. font=FONT,
  1161. width=gui_width,
  1162. height=gui_height,
  1163. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1164. row += 1
  1165. tkinter.Button(
  1166. SCREEN,
  1167. bg=buttom_bg_color,
  1168. fg=word_color,
  1169. text="点击按钮",
  1170. command=lambda: API.first_add_action_func("click"),
  1171. font=FONT,
  1172. width=gui_width,
  1173. height=gui_height,
  1174. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1175. tkinter.Button(
  1176. SCREEN,
  1177. bg=buttom_bg_color,
  1178. fg=word_color,
  1179. text="取得源代码",
  1180. command=lambda: API.first_add_action_func("get_Page"),
  1181. font=FONT,
  1182. width=gui_width,
  1183. height=gui_height,
  1184. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1185. tkinter.Button(
  1186. SCREEN,
  1187. bg=buttom_bg_color,
  1188. fg=word_color,
  1189. text="输出HTML",
  1190. command=lambda: API.first_add_action_func("out"),
  1191. font=FONT,
  1192. width=gui_width,
  1193. height=gui_height,
  1194. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1195. row += 1
  1196. tkinter.Button(
  1197. SCREEN,
  1198. bg=buttom_bg_color,
  1199. fg=word_color,
  1200. text="切换Frame(id)",
  1201. command=API.add_frame_func_id,
  1202. font=FONT,
  1203. width=gui_width,
  1204. height=gui_height,
  1205. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1206. tkinter.Button(
  1207. SCREEN,
  1208. bg=buttom_bg_color,
  1209. fg=word_color,
  1210. text="切换Frame",
  1211. command=lambda: API.add_find_func("frame"),
  1212. font=FONT,
  1213. width=gui_width,
  1214. height=gui_height,
  1215. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1216. tkinter.Button(
  1217. SCREEN,
  1218. bg=buttom_bg_color,
  1219. fg=word_color,
  1220. text="定位焦点元素",
  1221. command=lambda: API.add_find_func("active_element"),
  1222. font=FONT,
  1223. width=gui_width,
  1224. height=gui_height,
  1225. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1226. row += 1
  1227. tkinter.Button(
  1228. SCREEN,
  1229. bg=buttom_bg_color,
  1230. fg=word_color,
  1231. text="捕获弹窗",
  1232. command=lambda: API.add_find_func("alert"),
  1233. font=FONT,
  1234. width=gui_width,
  1235. height=gui_height,
  1236. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1237. tkinter.Button(
  1238. SCREEN,
  1239. bg=buttom_bg_color,
  1240. fg=word_color,
  1241. text="回到主Frame",
  1242. command=lambda: API.add_frame_func_father(False),
  1243. font=FONT,
  1244. width=gui_width,
  1245. height=gui_height,
  1246. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1247. tkinter.Button(
  1248. SCREEN,
  1249. bg=buttom_bg_color,
  1250. fg=word_color,
  1251. text="回到父Frame",
  1252. command=lambda: API.add_frame_func_father(True),
  1253. font=FONT,
  1254. width=gui_width,
  1255. height=gui_height,
  1256. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1257. row += 1
  1258. tkinter.Button(
  1259. SCREEN,
  1260. bg=buttom_bg_color,
  1261. fg=word_color,
  1262. text="弹出框认证",
  1263. command=lambda: API.first_add_action_func("User_Passwd"),
  1264. font=FONT,
  1265. width=gui_width,
  1266. height=gui_height,
  1267. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1268. tkinter.Button(
  1269. SCREEN,
  1270. bg=buttom_bg_color,
  1271. fg=word_color,
  1272. text="弹出框确定",
  1273. command=lambda: API.first_add_action_func("accept"),
  1274. font=FONT,
  1275. width=gui_width,
  1276. height=gui_height,
  1277. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1278. tkinter.Button(
  1279. SCREEN,
  1280. bg=buttom_bg_color,
  1281. fg=word_color,
  1282. text="弹出框取消",
  1283. command=lambda: API.first_add_action_func("dismiss"),
  1284. font=FONT,
  1285. width=gui_width,
  1286. height=gui_height,
  1287. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1288. row += 1
  1289. tkinter.Button(
  1290. SCREEN,
  1291. bg=buttom_bg_color,
  1292. fg=word_color,
  1293. text="取消选择index",
  1294. command=lambda: API.first_add_action_func("deselect_by_index"),
  1295. font=FONT,
  1296. width=gui_width,
  1297. height=gui_height,
  1298. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1299. tkinter.Button(
  1300. SCREEN,
  1301. bg=buttom_bg_color,
  1302. fg=word_color,
  1303. text="取消选择text",
  1304. command=lambda: API.first_add_action_func("deselect_by_text"),
  1305. font=FONT,
  1306. width=gui_width,
  1307. height=gui_height,
  1308. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1309. tkinter.Button(
  1310. SCREEN,
  1311. bg=buttom_bg_color,
  1312. fg=word_color,
  1313. text="取消选择value",
  1314. command=lambda: API.first_add_action_func("deselect_by_value"),
  1315. font=FONT,
  1316. width=gui_width,
  1317. height=gui_height,
  1318. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1319. row += 1
  1320. tkinter.Button(
  1321. SCREEN,
  1322. bg=buttom_bg_color,
  1323. fg=word_color,
  1324. text="选择index",
  1325. command=lambda: API.first_add_action_func("select_by_index"),
  1326. font=FONT,
  1327. width=gui_width,
  1328. height=gui_height,
  1329. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1330. tkinter.Button(
  1331. SCREEN,
  1332. bg=buttom_bg_color,
  1333. fg=word_color,
  1334. text="选择text",
  1335. command=lambda: API.first_add_action_func("select_by_text"),
  1336. font=FONT,
  1337. width=gui_width,
  1338. height=gui_height,
  1339. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1340. tkinter.Button(
  1341. SCREEN,
  1342. bg=buttom_bg_color,
  1343. fg=word_color,
  1344. text="选择value",
  1345. command=lambda: API.first_add_action_func("select_by_value"),
  1346. font=FONT,
  1347. width=gui_width,
  1348. height=gui_height,
  1349. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1350. column += 3
  1351. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  1352. column=column, row=row
  1353. ) # 设置说明
  1354. column += 1
  1355. row = 0
  1356. now_running = tkinter.StringVar()
  1357. status_output = tkinter.StringVar()
  1358. tkinter.Label(
  1359. SCREEN,
  1360. text="正在执行:",
  1361. bg=bg_color,
  1362. fg=word_color,
  1363. font=FONT,
  1364. width=gui_width,
  1365. height=gui_height,
  1366. ).grid(column=column, row=row)
  1367. tkinter.Entry(
  1368. SCREEN, width=gui_width * 2, state=tkinter.DISABLED, textvariable=now_running
  1369. ).grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1370. row += 1
  1371. tkinter.Label(
  1372. SCREEN,
  1373. text="上一次状态:",
  1374. bg=bg_color,
  1375. fg=word_color,
  1376. font=FONT,
  1377. width=gui_width,
  1378. height=gui_height,
  1379. ).grid(column=column, row=row)
  1380. tkinter.Entry(
  1381. SCREEN, width=gui_width * 2, state=tkinter.DISABLED, textvariable=status_output
  1382. ).grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1383. row += 1
  1384. variable_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1385. variable_box.grid(
  1386. column=column,
  1387. row=row,
  1388. columnspan=3,
  1389. rowspan=5,
  1390. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1391. )
  1392. row += 5
  1393. tkinter.Label(
  1394. SCREEN,
  1395. text="cookies名:",
  1396. bg=bg_color,
  1397. fg=word_color,
  1398. font=FONT,
  1399. width=gui_width,
  1400. height=gui_height,
  1401. ).grid(column=column, row=row)
  1402. cookies_name_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  1403. cookies_name_input.grid(
  1404. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1405. )
  1406. row += 1
  1407. tkinter.Label(
  1408. SCREEN,
  1409. text="cookies:",
  1410. bg=bg_color,
  1411. fg=word_color,
  1412. font=FONT,
  1413. width=gui_width,
  1414. height=gui_height,
  1415. ).grid(column=column, row=row)
  1416. new_cookies = tkinter.Entry(SCREEN, width=gui_width * 2)
  1417. new_cookies.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1418. row += 1
  1419. tkinter.Label(
  1420. SCREEN,
  1421. text="定位标签:",
  1422. bg=bg_color,
  1423. fg=word_color,
  1424. font=FONT,
  1425. width=gui_width,
  1426. height=gui_height,
  1427. ).grid(column=column, row=row)
  1428. element_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1429. element_name.grid(
  1430. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1431. )
  1432. row += 1
  1433. tkinter.Label(
  1434. SCREEN,
  1435. text="定位属性名:",
  1436. bg=bg_color,
  1437. fg=word_color,
  1438. font=FONT,
  1439. width=gui_width,
  1440. height=gui_height,
  1441. ).grid(column=column, row=row)
  1442. attributes_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1443. attributes_name.grid(
  1444. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1445. )
  1446. attribute_regex = tkinter.IntVar()
  1447. row += 1
  1448. tkinter.Label(
  1449. SCREEN,
  1450. text="定位属性值:",
  1451. bg=bg_color,
  1452. fg=word_color,
  1453. font=FONT,
  1454. width=gui_width,
  1455. height=gui_height,
  1456. ).grid(column=column, row=row)
  1457. attributes_value = tkinter.Entry(SCREEN, width=gui_width)
  1458. attributes_value.grid(
  1459. column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W
  1460. )
  1461. row += 1
  1462. tkinter.Button(
  1463. SCREEN,
  1464. bg=buttom_bg_color,
  1465. fg=word_color,
  1466. text="添加属性",
  1467. command=API.add_attributes,
  1468. font=FONT,
  1469. width=gui_width,
  1470. height=gui_height,
  1471. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1472. tkinter.Button(
  1473. SCREEN,
  1474. bg=buttom_bg_color,
  1475. fg=word_color,
  1476. text="删除属性",
  1477. command=API.del_attributes,
  1478. font=FONT,
  1479. width=gui_width,
  1480. height=gui_height,
  1481. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1482. tkinter.Button(
  1483. SCREEN,
  1484. bg=buttom_bg_color,
  1485. fg=word_color,
  1486. text="清空属性",
  1487. command=API.clean_attributes,
  1488. font=FONT,
  1489. width=gui_width,
  1490. height=gui_height,
  1491. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1492. row += 1
  1493. attributes_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  1494. attributes_box.grid(
  1495. column=column,
  1496. row=row,
  1497. columnspan=3,
  1498. rowspan=3,
  1499. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1500. )
  1501. row += 3
  1502. tkinter.Label(
  1503. SCREEN,
  1504. text="定位文本:",
  1505. bg=bg_color,
  1506. fg=word_color,
  1507. font=FONT,
  1508. width=gui_width,
  1509. height=gui_height,
  1510. ).grid(column=column, row=row)
  1511. find_text = tkinter.Entry(SCREEN, width=gui_width)
  1512. find_text.grid(column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W)
  1513. is_recursive = tkinter.IntVar()
  1514. text_regex = tkinter.IntVar()
  1515. row += 1
  1516. tkinter.Checkbutton(
  1517. SCREEN,
  1518. bg=bg_color,
  1519. fg=word_color,
  1520. activebackground=bg_color,
  1521. activeforeground=word_color,
  1522. selectcolor=bg_color,
  1523. text="递归查找",
  1524. variable=is_recursive,
  1525. ).grid(column=column, row=row, sticky=tkinter.W)
  1526. tkinter.Checkbutton(
  1527. SCREEN,
  1528. bg=bg_color,
  1529. fg=word_color,
  1530. activebackground=bg_color,
  1531. activeforeground=word_color,
  1532. selectcolor=bg_color,
  1533. text="文本使用正则",
  1534. variable=text_regex,
  1535. ).grid(column=column + 1, row=row, sticky=tkinter.W)
  1536. tkinter.Checkbutton(
  1537. SCREEN,
  1538. bg=bg_color,
  1539. fg=word_color,
  1540. activebackground=bg_color,
  1541. activeforeground=word_color,
  1542. selectcolor=bg_color,
  1543. text="属性值使用正则",
  1544. variable=attribute_regex,
  1545. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  1546. attribute_regex.set(1)
  1547. text_regex.set("1")
  1548. is_recursive.set("1")
  1549. row += 1
  1550. tkinter.Label(
  1551. SCREEN,
  1552. text="查找个数:",
  1553. bg=bg_color,
  1554. fg=word_color,
  1555. font=FONT,
  1556. width=gui_width,
  1557. height=gui_height,
  1558. ).grid(column=column, row=row)
  1559. limit = tkinter.Entry(SCREEN, width=gui_width * 2)
  1560. limit.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1561. row += 1
  1562. tkinter.Label(
  1563. SCREEN,
  1564. text="定位路径:",
  1565. bg=bg_color,
  1566. fg=word_color,
  1567. font=FONT,
  1568. width=gui_width,
  1569. height=gui_height,
  1570. ).grid(column=column, row=row)
  1571. find_path = tkinter.Entry(SCREEN, width=gui_width * 2)
  1572. find_path.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1573. row += 1
  1574. tkinter.Button(
  1575. SCREEN,
  1576. bg=buttom_bg_color,
  1577. fg=word_color,
  1578. text="删除所有曲奇",
  1579. command=lambda: API.second_add_action_func("del_all_cookies"),
  1580. font=FONT,
  1581. width=gui_width,
  1582. height=gui_height,
  1583. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1584. tkinter.Button(
  1585. SCREEN,
  1586. bg=buttom_bg_color,
  1587. fg=word_color,
  1588. text="删除指定曲奇",
  1589. command=lambda: API.second_add_action_func("del_cookies"),
  1590. font=FONT,
  1591. width=gui_width,
  1592. height=gui_height,
  1593. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1594. tkinter.Button(
  1595. SCREEN,
  1596. bg=buttom_bg_color,
  1597. fg=word_color,
  1598. text="添加新的曲奇",
  1599. command=lambda: API.second_add_action_func("add_cookies"),
  1600. font=FONT,
  1601. width=gui_width,
  1602. height=gui_height,
  1603. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1604. row += 1
  1605. tkinter.Button(
  1606. SCREEN,
  1607. bg=buttom_bg_color,
  1608. fg=word_color,
  1609. text="更新指定曲奇",
  1610. command=lambda: API.second_add_action_func("update_cookies"),
  1611. font=FONT,
  1612. width=gui_width,
  1613. height=gui_height,
  1614. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1615. tkinter.Button(
  1616. SCREEN,
  1617. bg=buttom_bg_color,
  1618. fg=word_color,
  1619. text="获得所有曲奇",
  1620. command=lambda: API.second_add_action_func("get_cookies"),
  1621. font=FONT,
  1622. width=gui_width,
  1623. height=gui_height,
  1624. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1625. tkinter.Button(
  1626. SCREEN,
  1627. bg=buttom_bg_color,
  1628. fg=word_color,
  1629. text="获得指定曲奇",
  1630. command=lambda: API.second_add_action_func("get_all_cookies"),
  1631. font=FONT,
  1632. width=gui_width,
  1633. height=gui_height,
  1634. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1635. row += 1
  1636. tkinter.Button(
  1637. SCREEN,
  1638. bg=buttom_bg_color,
  1639. fg=word_color,
  1640. text="解析网页",
  1641. command=lambda: API.second_add_action_func("make_bs"),
  1642. font=FONT,
  1643. width=gui_width,
  1644. height=gui_height,
  1645. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1646. tkinter.Button(
  1647. SCREEN,
  1648. bg=buttom_bg_color,
  1649. fg=word_color,
  1650. text="根据标签定位",
  1651. command=lambda: API.second_add_action_func("findAll"),
  1652. font=FONT,
  1653. width=gui_width,
  1654. height=gui_height,
  1655. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1656. tkinter.Button(
  1657. SCREEN,
  1658. bg=buttom_bg_color,
  1659. fg=word_color,
  1660. text="根据文本定位",
  1661. command=lambda: API.second_add_action_func("findAll_by_text"),
  1662. font=FONT,
  1663. width=gui_width,
  1664. height=gui_height,
  1665. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1666. row += 1
  1667. tkinter.Button(
  1668. SCREEN,
  1669. bg=buttom_bg_color,
  1670. fg=word_color,
  1671. text="获得子标签",
  1672. command=lambda: API.second_add_action_func("get_children"),
  1673. font=FONT,
  1674. width=gui_width,
  1675. height=gui_height,
  1676. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1677. tkinter.Button(
  1678. SCREEN,
  1679. bg=buttom_bg_color,
  1680. fg=word_color,
  1681. text="获得后代标签",
  1682. command=lambda: API.second_add_action_func("get_offspring"),
  1683. font=FONT,
  1684. width=gui_width,
  1685. height=gui_height,
  1686. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1687. tkinter.Button(
  1688. SCREEN,
  1689. bg=buttom_bg_color,
  1690. fg=word_color,
  1691. text="获得弟标签",
  1692. command=lambda: API.second_add_action_func("get_down"),
  1693. font=FONT,
  1694. width=gui_width,
  1695. height=gui_height,
  1696. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1697. row += 1
  1698. tkinter.Button(
  1699. SCREEN,
  1700. bg=buttom_bg_color,
  1701. fg=word_color,
  1702. text="获得兄标签",
  1703. command=lambda: API.second_add_action_func("get_up"),
  1704. font=FONT,
  1705. width=gui_width,
  1706. height=gui_height,
  1707. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1708. tkinter.Button(
  1709. SCREEN,
  1710. bg=buttom_bg_color,
  1711. fg=word_color,
  1712. text="获得兄弟标签",
  1713. command=lambda: API.second_add_action_func("brothers"),
  1714. font=FONT,
  1715. width=gui_width,
  1716. height=gui_height,
  1717. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1718. tkinter.Button(
  1719. SCREEN,
  1720. bg=buttom_bg_color,
  1721. fg=word_color,
  1722. text="路径定位",
  1723. command=lambda: API.second_add_action_func("get_by_path"),
  1724. font=FONT,
  1725. width=gui_width,
  1726. height=gui_height,
  1727. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1728. column += 3
  1729. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  1730. column=column, row=row
  1731. ) # 设置说明
  1732. column += 1
  1733. row = 0
  1734. tkinter.Label(SCREEN, text="【数据库操作】", bg=bg_color, fg=word_color, font=FONT).grid(
  1735. column=column, row=row, columnspan=3
  1736. ) # 设置说明
  1737. row += 1
  1738. tkinter.Button(
  1739. SCREEN,
  1740. bg=buttom_bg_color,
  1741. fg=word_color,
  1742. text="元素式存入",
  1743. command=lambda: API.to_database(True),
  1744. font=FONT,
  1745. width=gui_width,
  1746. height=gui_height,
  1747. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1748. tkinter.Button(
  1749. SCREEN,
  1750. bg=buttom_bg_color,
  1751. fg=word_color,
  1752. text="正则式存入",
  1753. command=lambda: API.to_database(False),
  1754. font=FONT,
  1755. width=gui_width,
  1756. height=gui_height,
  1757. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1758. tkinter.Button(
  1759. SCREEN,
  1760. bg=buttom_bg_color,
  1761. fg=word_color,
  1762. text="新增数据表",
  1763. command=API.add_database,
  1764. font=FONT,
  1765. width=gui_width,
  1766. height=gui_height,
  1767. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1768. row += 1
  1769. tkinter.Button(
  1770. SCREEN,
  1771. bg=buttom_bg_color,
  1772. fg=word_color,
  1773. text="删除数据表",
  1774. command=API.remove_database,
  1775. font=FONT,
  1776. width=gui_width,
  1777. height=gui_height,
  1778. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1779. tkinter.Button(
  1780. SCREEN,
  1781. bg=buttom_bg_color,
  1782. fg=word_color,
  1783. text="导出数据表",
  1784. command=API.out,
  1785. font=FONT,
  1786. width=gui_width,
  1787. height=gui_height,
  1788. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1789. tkinter.Button(
  1790. SCREEN,
  1791. bg=buttom_bg_color,
  1792. fg=word_color,
  1793. text="关闭数据表",
  1794. command=API.close,
  1795. font=FONT,
  1796. width=gui_width,
  1797. height=gui_height,
  1798. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1799. row += 1
  1800. tkinter.Label(
  1801. SCREEN,
  1802. text="数据存入格式:",
  1803. bg=bg_color,
  1804. fg=word_color,
  1805. font=FONT,
  1806. width=gui_width,
  1807. height=gui_height,
  1808. ).grid(column=column, row=row)
  1809. data_format = tkinter.Entry(SCREEN, width=gui_width * 2)
  1810. data_format.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1811. row += 1
  1812. tkinter.Label(
  1813. SCREEN,
  1814. text="数据表名字:",
  1815. bg=bg_color,
  1816. fg=word_color,
  1817. font=FONT,
  1818. width=gui_width,
  1819. height=gui_height,
  1820. ).grid(column=column, row=row)
  1821. database_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1822. database_name.grid(
  1823. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1824. )
  1825. row += 1
  1826. database_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1827. database_box.grid(
  1828. column=column,
  1829. row=row,
  1830. columnspan=3,
  1831. rowspan=5,
  1832. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1833. )
  1834. row += 5
  1835. tkinter.Label(
  1836. SCREEN,
  1837. text="URL标签:",
  1838. bg=bg_color,
  1839. fg=word_color,
  1840. font=FONT,
  1841. width=gui_width,
  1842. height=gui_height,
  1843. ).grid(column=column, row=row)
  1844. url_tag = tkinter.Entry(SCREEN, width=gui_width * 2)
  1845. url_tag.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1846. row += 1
  1847. tkinter.Button(
  1848. SCREEN,
  1849. bg=buttom_bg_color,
  1850. fg=word_color,
  1851. text="导出页面快照",
  1852. command=lambda: API.second_add_action_func("png"),
  1853. font=FONT,
  1854. width=gui_width,
  1855. height=gui_height,
  1856. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1857. tkinter.Button(
  1858. SCREEN,
  1859. bg=buttom_bg_color,
  1860. fg=word_color,
  1861. text="回调添加URL",
  1862. command=API.add_url_from_tag,
  1863. font=FONT,
  1864. width=gui_width,
  1865. height=gui_height,
  1866. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1867. tkinter.Button(
  1868. SCREEN,
  1869. bg=buttom_bg_color,
  1870. fg=word_color,
  1871. text="解析为json",
  1872. command=lambda: API.second_add_action_func("to_json"),
  1873. font=FONT,
  1874. width=gui_width,
  1875. height=gui_height,
  1876. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1877. row += 1
  1878. tkinter.Label(
  1879. SCREEN,
  1880. text="操作动作链:",
  1881. bg=bg_color,
  1882. fg=word_color,
  1883. font=FONT,
  1884. width=gui_width,
  1885. height=gui_height,
  1886. ).grid(column=column, row=row)
  1887. chains = tkinter.Entry(SCREEN, width=gui_width * 2)
  1888. chains.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1889. row += 1
  1890. tkinter.Label(
  1891. SCREEN,
  1892. text="拽拖至元素:",
  1893. bg=bg_color,
  1894. fg=word_color,
  1895. font=FONT,
  1896. width=gui_width,
  1897. height=gui_height,
  1898. ).grid(column=column, row=row)
  1899. drag_element = tkinter.Entry(SCREEN, width=gui_width * 2)
  1900. drag_element.grid(
  1901. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1902. )
  1903. row += 1
  1904. tkinter.Label(
  1905. SCREEN,
  1906. text="拽拖索引:",
  1907. bg=bg_color,
  1908. fg=word_color,
  1909. font=FONT,
  1910. width=gui_width,
  1911. height=gui_height,
  1912. ).grid(column=column, row=row)
  1913. drag_element_index = tkinter.Entry(SCREEN, width=gui_width * 2)
  1914. drag_element_index.grid(
  1915. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1916. )
  1917. row += 1
  1918. tkinter.Label(
  1919. SCREEN,
  1920. text="键入值:",
  1921. bg=bg_color,
  1922. fg=word_color,
  1923. font=FONT,
  1924. width=gui_width,
  1925. height=gui_height,
  1926. ).grid(column=column, row=row)
  1927. type_value = tkinter.Entry(SCREEN, width=gui_width * 2)
  1928. type_value.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1929. row += 1
  1930. tkinter.Label(
  1931. SCREEN,
  1932. text="运行时长:",
  1933. bg=bg_color,
  1934. fg=word_color,
  1935. font=FONT,
  1936. width=gui_width,
  1937. height=gui_height,
  1938. ).grid(column=column, row=row)
  1939. run_time = tkinter.Entry(SCREEN, width=gui_width * 2)
  1940. run_time.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1941. row += 1
  1942. tkinter.Button(
  1943. SCREEN,
  1944. bg=buttom_bg_color,
  1945. fg=word_color,
  1946. text="点击左键",
  1947. command=lambda: API.third_add_action_func("click"),
  1948. font=FONT,
  1949. width=gui_width,
  1950. height=gui_height,
  1951. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1952. tkinter.Button(
  1953. SCREEN,
  1954. bg=buttom_bg_color,
  1955. fg=word_color,
  1956. text="双击左键",
  1957. command=lambda: API.third_add_action_func("double_click"),
  1958. font=FONT,
  1959. width=gui_width,
  1960. height=gui_height,
  1961. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1962. tkinter.Button(
  1963. SCREEN,
  1964. bg=buttom_bg_color,
  1965. fg=word_color,
  1966. text="点击右键",
  1967. command=lambda: API.third_add_action_func("click_right"),
  1968. font=FONT,
  1969. width=gui_width,
  1970. height=gui_height,
  1971. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1972. row += 1
  1973. tkinter.Button(
  1974. SCREEN,
  1975. bg=buttom_bg_color,
  1976. fg=word_color,
  1977. text="按住左键",
  1978. command=lambda: API.third_add_action_func("click_and_hold"),
  1979. font=FONT,
  1980. width=gui_width,
  1981. height=gui_height,
  1982. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1983. tkinter.Button(
  1984. SCREEN,
  1985. bg=buttom_bg_color,
  1986. fg=word_color,
  1987. text="松开左键",
  1988. command=lambda: API.third_add_action_func("release"),
  1989. font=FONT,
  1990. width=gui_width,
  1991. height=gui_height,
  1992. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1993. tkinter.Button(
  1994. SCREEN,
  1995. bg=buttom_bg_color,
  1996. fg=word_color,
  1997. text="拽托元素",
  1998. command=lambda: API.second_add_action_func("drag_and_drop"),
  1999. font=FONT,
  2000. width=gui_width,
  2001. height=gui_height,
  2002. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2003. row += 1
  2004. tkinter.Button(
  2005. SCREEN,
  2006. bg=buttom_bg_color,
  2007. fg=word_color,
  2008. text="移动鼠标",
  2009. command=lambda: API.third_add_action_func("move"),
  2010. font=FONT,
  2011. width=gui_width,
  2012. height=gui_height,
  2013. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2014. tkinter.Button(
  2015. SCREEN,
  2016. bg=buttom_bg_color,
  2017. fg=word_color,
  2018. text="按下按键",
  2019. command=lambda: API.third_add_action_func("key_down"),
  2020. font=FONT,
  2021. width=gui_width,
  2022. height=gui_height,
  2023. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2024. tkinter.Button(
  2025. SCREEN,
  2026. bg=buttom_bg_color,
  2027. fg=word_color,
  2028. text="抬起按键",
  2029. command=lambda: API.third_add_action_func("key_up"),
  2030. font=FONT,
  2031. width=gui_width,
  2032. height=gui_height,
  2033. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2034. is_special_keys = tkinter.IntVar()
  2035. row += 1
  2036. tkinter.Button(
  2037. SCREEN,
  2038. bg=buttom_bg_color,
  2039. fg=word_color,
  2040. text="发送文本到焦点",
  2041. command=lambda: API.third_add_action_func("send_keys"),
  2042. font=FONT,
  2043. width=gui_width,
  2044. height=gui_height,
  2045. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2046. tkinter.Button(
  2047. SCREEN,
  2048. bg=buttom_bg_color,
  2049. fg=word_color,
  2050. text="发送文本",
  2051. command=lambda: API.third_add_action_func("send_keys_to_element"),
  2052. font=FONT,
  2053. width=gui_width,
  2054. height=gui_height,
  2055. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2056. tkinter.Checkbutton(
  2057. SCREEN,
  2058. bg=bg_color,
  2059. fg=word_color,
  2060. activebackground=bg_color,
  2061. activeforeground=word_color,
  2062. selectcolor=bg_color,
  2063. text="转换为特殊按钮",
  2064. variable=is_special_keys,
  2065. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  2066. row += 1
  2067. tkinter.Button(
  2068. SCREEN,
  2069. bg=buttom_bg_color,
  2070. fg=word_color,
  2071. text="生成动作链",
  2072. command=lambda: API.third_add_action_func("make_ActionChains"),
  2073. font=FONT,
  2074. width=gui_width,
  2075. height=gui_height,
  2076. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2077. tkinter.Button(
  2078. SCREEN,
  2079. bg=buttom_bg_color,
  2080. fg=word_color,
  2081. text="运行动作链",
  2082. command=lambda: API.third_add_action_func("ActionChains_run"),
  2083. font=FONT,
  2084. width=gui_width,
  2085. height=gui_height,
  2086. ).grid(column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W)
  2087. row += 1
  2088. tkinter.Button(
  2089. SCREEN,
  2090. bg=buttom_bg_color,
  2091. fg=word_color,
  2092. text="获取当前窗口",
  2093. command=lambda: API.first_add_action_func("get_now_windows"),
  2094. font=FONT,
  2095. width=gui_width,
  2096. height=gui_height,
  2097. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2098. tkinter.Button(
  2099. SCREEN,
  2100. bg=buttom_bg_color,
  2101. fg=word_color,
  2102. text="获取所有窗口",
  2103. command=lambda: API.first_add_action_func("get_all_windows"),
  2104. font=FONT,
  2105. width=gui_width,
  2106. height=gui_height,
  2107. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2108. tkinter.Button(
  2109. SCREEN,
  2110. bg=buttom_bg_color,
  2111. fg=word_color,
  2112. text="切换窗口",
  2113. command=lambda: API.first_add_action_func("switch_to_windwos"),
  2114. font=FONT,
  2115. width=gui_width,
  2116. height=gui_height,
  2117. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2118. row += 1
  2119. tkinter.Button(
  2120. SCREEN,
  2121. bg=buttom_bg_color,
  2122. fg=word_color,
  2123. text="暴力等待",
  2124. command=lambda: API.first_add_action_func("wait_sleep"),
  2125. font=FONT,
  2126. width=gui_width,
  2127. height=gui_height,
  2128. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2129. tkinter.Button(
  2130. SCREEN,
  2131. bg=buttom_bg_color,
  2132. fg=word_color,
  2133. text="元素检查等待",
  2134. command=lambda: API.first_add_action_func("set_wait"),
  2135. font=FONT,
  2136. width=gui_width,
  2137. height=gui_height,
  2138. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2139. tkinter.Button(
  2140. SCREEN,
  2141. bg=buttom_bg_color,
  2142. fg=word_color,
  2143. text="运行js",
  2144. command=lambda: API.first_add_action_func("run_JS"),
  2145. font=FONT,
  2146. width=gui_width,
  2147. height=gui_height,
  2148. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2149. row += 1
  2150. tkinter.Button(
  2151. SCREEN,
  2152. bg=buttom_bg_color,
  2153. fg=word_color,
  2154. text="页面后退",
  2155. command=lambda: API.first_add_action_func("back"),
  2156. font=FONT,
  2157. width=gui_width,
  2158. height=gui_height,
  2159. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2160. tkinter.Button(
  2161. SCREEN,
  2162. bg=buttom_bg_color,
  2163. fg=word_color,
  2164. text="页面刷新",
  2165. command=lambda: API.first_add_action_func("refresh"),
  2166. font=FONT,
  2167. width=gui_width,
  2168. height=gui_height,
  2169. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2170. tkinter.Button(
  2171. SCREEN,
  2172. bg=buttom_bg_color,
  2173. fg=word_color,
  2174. text="页面前进",
  2175. command=lambda: API.first_add_action_func("forward"),
  2176. font=FONT,
  2177. width=gui_width,
  2178. height=gui_height,
  2179. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2180. SCREEN.update() # 要预先update一下,否则会卡住
  2181. save_dir = askdirectory(title="选择项目位置", must=True) # 项目位置
  2182. url = crawler.controller.Url(save_dir, save_dir) # url管理器
  2183. loader = crawler.controller.PageDownloader(url, save_dir) # 页面下载器
  2184. page_parser = crawler.controller.PageParser(loader) # 页面解析器
  2185. database = crawler.template.data_base # 数据库