gui.py 65 KB

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