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
  640. queue_controller.set_queue(in_queue, out_queue)
  641. queue_controller()
  642. def before_stop():
  643. loader.stop()
  644. database.close_all()
  645. url.close()
  646. loader.close()
  647. queue_controller.set_before_stop(before_stop)
  648. SCREEN.mainloop()
  649. queue_controller.stop_process()
  650. SCREEN.title("CoTan自动化网页")
  651. SCREEN.resizable(width=False, height=False)
  652. SCREEN.geometry("+10+10") # 设置所在位置
  653. SCREEN.iconbitmap(bitmap=f'Pic{os.sep}favicon.ico', default=f'Pic{os.sep}favicon.ico')
  654. gui_width = 13 # 标准宽度
  655. gui_height = 2
  656. row = 0
  657. column = 0
  658. tkinter.Button(
  659. SCREEN,
  660. bg=buttom_bg_color,
  661. fg=word_color,
  662. text="添加url对象",
  663. command=lambda: API.add_url(False),
  664. font=FONT,
  665. width=gui_width,
  666. height=gui_height,
  667. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  668. tkinter.Button(
  669. SCREEN,
  670. bg=buttom_bg_color,
  671. fg=word_color,
  672. text="删除url对象",
  673. command=API.del_url,
  674. font=FONT,
  675. width=gui_width,
  676. height=gui_height,
  677. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  678. tkinter.Button(
  679. SCREEN,
  680. bg=buttom_bg_color,
  681. fg=word_color,
  682. command=lambda: API.add_url(True),
  683. text="强制添加",
  684. font=FONT,
  685. width=gui_width,
  686. height=gui_height,
  687. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  688. row += 1
  689. tkinter.Label(
  690. SCREEN,
  691. text="添加url:",
  692. bg=bg_color,
  693. fg=word_color,
  694. font=FONT,
  695. width=gui_width,
  696. height=gui_height,
  697. ).grid(column=column, row=row)
  698. url_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  699. url_input.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  700. row += 1
  701. url_parameter = []
  702. lable = ["不加载js", "不加载java", "不加载插件"] # 复选框
  703. for i in range(3):
  704. url_parameter.append(tkinter.IntVar())
  705. tkinter.Checkbutton(
  706. SCREEN,
  707. bg=bg_color,
  708. fg=word_color,
  709. activebackground=bg_color,
  710. activeforeground=word_color,
  711. selectcolor=bg_color,
  712. text=lable[i],
  713. variable=url_parameter[-1],
  714. ).grid(column=column + i, row=row, sticky=tkinter.W)
  715. row += 1
  716. lable = ["第一次启动", "隐藏网页", "不加载图片"] # 复选框
  717. for i in range(3):
  718. url_parameter.append(tkinter.IntVar())
  719. tkinter.Checkbutton(
  720. SCREEN,
  721. bg=bg_color,
  722. fg=word_color,
  723. activebackground=bg_color,
  724. activeforeground=word_color,
  725. selectcolor=bg_color,
  726. text=lable[i],
  727. variable=url_parameter[-1],
  728. ).grid(column=column + i, row=row, sticky=tkinter.W)
  729. row += 1
  730. tkinter.Label(
  731. SCREEN,
  732. text="UA设置:",
  733. bg=bg_color,
  734. fg=word_color,
  735. font=FONT,
  736. width=gui_width,
  737. height=gui_height,
  738. ).grid(column=column, row=row)
  739. user_agent_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  740. user_agent_input.grid(
  741. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  742. )
  743. row += 1
  744. tkinter.Label(
  745. SCREEN,
  746. text="DATA:",
  747. bg=bg_color,
  748. fg=word_color,
  749. font=FONT,
  750. width=gui_width,
  751. height=gui_height,
  752. ).grid(column=column, row=row)
  753. requests_data = tkinter.Entry(SCREEN, width=gui_width * 2)
  754. requests_data.grid(
  755. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  756. )
  757. row += 1
  758. tkinter.Label(
  759. SCREEN,
  760. text="请求方式:",
  761. bg=bg_color,
  762. fg=word_color,
  763. font=FONT,
  764. width=gui_width,
  765. height=gui_height,
  766. ).grid(column=column, row=row)
  767. mode_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  768. mode_input.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  769. row += 1
  770. tkinter.Label(
  771. SCREEN,
  772. text="请求超时:",
  773. bg=bg_color,
  774. fg=word_color,
  775. font=FONT,
  776. width=gui_width,
  777. height=gui_height,
  778. ).grid(column=column, row=row)
  779. time_out = tkinter.Entry(SCREEN, width=gui_width * 2)
  780. time_out.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  781. row += 1
  782. tkinter.Label(
  783. SCREEN,
  784. text="Cookies:",
  785. bg=bg_color,
  786. fg=word_color,
  787. font=FONT,
  788. width=gui_width,
  789. height=gui_height,
  790. ).grid(column=column, row=row)
  791. applied_cookies = tkinter.Entry(SCREEN, width=gui_width)
  792. applied_cookies.grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  793. url_parameter.append(tkinter.IntVar())
  794. tkinter.Checkbutton(
  795. SCREEN,
  796. bg=bg_color,
  797. fg=word_color,
  798. activebackground=bg_color,
  799. activeforeground=word_color,
  800. selectcolor=bg_color,
  801. text="新启动网页",
  802. variable=url_parameter[-1],
  803. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  804. row += 1
  805. url_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 4)
  806. url_box.grid(
  807. column=column,
  808. row=row,
  809. columnspan=3,
  810. rowspan=4,
  811. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  812. )
  813. row += 4
  814. tkinter.Button(
  815. SCREEN,
  816. bg=buttom_bg_color,
  817. fg=word_color,
  818. text="HTTPS过滤器",
  819. command=API.add_filter_func_https,
  820. font=FONT,
  821. width=gui_width,
  822. height=gui_height,
  823. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  824. tkinter.Button(
  825. SCREEN,
  826. bg=buttom_bg_color,
  827. fg=word_color,
  828. text="WWW过滤器",
  829. command=API.add_filter_func_www,
  830. font=FONT,
  831. width=gui_width,
  832. height=gui_height,
  833. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  834. tkinter.Button(
  835. SCREEN,
  836. bg=buttom_bg_color,
  837. fg=word_color,
  838. text="删除过滤器",
  839. command=API.del_filter_func,
  840. font=FONT,
  841. width=gui_width,
  842. height=gui_height,
  843. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  844. row += 1
  845. tkinter.Button(
  846. SCREEN,
  847. bg=buttom_bg_color,
  848. fg=word_color,
  849. text="自定义过滤器",
  850. command=API.add_filter_from_python,
  851. font=FONT,
  852. width=gui_width,
  853. height=gui_height,
  854. ).grid(column=column, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  855. tkinter.Button(
  856. SCREEN,
  857. bg=buttom_bg_color,
  858. fg=word_color,
  859. text="清空过滤器",
  860. font=FONT,
  861. command=API.clean_filter_func,
  862. width=gui_width,
  863. height=gui_height,
  864. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  865. row += 1
  866. filter_func_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  867. filter_func_box.grid(
  868. column=column,
  869. row=row,
  870. columnspan=3,
  871. rowspan=3,
  872. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  873. )
  874. row += 3
  875. tkinter.Button(
  876. SCREEN,
  877. bg=buttom_bg_color,
  878. fg=word_color,
  879. text="单点爬虫运行",
  880. command=API.crawler_run_one,
  881. font=FONT,
  882. width=gui_width,
  883. height=gui_height,
  884. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  885. tkinter.Button(
  886. SCREEN,
  887. bg=buttom_bg_color,
  888. fg=word_color,
  889. text="爬虫运行",
  890. command=API.crawler_run,
  891. font=FONT,
  892. width=gui_width,
  893. height=gui_height,
  894. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  895. tkinter.Button(
  896. SCREEN,
  897. bg=buttom_bg_color,
  898. fg=word_color,
  899. text="单点爬虫停止",
  900. command=API.crawler_stop,
  901. font=FONT,
  902. width=gui_width,
  903. height=gui_height,
  904. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  905. row += 1
  906. cookies_fixed = tkinter.IntVar()
  907. tkinter.Label(
  908. SCREEN,
  909. text="【曲奇监视】",
  910. bg=bg_color,
  911. fg=word_color,
  912. font=FONT,
  913. width=gui_width,
  914. height=gui_height,
  915. ).grid(
  916. column=column + 1,
  917. row=row,
  918. sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N,
  919. ) # 设置说明
  920. tkinter.Checkbutton(
  921. SCREEN,
  922. bg=bg_color,
  923. fg=word_color,
  924. activebackground=bg_color,
  925. activeforeground=word_color,
  926. selectcolor=bg_color,
  927. text="固定曲奇",
  928. variable=cookies_fixed,
  929. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  930. cookies_fixed.set("0")
  931. row += 1
  932. cookies_BOX = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  933. cookies_BOX.grid(
  934. column=column,
  935. row=row,
  936. columnspan=3,
  937. rowspan=3,
  938. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  939. )
  940. row += 3
  941. tkinter.Button(
  942. SCREEN,
  943. bg=buttom_bg_color,
  944. fg=word_color,
  945. text="清空曲奇",
  946. command=API.clean_cookies,
  947. font=FONT,
  948. width=gui_width,
  949. height=gui_height,
  950. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  951. tkinter.Button(
  952. SCREEN,
  953. bg=buttom_bg_color,
  954. fg=word_color,
  955. text="更新曲奇",
  956. command=API.update_cookies,
  957. font=FONT,
  958. width=gui_width,
  959. height=gui_height,
  960. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  961. tkinter.Button(
  962. SCREEN,
  963. bg=buttom_bg_color,
  964. fg=word_color,
  965. text="删除曲奇",
  966. command=API.del_cookies,
  967. font=FONT,
  968. width=gui_width,
  969. height=gui_height,
  970. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  971. row += 1
  972. new_cookies = tkinter.Entry(SCREEN, width=gui_width * 3)
  973. new_cookies.grid(column=column, row=row, columnspan=3, sticky=tkinter.E + tkinter.W)
  974. tkinter.Button(
  975. SCREEN,
  976. bg=buttom_bg_color,
  977. fg=word_color,
  978. text="添加曲奇",
  979. command=API.add_cookies,
  980. font=FONT,
  981. width=gui_width,
  982. height=gui_height,
  983. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  984. column += 3
  985. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  986. column=column, row=row
  987. ) # 设置说明
  988. column += 1
  989. row = 0
  990. tkinter.Button(
  991. SCREEN,
  992. bg=buttom_bg_color,
  993. fg=word_color,
  994. text="根据id搜查",
  995. command=lambda: API.add_find_func("id"),
  996. font=FONT,
  997. width=gui_width,
  998. height=gui_height,
  999. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1000. tkinter.Button(
  1001. SCREEN,
  1002. bg=buttom_bg_color,
  1003. fg=word_color,
  1004. text="根据name搜查",
  1005. command=lambda: API.add_find_func("name"),
  1006. font=FONT,
  1007. width=gui_width,
  1008. height=gui_height,
  1009. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1010. tkinter.Button(
  1011. SCREEN,
  1012. bg=buttom_bg_color,
  1013. fg=word_color,
  1014. text="根据class搜查",
  1015. command=lambda: API.add_find_func("class"),
  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. tkinter.Button(
  1022. SCREEN,
  1023. bg=buttom_bg_color,
  1024. fg=word_color,
  1025. text="根据xpath搜查",
  1026. command=lambda: API.add_find_func("xpath"),
  1027. font=FONT,
  1028. width=gui_width,
  1029. height=gui_height,
  1030. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1031. tkinter.Button(
  1032. SCREEN,
  1033. bg=buttom_bg_color,
  1034. fg=word_color,
  1035. text="根据css搜查",
  1036. command=lambda: API.add_find_func("css"),
  1037. font=FONT,
  1038. width=gui_width,
  1039. height=gui_height,
  1040. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1041. tkinter.Button(
  1042. SCREEN,
  1043. bg=buttom_bg_color,
  1044. fg=word_color,
  1045. text="根据元素名搜查",
  1046. command=lambda: API.add_find_func("tag"),
  1047. font=FONT,
  1048. width=gui_width,
  1049. height=gui_height,
  1050. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1051. row += 1
  1052. search_all = tkinter.Variable()
  1053. tkinter.Button(
  1054. SCREEN,
  1055. bg=buttom_bg_color,
  1056. fg=word_color,
  1057. text="根据link搜查",
  1058. command=lambda: API.add_find_func("link"),
  1059. font=FONT,
  1060. width=gui_width,
  1061. height=gui_height,
  1062. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1063. tkinter.Button(
  1064. SCREEN,
  1065. bg=buttom_bg_color,
  1066. fg=word_color,
  1067. text="link模糊搜查",
  1068. command=lambda: API.add_find_func("partial_link"),
  1069. font=FONT,
  1070. width=gui_width,
  1071. height=gui_height,
  1072. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1073. tkinter.Checkbutton(
  1074. SCREEN,
  1075. bg=bg_color,
  1076. fg=word_color,
  1077. activebackground=bg_color,
  1078. activeforeground=word_color,
  1079. selectcolor=bg_color,
  1080. text="匹配全部",
  1081. variable=search_all,
  1082. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  1083. search_all.set("0")
  1084. row += 1
  1085. tkinter.Label(
  1086. SCREEN,
  1087. text="搜查参数:",
  1088. bg=bg_color,
  1089. fg=word_color,
  1090. font=FONT,
  1091. width=gui_width,
  1092. height=gui_height,
  1093. ).grid(column=column, row=row)
  1094. search_key = tkinter.Entry(SCREEN, width=gui_width * 2)
  1095. search_key.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1096. row += 1
  1097. tkinter.Button(
  1098. SCREEN,
  1099. bg=buttom_bg_color,
  1100. fg=word_color,
  1101. text="删除方法",
  1102. command=API.del_parser_func,
  1103. font=FONT,
  1104. width=gui_width,
  1105. height=gui_height,
  1106. ).grid(column=column, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1107. tkinter.Button(
  1108. SCREEN,
  1109. bg=buttom_bg_color,
  1110. fg=word_color,
  1111. text="清空方法",
  1112. command=API.clean_parser_func,
  1113. font=FONT,
  1114. width=gui_width,
  1115. height=gui_height,
  1116. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1117. row += 1
  1118. parser_func_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1119. parser_func_box.grid(
  1120. column=column,
  1121. row=row,
  1122. columnspan=3,
  1123. rowspan=5,
  1124. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1125. )
  1126. row += 5
  1127. tkinter.Label(
  1128. SCREEN,
  1129. text="操作元素:",
  1130. bg=bg_color,
  1131. fg=word_color,
  1132. font=FONT,
  1133. width=gui_width,
  1134. height=gui_height,
  1135. ).grid(column=column, row=row)
  1136. operation_object = tkinter.Entry(SCREEN, width=gui_width * 2)
  1137. operation_object.grid(
  1138. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1139. )
  1140. row += 1
  1141. tkinter.Label(
  1142. SCREEN,
  1143. text="操作索引:",
  1144. bg=bg_color,
  1145. fg=word_color,
  1146. font=FONT,
  1147. width=gui_width,
  1148. height=gui_height,
  1149. ).grid(column=column, row=row)
  1150. object_index = tkinter.Entry(SCREEN, width=gui_width * 2)
  1151. object_index.grid(
  1152. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1153. )
  1154. row += 1
  1155. tkinter.Label(
  1156. SCREEN,
  1157. text="发送信息:",
  1158. bg=bg_color,
  1159. fg=word_color,
  1160. font=FONT,
  1161. width=gui_width,
  1162. height=gui_height,
  1163. ).grid(column=column, row=row)
  1164. send_text = tkinter.Entry(SCREEN, width=gui_width * 2)
  1165. send_text.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1166. row += 1
  1167. tkinter.Label(
  1168. SCREEN,
  1169. text="认证用户名:",
  1170. bg=bg_color,
  1171. fg=word_color,
  1172. font=FONT,
  1173. width=gui_width,
  1174. height=gui_height,
  1175. ).grid(column=column, row=row)
  1176. username_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  1177. username_input.grid(
  1178. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1179. )
  1180. row += 1
  1181. tkinter.Label(
  1182. SCREEN,
  1183. text="认证密码:",
  1184. bg=bg_color,
  1185. fg=word_color,
  1186. font=FONT,
  1187. width=gui_width,
  1188. height=gui_height,
  1189. ).grid(column=column, row=row)
  1190. password = tkinter.Entry(SCREEN, width=gui_width * 2)
  1191. password.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1192. row += 1
  1193. tkinter.Label(
  1194. SCREEN,
  1195. text="选择参数:",
  1196. bg=bg_color,
  1197. fg=word_color,
  1198. font=FONT,
  1199. width=gui_width,
  1200. height=gui_height,
  1201. ).grid(column=column, row=row)
  1202. select_object = tkinter.Entry(SCREEN, width=gui_width * 2)
  1203. select_object.grid(
  1204. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1205. )
  1206. row += 1
  1207. tkinter.Label(
  1208. SCREEN,
  1209. text="等待时间:",
  1210. bg=bg_color,
  1211. fg=word_color,
  1212. font=FONT,
  1213. width=gui_width,
  1214. height=gui_height,
  1215. ).grid(column=column, row=row)
  1216. wait_time = tkinter.Entry(SCREEN, width=gui_width * 2)
  1217. wait_time.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1218. row += 1
  1219. tkinter.Label(
  1220. SCREEN,
  1221. text="JavaScript:",
  1222. bg=bg_color,
  1223. fg=word_color,
  1224. font=FONT,
  1225. width=gui_width,
  1226. height=gui_height,
  1227. ).grid(column=column, row=row)
  1228. js_code = tkinter.Entry(SCREEN, width=gui_width * 2)
  1229. js_code.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1230. row += 1
  1231. tkinter.Button(
  1232. SCREEN,
  1233. bg=buttom_bg_color,
  1234. fg=word_color,
  1235. text="发送字符",
  1236. command=lambda: API.first_add_action_func("send_keys"),
  1237. font=FONT,
  1238. width=gui_width,
  1239. height=gui_height,
  1240. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1241. tkinter.Button(
  1242. SCREEN,
  1243. bg=buttom_bg_color,
  1244. fg=word_color,
  1245. text="清空字符",
  1246. command=lambda: API.first_add_action_func("clear"),
  1247. font=FONT,
  1248. width=gui_width,
  1249. height=gui_height,
  1250. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1251. tkinter.Button(
  1252. SCREEN,
  1253. bg=buttom_bg_color,
  1254. fg=word_color,
  1255. text="提交表单",
  1256. command=lambda: API.first_add_action_func("submit"),
  1257. font=FONT,
  1258. width=gui_width,
  1259. height=gui_height,
  1260. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1261. row += 1
  1262. tkinter.Button(
  1263. SCREEN,
  1264. bg=buttom_bg_color,
  1265. fg=word_color,
  1266. text="点击按钮",
  1267. command=lambda: API.first_add_action_func("click"),
  1268. font=FONT,
  1269. width=gui_width,
  1270. height=gui_height,
  1271. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1272. tkinter.Button(
  1273. SCREEN,
  1274. bg=buttom_bg_color,
  1275. fg=word_color,
  1276. text="取得源代码",
  1277. command=lambda: API.first_add_action_func("get_Page"),
  1278. font=FONT,
  1279. width=gui_width,
  1280. height=gui_height,
  1281. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1282. tkinter.Button(
  1283. SCREEN,
  1284. bg=buttom_bg_color,
  1285. fg=word_color,
  1286. text="输出HTML",
  1287. command=lambda: API.first_add_action_func("out"),
  1288. font=FONT,
  1289. width=gui_width,
  1290. height=gui_height,
  1291. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1292. row += 1
  1293. tkinter.Button(
  1294. SCREEN,
  1295. bg=buttom_bg_color,
  1296. fg=word_color,
  1297. text="切换Frame(id)",
  1298. command=API.add_frame_func_id,
  1299. font=FONT,
  1300. width=gui_width,
  1301. height=gui_height,
  1302. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1303. tkinter.Button(
  1304. SCREEN,
  1305. bg=buttom_bg_color,
  1306. fg=word_color,
  1307. text="切换Frame",
  1308. command=lambda: API.add_find_func("frame"),
  1309. font=FONT,
  1310. width=gui_width,
  1311. height=gui_height,
  1312. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1313. tkinter.Button(
  1314. SCREEN,
  1315. bg=buttom_bg_color,
  1316. fg=word_color,
  1317. text="定位焦点元素",
  1318. command=lambda: API.add_find_func("active_element"),
  1319. font=FONT,
  1320. width=gui_width,
  1321. height=gui_height,
  1322. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1323. row += 1
  1324. tkinter.Button(
  1325. SCREEN,
  1326. bg=buttom_bg_color,
  1327. fg=word_color,
  1328. text="捕获弹窗",
  1329. command=lambda: API.add_find_func("alert"),
  1330. font=FONT,
  1331. width=gui_width,
  1332. height=gui_height,
  1333. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1334. tkinter.Button(
  1335. SCREEN,
  1336. bg=buttom_bg_color,
  1337. fg=word_color,
  1338. text="回到主Frame",
  1339. command=lambda: API.add_frame_func_father(False),
  1340. font=FONT,
  1341. width=gui_width,
  1342. height=gui_height,
  1343. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1344. tkinter.Button(
  1345. SCREEN,
  1346. bg=buttom_bg_color,
  1347. fg=word_color,
  1348. text="回到父Frame",
  1349. command=lambda: API.add_frame_func_father(True),
  1350. font=FONT,
  1351. width=gui_width,
  1352. height=gui_height,
  1353. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1354. row += 1
  1355. tkinter.Button(
  1356. SCREEN,
  1357. bg=buttom_bg_color,
  1358. fg=word_color,
  1359. text="弹出框认证",
  1360. command=lambda: API.first_add_action_func("User_Passwd"),
  1361. font=FONT,
  1362. width=gui_width,
  1363. height=gui_height,
  1364. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1365. tkinter.Button(
  1366. SCREEN,
  1367. bg=buttom_bg_color,
  1368. fg=word_color,
  1369. text="弹出框确定",
  1370. command=lambda: API.first_add_action_func("accept"),
  1371. font=FONT,
  1372. width=gui_width,
  1373. height=gui_height,
  1374. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1375. tkinter.Button(
  1376. SCREEN,
  1377. bg=buttom_bg_color,
  1378. fg=word_color,
  1379. text="弹出框取消",
  1380. command=lambda: API.first_add_action_func("dismiss"),
  1381. font=FONT,
  1382. width=gui_width,
  1383. height=gui_height,
  1384. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1385. row += 1
  1386. tkinter.Button(
  1387. SCREEN,
  1388. bg=buttom_bg_color,
  1389. fg=word_color,
  1390. text="取消选择index",
  1391. command=lambda: API.first_add_action_func("deselect_by_index"),
  1392. font=FONT,
  1393. width=gui_width,
  1394. height=gui_height,
  1395. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1396. tkinter.Button(
  1397. SCREEN,
  1398. bg=buttom_bg_color,
  1399. fg=word_color,
  1400. text="取消选择text",
  1401. command=lambda: API.first_add_action_func("deselect_by_text"),
  1402. font=FONT,
  1403. width=gui_width,
  1404. height=gui_height,
  1405. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1406. tkinter.Button(
  1407. SCREEN,
  1408. bg=buttom_bg_color,
  1409. fg=word_color,
  1410. text="取消选择value",
  1411. command=lambda: API.first_add_action_func("deselect_by_value"),
  1412. font=FONT,
  1413. width=gui_width,
  1414. height=gui_height,
  1415. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1416. row += 1
  1417. tkinter.Button(
  1418. SCREEN,
  1419. bg=buttom_bg_color,
  1420. fg=word_color,
  1421. text="选择index",
  1422. command=lambda: API.first_add_action_func("select_by_index"),
  1423. font=FONT,
  1424. width=gui_width,
  1425. height=gui_height,
  1426. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1427. tkinter.Button(
  1428. SCREEN,
  1429. bg=buttom_bg_color,
  1430. fg=word_color,
  1431. text="选择text",
  1432. command=lambda: API.first_add_action_func("select_by_text"),
  1433. font=FONT,
  1434. width=gui_width,
  1435. height=gui_height,
  1436. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1437. tkinter.Button(
  1438. SCREEN,
  1439. bg=buttom_bg_color,
  1440. fg=word_color,
  1441. text="选择value",
  1442. command=lambda: API.first_add_action_func("select_by_value"),
  1443. font=FONT,
  1444. width=gui_width,
  1445. height=gui_height,
  1446. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1447. column += 3
  1448. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  1449. column=column, row=row
  1450. ) # 设置说明
  1451. column += 1
  1452. row = 0
  1453. now_running = tkinter.StringVar()
  1454. status_output = tkinter.StringVar()
  1455. tkinter.Label(
  1456. SCREEN,
  1457. text="正在执行:",
  1458. bg=bg_color,
  1459. fg=word_color,
  1460. font=FONT,
  1461. width=gui_width,
  1462. height=gui_height,
  1463. ).grid(column=column, row=row)
  1464. tkinter.Entry(
  1465. SCREEN, width=gui_width * 2, state=tkinter.DISABLED, textvariable=now_running
  1466. ).grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1467. row += 1
  1468. tkinter.Label(
  1469. SCREEN,
  1470. text="上一次状态:",
  1471. bg=bg_color,
  1472. fg=word_color,
  1473. font=FONT,
  1474. width=gui_width,
  1475. height=gui_height,
  1476. ).grid(column=column, row=row)
  1477. tkinter.Entry(
  1478. SCREEN, width=gui_width * 2, state=tkinter.DISABLED, textvariable=status_output
  1479. ).grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1480. row += 1
  1481. variable_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1482. variable_box.grid(
  1483. column=column,
  1484. row=row,
  1485. columnspan=3,
  1486. rowspan=5,
  1487. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1488. )
  1489. row += 5
  1490. tkinter.Label(
  1491. SCREEN,
  1492. text="cookies名:",
  1493. bg=bg_color,
  1494. fg=word_color,
  1495. font=FONT,
  1496. width=gui_width,
  1497. height=gui_height,
  1498. ).grid(column=column, row=row)
  1499. cookies_name_input = tkinter.Entry(SCREEN, width=gui_width * 2)
  1500. cookies_name_input.grid(
  1501. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1502. )
  1503. row += 1
  1504. tkinter.Label(
  1505. SCREEN,
  1506. text="cookies:",
  1507. bg=bg_color,
  1508. fg=word_color,
  1509. font=FONT,
  1510. width=gui_width,
  1511. height=gui_height,
  1512. ).grid(column=column, row=row)
  1513. new_cookies = tkinter.Entry(SCREEN, width=gui_width * 2)
  1514. new_cookies.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1515. row += 1
  1516. tkinter.Label(
  1517. SCREEN,
  1518. text="定位标签:",
  1519. bg=bg_color,
  1520. fg=word_color,
  1521. font=FONT,
  1522. width=gui_width,
  1523. height=gui_height,
  1524. ).grid(column=column, row=row)
  1525. element_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1526. element_name.grid(
  1527. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1528. )
  1529. row += 1
  1530. tkinter.Label(
  1531. SCREEN,
  1532. text="定位属性名:",
  1533. bg=bg_color,
  1534. fg=word_color,
  1535. font=FONT,
  1536. width=gui_width,
  1537. height=gui_height,
  1538. ).grid(column=column, row=row)
  1539. attributes_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1540. attributes_name.grid(
  1541. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1542. )
  1543. attribute_regex = tkinter.IntVar()
  1544. row += 1
  1545. tkinter.Label(
  1546. SCREEN,
  1547. text="定位属性值:",
  1548. bg=bg_color,
  1549. fg=word_color,
  1550. font=FONT,
  1551. width=gui_width,
  1552. height=gui_height,
  1553. ).grid(column=column, row=row)
  1554. attributes_value = tkinter.Entry(SCREEN, width=gui_width)
  1555. attributes_value.grid(
  1556. column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W
  1557. )
  1558. row += 1
  1559. tkinter.Button(
  1560. SCREEN,
  1561. bg=buttom_bg_color,
  1562. fg=word_color,
  1563. text="添加属性",
  1564. command=API.add_attributes,
  1565. font=FONT,
  1566. width=gui_width,
  1567. height=gui_height,
  1568. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1569. tkinter.Button(
  1570. SCREEN,
  1571. bg=buttom_bg_color,
  1572. fg=word_color,
  1573. text="删除属性",
  1574. command=API.del_attributes,
  1575. font=FONT,
  1576. width=gui_width,
  1577. height=gui_height,
  1578. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1579. tkinter.Button(
  1580. SCREEN,
  1581. bg=buttom_bg_color,
  1582. fg=word_color,
  1583. text="清空属性",
  1584. command=API.clean_attributes,
  1585. font=FONT,
  1586. width=gui_width,
  1587. height=gui_height,
  1588. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1589. row += 1
  1590. attributes_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 3)
  1591. attributes_box.grid(
  1592. column=column,
  1593. row=row,
  1594. columnspan=3,
  1595. rowspan=3,
  1596. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1597. )
  1598. row += 3
  1599. tkinter.Label(
  1600. SCREEN,
  1601. text="定位文本:",
  1602. bg=bg_color,
  1603. fg=word_color,
  1604. font=FONT,
  1605. width=gui_width,
  1606. height=gui_height,
  1607. ).grid(column=column, row=row)
  1608. find_text = tkinter.Entry(SCREEN, width=gui_width)
  1609. find_text.grid(column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W)
  1610. is_recursive = tkinter.IntVar()
  1611. text_regex = tkinter.IntVar()
  1612. row += 1
  1613. tkinter.Checkbutton(
  1614. SCREEN,
  1615. bg=bg_color,
  1616. fg=word_color,
  1617. activebackground=bg_color,
  1618. activeforeground=word_color,
  1619. selectcolor=bg_color,
  1620. text="递归查找",
  1621. variable=is_recursive,
  1622. ).grid(column=column, row=row, sticky=tkinter.W)
  1623. tkinter.Checkbutton(
  1624. SCREEN,
  1625. bg=bg_color,
  1626. fg=word_color,
  1627. activebackground=bg_color,
  1628. activeforeground=word_color,
  1629. selectcolor=bg_color,
  1630. text="文本使用正则",
  1631. variable=text_regex,
  1632. ).grid(column=column + 1, row=row, sticky=tkinter.W)
  1633. tkinter.Checkbutton(
  1634. SCREEN,
  1635. bg=bg_color,
  1636. fg=word_color,
  1637. activebackground=bg_color,
  1638. activeforeground=word_color,
  1639. selectcolor=bg_color,
  1640. text="属性值使用正则",
  1641. variable=attribute_regex,
  1642. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  1643. attribute_regex.set(1)
  1644. text_regex.set("1")
  1645. is_recursive.set("1")
  1646. row += 1
  1647. tkinter.Label(
  1648. SCREEN,
  1649. text="查找个数:",
  1650. bg=bg_color,
  1651. fg=word_color,
  1652. font=FONT,
  1653. width=gui_width,
  1654. height=gui_height,
  1655. ).grid(column=column, row=row)
  1656. limit = tkinter.Entry(SCREEN, width=gui_width * 2)
  1657. limit.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1658. row += 1
  1659. tkinter.Label(
  1660. SCREEN,
  1661. text="定位路径:",
  1662. bg=bg_color,
  1663. fg=word_color,
  1664. font=FONT,
  1665. width=gui_width,
  1666. height=gui_height,
  1667. ).grid(column=column, row=row)
  1668. find_path = tkinter.Entry(SCREEN, width=gui_width * 2)
  1669. find_path.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1670. row += 1
  1671. tkinter.Button(
  1672. SCREEN,
  1673. bg=buttom_bg_color,
  1674. fg=word_color,
  1675. text="删除所有曲奇",
  1676. command=lambda: API.second_add_action_func("del_all_cookies"),
  1677. font=FONT,
  1678. width=gui_width,
  1679. height=gui_height,
  1680. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1681. tkinter.Button(
  1682. SCREEN,
  1683. bg=buttom_bg_color,
  1684. fg=word_color,
  1685. text="删除指定曲奇",
  1686. command=lambda: API.second_add_action_func("del_cookies"),
  1687. font=FONT,
  1688. width=gui_width,
  1689. height=gui_height,
  1690. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1691. tkinter.Button(
  1692. SCREEN,
  1693. bg=buttom_bg_color,
  1694. fg=word_color,
  1695. text="添加新的曲奇",
  1696. command=lambda: API.second_add_action_func("add_cookies"),
  1697. font=FONT,
  1698. width=gui_width,
  1699. height=gui_height,
  1700. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1701. row += 1
  1702. tkinter.Button(
  1703. SCREEN,
  1704. bg=buttom_bg_color,
  1705. fg=word_color,
  1706. text="更新指定曲奇",
  1707. command=lambda: API.second_add_action_func("update_cookies"),
  1708. font=FONT,
  1709. width=gui_width,
  1710. height=gui_height,
  1711. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1712. tkinter.Button(
  1713. SCREEN,
  1714. bg=buttom_bg_color,
  1715. fg=word_color,
  1716. text="获得所有曲奇",
  1717. command=lambda: API.second_add_action_func("get_cookies"),
  1718. font=FONT,
  1719. width=gui_width,
  1720. height=gui_height,
  1721. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1722. tkinter.Button(
  1723. SCREEN,
  1724. bg=buttom_bg_color,
  1725. fg=word_color,
  1726. text="获得指定曲奇",
  1727. command=lambda: API.second_add_action_func("get_all_cookies"),
  1728. font=FONT,
  1729. width=gui_width,
  1730. height=gui_height,
  1731. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1732. row += 1
  1733. tkinter.Button(
  1734. SCREEN,
  1735. bg=buttom_bg_color,
  1736. fg=word_color,
  1737. text="解析网页",
  1738. command=lambda: API.second_add_action_func("make_bs"),
  1739. font=FONT,
  1740. width=gui_width,
  1741. height=gui_height,
  1742. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1743. tkinter.Button(
  1744. SCREEN,
  1745. bg=buttom_bg_color,
  1746. fg=word_color,
  1747. text="根据标签定位",
  1748. command=lambda: API.second_add_action_func("findAll"),
  1749. font=FONT,
  1750. width=gui_width,
  1751. height=gui_height,
  1752. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1753. tkinter.Button(
  1754. SCREEN,
  1755. bg=buttom_bg_color,
  1756. fg=word_color,
  1757. text="根据文本定位",
  1758. command=lambda: API.second_add_action_func("findAll_by_text"),
  1759. font=FONT,
  1760. width=gui_width,
  1761. height=gui_height,
  1762. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1763. row += 1
  1764. tkinter.Button(
  1765. SCREEN,
  1766. bg=buttom_bg_color,
  1767. fg=word_color,
  1768. text="获得子标签",
  1769. command=lambda: API.second_add_action_func("get_children"),
  1770. font=FONT,
  1771. width=gui_width,
  1772. height=gui_height,
  1773. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1774. tkinter.Button(
  1775. SCREEN,
  1776. bg=buttom_bg_color,
  1777. fg=word_color,
  1778. text="获得后代标签",
  1779. command=lambda: API.second_add_action_func("get_offspring"),
  1780. font=FONT,
  1781. width=gui_width,
  1782. height=gui_height,
  1783. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1784. tkinter.Button(
  1785. SCREEN,
  1786. bg=buttom_bg_color,
  1787. fg=word_color,
  1788. text="获得弟标签",
  1789. command=lambda: API.second_add_action_func("get_down"),
  1790. font=FONT,
  1791. width=gui_width,
  1792. height=gui_height,
  1793. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1794. row += 1
  1795. tkinter.Button(
  1796. SCREEN,
  1797. bg=buttom_bg_color,
  1798. fg=word_color,
  1799. text="获得兄标签",
  1800. command=lambda: API.second_add_action_func("get_up"),
  1801. font=FONT,
  1802. width=gui_width,
  1803. height=gui_height,
  1804. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1805. tkinter.Button(
  1806. SCREEN,
  1807. bg=buttom_bg_color,
  1808. fg=word_color,
  1809. text="获得兄弟标签",
  1810. command=lambda: API.second_add_action_func("brothers"),
  1811. font=FONT,
  1812. width=gui_width,
  1813. height=gui_height,
  1814. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1815. tkinter.Button(
  1816. SCREEN,
  1817. bg=buttom_bg_color,
  1818. fg=word_color,
  1819. text="路径定位",
  1820. command=lambda: API.second_add_action_func("get_by_path"),
  1821. font=FONT,
  1822. width=gui_width,
  1823. height=gui_height,
  1824. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1825. column += 3
  1826. tkinter.Label(SCREEN, text="", bg=bg_color, fg=word_color, font=FONT, width=1).grid(
  1827. column=column, row=row
  1828. ) # 设置说明
  1829. column += 1
  1830. row = 0
  1831. tkinter.Label(SCREEN, text="【数据库操作】", bg=bg_color, fg=word_color, font=FONT).grid(
  1832. column=column, row=row, columnspan=3
  1833. ) # 设置说明
  1834. row += 1
  1835. tkinter.Button(
  1836. SCREEN,
  1837. bg=buttom_bg_color,
  1838. fg=word_color,
  1839. text="元素式存入",
  1840. command=lambda: API.to_database(True),
  1841. font=FONT,
  1842. width=gui_width,
  1843. height=gui_height,
  1844. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1845. tkinter.Button(
  1846. SCREEN,
  1847. bg=buttom_bg_color,
  1848. fg=word_color,
  1849. text="正则式存入",
  1850. command=lambda: API.to_database(False),
  1851. font=FONT,
  1852. width=gui_width,
  1853. height=gui_height,
  1854. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1855. tkinter.Button(
  1856. SCREEN,
  1857. bg=buttom_bg_color,
  1858. fg=word_color,
  1859. text="新增数据表",
  1860. command=API.add_database,
  1861. font=FONT,
  1862. width=gui_width,
  1863. height=gui_height,
  1864. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1865. row += 1
  1866. tkinter.Button(
  1867. SCREEN,
  1868. bg=buttom_bg_color,
  1869. fg=word_color,
  1870. text="删除数据表",
  1871. command=API.remove_database,
  1872. font=FONT,
  1873. width=gui_width,
  1874. height=gui_height,
  1875. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1876. tkinter.Button(
  1877. SCREEN,
  1878. bg=buttom_bg_color,
  1879. fg=word_color,
  1880. text="导出数据表",
  1881. command=API.out,
  1882. font=FONT,
  1883. width=gui_width,
  1884. height=gui_height,
  1885. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1886. tkinter.Button(
  1887. SCREEN,
  1888. bg=buttom_bg_color,
  1889. fg=word_color,
  1890. text="关闭数据表",
  1891. command=API.close,
  1892. font=FONT,
  1893. width=gui_width,
  1894. height=gui_height,
  1895. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1896. row += 1
  1897. tkinter.Label(
  1898. SCREEN,
  1899. text="数据存入格式:",
  1900. bg=bg_color,
  1901. fg=word_color,
  1902. font=FONT,
  1903. width=gui_width,
  1904. height=gui_height,
  1905. ).grid(column=column, row=row)
  1906. data_format = tkinter.Entry(SCREEN, width=gui_width * 2)
  1907. data_format.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1908. row += 1
  1909. tkinter.Label(
  1910. SCREEN,
  1911. text="数据表名字:",
  1912. bg=bg_color,
  1913. fg=word_color,
  1914. font=FONT,
  1915. width=gui_width,
  1916. height=gui_height,
  1917. ).grid(column=column, row=row)
  1918. database_name = tkinter.Entry(SCREEN, width=gui_width * 2)
  1919. database_name.grid(
  1920. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1921. )
  1922. row += 1
  1923. database_box = tkinter.Listbox(SCREEN, width=gui_width * 3, height=gui_height * 5)
  1924. database_box.grid(
  1925. column=column,
  1926. row=row,
  1927. columnspan=3,
  1928. rowspan=5,
  1929. sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N,
  1930. )
  1931. row += 5
  1932. tkinter.Label(
  1933. SCREEN,
  1934. text="URL标签:",
  1935. bg=bg_color,
  1936. fg=word_color,
  1937. font=FONT,
  1938. width=gui_width,
  1939. height=gui_height,
  1940. ).grid(column=column, row=row)
  1941. url_tag = tkinter.Entry(SCREEN, width=gui_width * 2)
  1942. url_tag.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1943. row += 1
  1944. tkinter.Button(
  1945. SCREEN,
  1946. bg=buttom_bg_color,
  1947. fg=word_color,
  1948. text="导出页面快照",
  1949. command=lambda: API.second_add_action_func("png"),
  1950. font=FONT,
  1951. width=gui_width,
  1952. height=gui_height,
  1953. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  1954. tkinter.Button(
  1955. SCREEN,
  1956. bg=buttom_bg_color,
  1957. fg=word_color,
  1958. text="回调添加URL",
  1959. command=API.add_url_from_tag,
  1960. font=FONT,
  1961. width=gui_width,
  1962. height=gui_height,
  1963. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  1964. tkinter.Button(
  1965. SCREEN,
  1966. bg=buttom_bg_color,
  1967. fg=word_color,
  1968. text="解析为json",
  1969. command=lambda: API.second_add_action_func("to_json"),
  1970. font=FONT,
  1971. width=gui_width,
  1972. height=gui_height,
  1973. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  1974. row += 1
  1975. tkinter.Label(
  1976. SCREEN,
  1977. text="操作动作链:",
  1978. bg=bg_color,
  1979. fg=word_color,
  1980. font=FONT,
  1981. width=gui_width,
  1982. height=gui_height,
  1983. ).grid(column=column, row=row)
  1984. chains = tkinter.Entry(SCREEN, width=gui_width * 2)
  1985. chains.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  1986. row += 1
  1987. tkinter.Label(
  1988. SCREEN,
  1989. text="拽拖至元素:",
  1990. bg=bg_color,
  1991. fg=word_color,
  1992. font=FONT,
  1993. width=gui_width,
  1994. height=gui_height,
  1995. ).grid(column=column, row=row)
  1996. drag_element = tkinter.Entry(SCREEN, width=gui_width * 2)
  1997. drag_element.grid(
  1998. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  1999. )
  2000. row += 1
  2001. tkinter.Label(
  2002. SCREEN,
  2003. text="拽拖索引:",
  2004. bg=bg_color,
  2005. fg=word_color,
  2006. font=FONT,
  2007. width=gui_width,
  2008. height=gui_height,
  2009. ).grid(column=column, row=row)
  2010. drag_element_index = tkinter.Entry(SCREEN, width=gui_width * 2)
  2011. drag_element_index.grid(
  2012. column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W
  2013. )
  2014. row += 1
  2015. tkinter.Label(
  2016. SCREEN,
  2017. text="键入值:",
  2018. bg=bg_color,
  2019. fg=word_color,
  2020. font=FONT,
  2021. width=gui_width,
  2022. height=gui_height,
  2023. ).grid(column=column, row=row)
  2024. type_value = tkinter.Entry(SCREEN, width=gui_width * 2)
  2025. type_value.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  2026. row += 1
  2027. tkinter.Label(
  2028. SCREEN,
  2029. text="运行时长:",
  2030. bg=bg_color,
  2031. fg=word_color,
  2032. font=FONT,
  2033. width=gui_width,
  2034. height=gui_height,
  2035. ).grid(column=column, row=row)
  2036. run_time = tkinter.Entry(SCREEN, width=gui_width * 2)
  2037. run_time.grid(column=column + 1, row=row, columnspan=2, sticky=tkinter.E + tkinter.W)
  2038. row += 1
  2039. tkinter.Button(
  2040. SCREEN,
  2041. bg=buttom_bg_color,
  2042. fg=word_color,
  2043. text="点击左键",
  2044. command=lambda: API.third_add_action_func("click"),
  2045. font=FONT,
  2046. width=gui_width,
  2047. height=gui_height,
  2048. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2049. tkinter.Button(
  2050. SCREEN,
  2051. bg=buttom_bg_color,
  2052. fg=word_color,
  2053. text="双击左键",
  2054. command=lambda: API.third_add_action_func("double_click"),
  2055. font=FONT,
  2056. width=gui_width,
  2057. height=gui_height,
  2058. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2059. tkinter.Button(
  2060. SCREEN,
  2061. bg=buttom_bg_color,
  2062. fg=word_color,
  2063. text="点击右键",
  2064. command=lambda: API.third_add_action_func("click_right"),
  2065. font=FONT,
  2066. width=gui_width,
  2067. height=gui_height,
  2068. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2069. row += 1
  2070. tkinter.Button(
  2071. SCREEN,
  2072. bg=buttom_bg_color,
  2073. fg=word_color,
  2074. text="按住左键",
  2075. command=lambda: API.third_add_action_func("click_and_hold"),
  2076. font=FONT,
  2077. width=gui_width,
  2078. height=gui_height,
  2079. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2080. tkinter.Button(
  2081. SCREEN,
  2082. bg=buttom_bg_color,
  2083. fg=word_color,
  2084. text="松开左键",
  2085. command=lambda: API.third_add_action_func("release"),
  2086. font=FONT,
  2087. width=gui_width,
  2088. height=gui_height,
  2089. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2090. tkinter.Button(
  2091. SCREEN,
  2092. bg=buttom_bg_color,
  2093. fg=word_color,
  2094. text="拽托元素",
  2095. command=lambda: API.second_add_action_func("drag_and_drop"),
  2096. font=FONT,
  2097. width=gui_width,
  2098. height=gui_height,
  2099. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2100. row += 1
  2101. tkinter.Button(
  2102. SCREEN,
  2103. bg=buttom_bg_color,
  2104. fg=word_color,
  2105. text="移动鼠标",
  2106. command=lambda: API.third_add_action_func("move"),
  2107. font=FONT,
  2108. width=gui_width,
  2109. height=gui_height,
  2110. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2111. tkinter.Button(
  2112. SCREEN,
  2113. bg=buttom_bg_color,
  2114. fg=word_color,
  2115. text="按下按键",
  2116. command=lambda: API.third_add_action_func("key_down"),
  2117. font=FONT,
  2118. width=gui_width,
  2119. height=gui_height,
  2120. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2121. tkinter.Button(
  2122. SCREEN,
  2123. bg=buttom_bg_color,
  2124. fg=word_color,
  2125. text="抬起按键",
  2126. command=lambda: API.third_add_action_func("key_up"),
  2127. font=FONT,
  2128. width=gui_width,
  2129. height=gui_height,
  2130. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2131. is_special_keys = tkinter.IntVar()
  2132. row += 1
  2133. tkinter.Button(
  2134. SCREEN,
  2135. bg=buttom_bg_color,
  2136. fg=word_color,
  2137. text="发送文本到焦点",
  2138. command=lambda: API.third_add_action_func("send_keys"),
  2139. font=FONT,
  2140. width=gui_width,
  2141. height=gui_height,
  2142. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2143. tkinter.Button(
  2144. SCREEN,
  2145. bg=buttom_bg_color,
  2146. fg=word_color,
  2147. text="发送文本",
  2148. command=lambda: API.third_add_action_func("send_keys_to_element"),
  2149. font=FONT,
  2150. width=gui_width,
  2151. height=gui_height,
  2152. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2153. tkinter.Checkbutton(
  2154. SCREEN,
  2155. bg=bg_color,
  2156. fg=word_color,
  2157. activebackground=bg_color,
  2158. activeforeground=word_color,
  2159. selectcolor=bg_color,
  2160. text="转换为特殊按钮",
  2161. variable=is_special_keys,
  2162. ).grid(column=column + 2, row=row, sticky=tkinter.W)
  2163. row += 1
  2164. tkinter.Button(
  2165. SCREEN,
  2166. bg=buttom_bg_color,
  2167. fg=word_color,
  2168. text="生成动作链",
  2169. command=lambda: API.third_add_action_func("make_ActionChains"),
  2170. font=FONT,
  2171. width=gui_width,
  2172. height=gui_height,
  2173. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2174. tkinter.Button(
  2175. SCREEN,
  2176. bg=buttom_bg_color,
  2177. fg=word_color,
  2178. text="运行动作链",
  2179. command=lambda: API.third_add_action_func("ActionChains_run"),
  2180. font=FONT,
  2181. width=gui_width,
  2182. height=gui_height,
  2183. ).grid(column=column + 1, columnspan=2, row=row, sticky=tkinter.E + tkinter.W)
  2184. row += 1
  2185. tkinter.Button(
  2186. SCREEN,
  2187. bg=buttom_bg_color,
  2188. fg=word_color,
  2189. text="获取当前窗口",
  2190. command=lambda: API.first_add_action_func("get_now_windows"),
  2191. font=FONT,
  2192. width=gui_width,
  2193. height=gui_height,
  2194. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2195. tkinter.Button(
  2196. SCREEN,
  2197. bg=buttom_bg_color,
  2198. fg=word_color,
  2199. text="获取所有窗口",
  2200. command=lambda: API.first_add_action_func("get_all_windows"),
  2201. font=FONT,
  2202. width=gui_width,
  2203. height=gui_height,
  2204. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2205. tkinter.Button(
  2206. SCREEN,
  2207. bg=buttom_bg_color,
  2208. fg=word_color,
  2209. text="切换窗口",
  2210. command=lambda: API.first_add_action_func("switch_to_windwos"),
  2211. font=FONT,
  2212. width=gui_width,
  2213. height=gui_height,
  2214. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2215. row += 1
  2216. tkinter.Button(
  2217. SCREEN,
  2218. bg=buttom_bg_color,
  2219. fg=word_color,
  2220. text="暴力等待",
  2221. command=lambda: API.first_add_action_func("wait_sleep"),
  2222. font=FONT,
  2223. width=gui_width,
  2224. height=gui_height,
  2225. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2226. tkinter.Button(
  2227. SCREEN,
  2228. bg=buttom_bg_color,
  2229. fg=word_color,
  2230. text="元素检查等待",
  2231. command=lambda: API.first_add_action_func("set_wait"),
  2232. font=FONT,
  2233. width=gui_width,
  2234. height=gui_height,
  2235. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2236. tkinter.Button(
  2237. SCREEN,
  2238. bg=buttom_bg_color,
  2239. fg=word_color,
  2240. text="运行js",
  2241. command=lambda: API.first_add_action_func("run_JS"),
  2242. font=FONT,
  2243. width=gui_width,
  2244. height=gui_height,
  2245. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2246. row += 1
  2247. tkinter.Button(
  2248. SCREEN,
  2249. bg=buttom_bg_color,
  2250. fg=word_color,
  2251. text="页面后退",
  2252. command=lambda: API.first_add_action_func("back"),
  2253. font=FONT,
  2254. width=gui_width,
  2255. height=gui_height,
  2256. ).grid(column=column, row=row, sticky=tkinter.E + tkinter.W)
  2257. tkinter.Button(
  2258. SCREEN,
  2259. bg=buttom_bg_color,
  2260. fg=word_color,
  2261. text="页面刷新",
  2262. command=lambda: API.first_add_action_func("refresh"),
  2263. font=FONT,
  2264. width=gui_width,
  2265. height=gui_height,
  2266. ).grid(column=column + 1, row=row, sticky=tkinter.E + tkinter.W)
  2267. tkinter.Button(
  2268. SCREEN,
  2269. bg=buttom_bg_color,
  2270. fg=word_color,
  2271. text="页面前进",
  2272. command=lambda: API.first_add_action_func("forward"),
  2273. font=FONT,
  2274. width=gui_width,
  2275. height=gui_height,
  2276. ).grid(column=column + 2, row=row, sticky=tkinter.E + tkinter.W)
  2277. SCREEN.update() # 要预先update一下,否则会卡住
  2278. save_dir = askdirectory(title="选择项目位置", must=True) # 项目位置
  2279. url = crawler.controller.Url(save_dir, save_dir) # url管理器
  2280. loader = crawler.controller.PageDownloader(url, save_dir) # 页面下载器
  2281. page_parser = crawler.controller.PageParser(loader) # 页面解析器
  2282. database = crawler.template.data_base # 数据库