amro_progress.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. import base64
  2. import hashlib
  3. import hmac
  4. import json
  5. import urllib.parse
  6. from queue import Queue
  7. import requests
  8. from selenium import webdriver
  9. from bs4 import BeautifulSoup
  10. import time
  11. #driver = webdriver.Chrome() # Chrome浏览器
  12. from selenium.common import exceptions
  13. from selenium.webdriver import Keys, ActionChains
  14. from selenium.webdriver.common.by import By
  15. from selenium.webdriver.support.wait import WebDriverWait
  16. from selenium.webdriver.support import expected_conditions as EC
  17. class amro():
  18. def __init__(self):
  19. try:
  20. self.driver = webdriver.Edge()
  21. self.actions = ActionChains(self.driver)
  22. except:
  23. self.driver = webdriver.Chrome()
  24. self.actions = ActionChains(self.driver)
  25. self.url = r"http://me.sichuanair.com/login.shtml"
  26. self.username = "022673"
  27. self.password = "yBQG71@8FC"
  28. self.activeMode=""
  29. self.q = Queue()
  30. self.q2 = Queue()
  31. def openWeb(self, url):
  32. self.driver.get(url)
  33. self.q.put("cz")
  34. #打开并登录
  35. def openAmro(self):
  36. self.driver.get(self.url)
  37. WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'singleSubmit')))
  38. self.timerSingal()
  39. loginbtn = self.driver.find_element('id', 'singleSubmit')
  40. time.sleep(0.5)
  41. self.actions.click(loginbtn)
  42. self.actions.perform()
  43. WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "j_username"))).send_keys(self.username)
  44. time.sleep(0.5)
  45. self.driver.find_element('name', "j_password").send_keys(self.password)
  46. time.sleep(0.5)
  47. self.driver.find_element('name', "j_password").send_keys(Keys.ENTER)
  48. #进入工作指令WO,获取工作包
  49. def WO(self):
  50. self.timerSingal()
  51. self.driver.switch_to.parent_frame()
  52. time.sleep(0.5)
  53. nav_lables = WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'nav-label')))
  54. for i in nav_lables:
  55. print(i.text)
  56. title = i.text
  57. if title == '航线维修':
  58. self.actions.click(i)
  59. self.actions.perform()
  60. time.sleep(2)
  61. break
  62. subtitle = WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'J_menuItem')))
  63. # subtitle = driver.find_elements(By.CLASS_NAME,'J_menuItem')
  64. for i in subtitle:
  65. title = i.text
  66. print(title)
  67. if title == "工作指令(WO)管理":
  68. self.actions.click(i)
  69. self.actions.perform()
  70. time.sleep(1)
  71. break
  72. fr = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "iframe")))
  73. print(len(fr))
  74. self.driver.switch_to.frame(1)
  75. jd = WebDriverWait(self.driver, 30).until(
  76. EC.presence_of_element_located((By.CSS_SELECTOR, '.tdr:nth-child(8) .textbox-icon')))
  77. # jd = driver.find_element(By.CSS_SELECTOR, '.tdr:nth-child(8) .textbox-icon')
  78. self.actions.click(jd)
  79. self.actions.perform()
  80. time.sleep(1)
  81. tf = self.driver.find_element(By.ID, '_easyui_combobox_i1_1')
  82. self.actions.click(tf)
  83. self.actions.perform()
  84. time.sleep(1)
  85. search = self.driver.find_element(By.CSS_SELECTOR, 'td:nth-child(10) > .searchBtn > span')
  86. self.actions.click(search)
  87. self.actions.perform()
  88. WebDriverWait(self.driver, 30).until_not(EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  89. page = WebDriverWait(self.driver, 30).until(
  90. EC.presence_of_element_located((By.CSS_SELECTOR, '#tt > .panel td:nth-child(1) > input')))
  91. # page = driver.find_element(By.CSS_SELECTOR, '#tt > .panel td:nth-child(1) > input')
  92. page.clear()
  93. page.send_keys('999')
  94. page.send_keys(Keys.ENTER)
  95. time.sleep(1)
  96. WebDriverWait(self.driver, 30).until_not(EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  97. # input("page end")
  98. time.sleep(1)
  99. # time.sleep(10)
  100. content = self.driver.find_element(By.CSS_SELECTOR, '#tt > .panel .datagrid-view2 > .datagrid-body').get_attribute(
  101. "outerHTML")
  102. print(content)
  103. with open('work{}.txt'.format(str(int(time.time()))), 'wb') as f:
  104. f.write(content.encode('utf-8'))
  105. def openMaintitle(self, first):
  106. self.timerSingal()
  107. self.driver.switch_to.parent_frame()
  108. time.sleep(0.5)
  109. nav_lables = WebDriverWait(self.driver, 10).until(
  110. EC.presence_of_all_elements_located((By.CLASS_NAME, 'nav-label')))
  111. for i in nav_lables:
  112. print(i.text)
  113. title = i.text
  114. if title == first:
  115. self.actions.click(i)
  116. self.actions.perform()
  117. time.sleep(2)
  118. break
  119. def openSubTitle(self, second):
  120. self.timerSingal()
  121. self.driver.switch_to.parent_frame()
  122. subtitle = WebDriverWait(self.driver, 10).until(
  123. EC.presence_of_all_elements_located((By.CLASS_NAME, 'J_menuItem')))
  124. # subtitle = driver.find_elements(By.CLASS_NAME,'J_menuItem')
  125. for i in subtitle:
  126. title = i.text
  127. print(title)
  128. if title == second:
  129. self.actions.click(i)
  130. self.actions.perform()
  131. time.sleep(1)
  132. break
  133. def getActiveTitle(self):
  134. self.timerSingal()
  135. self.driver.switch_to.parent_frame()
  136. activeTitle = self.driver.find_element(By.CSS_SELECTOR, ".active > span")
  137. print(activeTitle.text)
  138. return activeTitle.text
  139. def changeToTitle(self, title):
  140. self.timerSingal()
  141. self.driver.switch_to.parent_frame()
  142. activeTitle = self.getActiveTitle()
  143. try:
  144. self.driver.find_element(By.CSS_SELECTOR, '.J_menuTab:nth-child(2) > span')
  145. except:
  146. try:
  147. self.driver.find_element(By.CSS_SELECTOR, '.J_menuTab:nth-child(3) > span')
  148. except:
  149. print('未找到 {}'.format(title))
  150. def getWOData(self):
  151. self.timerSingal()
  152. self.reStartWebDrive()
  153. self.isLogining()
  154. if self.activeMode=="工作指令(WO)管理":
  155. search = self.driver.find_element(By.CSS_SELECTOR, 'td:nth-child(10) > .searchBtn > span')
  156. self.actions.click(search)
  157. self.actions.perform()
  158. WebDriverWait(self.driver, 30).until_not(
  159. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  160. else:
  161. fr = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "iframe")))
  162. print(len(fr))
  163. self.driver.switch_to.frame(1)
  164. jd = WebDriverWait(self.driver, 30).until(
  165. EC.presence_of_element_located((By.CSS_SELECTOR, '.tdr:nth-child(8) .textbox-icon')))
  166. # jd = driver.find_element(By.CSS_SELECTOR, '.tdr:nth-child(8) .textbox-icon')
  167. self.actions.click(jd)
  168. self.actions.perform()
  169. time.sleep(1)
  170. tf = self.driver.find_element(By.ID, '_easyui_combobox_i1_1')
  171. self.actions.click(tf)
  172. self.actions.perform()
  173. time.sleep(1)
  174. search = self.driver.find_element(By.CSS_SELECTOR, 'td:nth-child(10) > .searchBtn > span')
  175. self.actions.click(search)
  176. self.actions.perform()
  177. WebDriverWait(self.driver, 30).until_not(
  178. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  179. page = WebDriverWait(self.driver, 30).until(
  180. EC.presence_of_element_located((By.CSS_SELECTOR, '#tt > .panel td:nth-child(1) > input')))
  181. # page = driver.find_element(By.CSS_SELECTOR, '#tt > .panel td:nth-child(1) > input')
  182. page.clear()
  183. page.send_keys('999')
  184. page.send_keys(Keys.ENTER)
  185. time.sleep(1)
  186. WebDriverWait(self.driver, 30).until_not(
  187. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  188. # input("page end")
  189. time.sleep(1)
  190. # time.sleep(10)
  191. self.activeMode="工作指令(WO)管理"
  192. content = self.driver.find_element(By.CSS_SELECTOR,
  193. '#tt > .panel .datagrid-view2 > .datagrid-body').get_attribute(
  194. "outerHTML")
  195. print(content)
  196. with open('work{}.txt'.format(str(int(time.time()))), 'wb') as f:
  197. f.write(content.encode('utf-8'))
  198. soup = BeautifulSoup(content, 'html5lib')
  199. data_list = []
  200. try:
  201. for idx, tr in enumerate(soup.find_all('tr')):
  202. tds = tr.find_all('td')
  203. data_list.append({
  204. '状态': tds[3].contents[0].contents[0],
  205. '机号': tds[4].contents[0].contents[0],
  206. '时间': tds[8].contents[0].contents[0].replace('\n', '').replace(' ', ''),
  207. '内容': tds[10].contents[0].contents[0].replace('\n', '').replace(' ', '')
  208. })
  209. except IndexError as e:
  210. print(e)
  211. print(data_list)
  212. return data_list
  213. def getFlightData(self, *args):
  214. self.timerSingal()
  215. self.reStartWebDrive('航班动态')
  216. self.isLogining('航班动态')
  217. self.driver.switch_to.parent_frame()
  218. fr = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "iframe")))
  219. self.driver.switch_to.frame(1)
  220. print(len(fr))
  221. WebDriverWait(self.driver, 30).until_not(
  222. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  223. notview = self.driver.find_element(By.ID, 'notView')
  224. if notview.is_selected():
  225. print("取消勾选")
  226. self.actions.click(notview)
  227. self.actions.perform()
  228. time.sleep(1)
  229. searchbtn = self.driver.find_element(By.CSS_SELECTOR, '.searchBtn > span')
  230. self.actions.click(searchbtn)
  231. self.actions.perform()
  232. time.sleep(1)
  233. WebDriverWait(self.driver, 30).until_not(
  234. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  235. if args !=():
  236. date = self.driver.find_element(By.CSS_SELECTOR, '.datebox > .textbox-text')
  237. date.clear()
  238. time.sleep(0.5)
  239. date.send_keys(args[0])
  240. time.sleep(0.5)
  241. self.actions.click(searchbtn)
  242. self.actions.perform()
  243. WebDriverWait(self.driver, 30).until_not(
  244. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  245. flightDataContent = self.driver.find_element(By.CSS_SELECTOR,
  246. '.datagrid-view2 > .datagrid-body').get_attribute("outerHTML")
  247. print(flightDataContent)
  248. if args!=():
  249. with open('./static/flightdata/flight{}.txt'.format(args[0]),'wb') as f:
  250. f.write(flightDataContent.encode('utf-8'))
  251. else:
  252. with open('./static/flightdata/flight{}.txt'.format(time.strftime("%Y%m%d", time.localtime())),'wb') as f:
  253. f.write(flightDataContent.encode('utf-8'))
  254. soup = BeautifulSoup(flightDataContent, "html5lib")
  255. flight_list=[]
  256. for idx, tr in enumerate(soup.find_all('tr')):
  257. tds = tr.find_all('td')
  258. temp_list = []
  259. for i in tds:
  260. try:
  261. temp = i.contents[0].contents[0].contents[0]
  262. except:
  263. try:
  264. temp = i.contents[0].contents[0]
  265. except:
  266. temp = ""
  267. temp_list.append(temp)
  268. flight_list.append({
  269. "机号": temp_list[0],
  270. "机型": temp_list[1],
  271. "发动机": temp_list[2],
  272. "航班号": temp_list[3],
  273. "进港起飞": temp_list[4],
  274. "进港到达时间": temp_list[5],
  275. "航站": temp_list[6],
  276. "离港起飞时间": temp_list[7],
  277. "离港到达": temp_list[8],
  278. "进港机位": temp_list[9],
  279. "离港机位": temp_list[10],
  280. "保留": temp_list[11],
  281. "任务类型": temp_list[12],
  282. "随机": temp_list[13],
  283. "维修人员": temp_list[14],
  284. "放行人员": temp_list[15],
  285. "工作状态": temp_list[16],
  286. "工作状态时间": temp_list[17],
  287. "重要航班": temp_list[18],
  288. "备降/返航": temp_list[19],
  289. "延误": temp_list[20],
  290. "附加信息": temp_list[21],
  291. })
  292. print(flight_list)
  293. return flight_list
  294. # .datagrid-view2 > .datagrid-body 数据
  295. # .searchBtn > span 查询
  296. # .datagrid-mask-msg 查询中
  297. def searchFlight(self, *args):
  298. self.reStartWebDrive('航班动态')
  299. self.isLogining('航班动态')
  300. self.driver.switch_to.parent_frame()
  301. fr = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "iframe")))
  302. self.driver.switch_to.frame(1)
  303. print(len(fr))
  304. WebDriverWait(self.driver, 30).until_not(
  305. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  306. notview = self.driver.find_element(By.ID, 'notView')
  307. if notview.is_selected():
  308. print("取消勾选")
  309. self.actions.click(notview)
  310. self.actions.perform()
  311. time.sleep(1)
  312. searchbtn = self.driver.find_element(By.CSS_SELECTOR, '.searchBtn > span')
  313. self.actions.click(searchbtn)
  314. self.actions.perform()
  315. time.sleep(1)
  316. WebDriverWait(self.driver, 30).until_not(
  317. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  318. if args !=():
  319. date = self.driver.find_element(By.CSS_SELECTOR, '.datebox > .textbox-text')
  320. date.clear()
  321. time.sleep(0.5)
  322. date.send_keys(args[0])
  323. time.sleep(0.5)
  324. self.actions.click(searchbtn)
  325. self.actions.perform()
  326. WebDriverWait(self.driver, 30).until_not(
  327. EC.presence_of_element_located((By.CSS_SELECTOR, '.datagrid-mask-msg')))
  328. flightDataContent = self.driver.find_element(By.CSS_SELECTOR,
  329. '.datagrid-view2 > .datagrid-body').get_attribute("outerHTML")
  330. #print(flightDataContent)
  331. if args != ():
  332. with open('./static/flightdata/flight{}.txt'.format(args[0]), 'wb') as f:
  333. f.write(flightDataContent.encode('utf-8'))
  334. else:
  335. with open('./static/flightdata/flight{}.txt'.format(time.strftime("%Y%m%d", time.localtime())), 'wb') as f:
  336. f.write(flightDataContent.encode('utf-8'))
  337. soup = BeautifulSoup(flightDataContent, "html5lib")
  338. flight_list = []
  339. for idx, tr in enumerate(soup.find_all('tr')):
  340. tds = tr.find_all('td')
  341. temp_list = []
  342. for i in tds:
  343. try:
  344. temp = i.contents[0].contents[0].contents[0]
  345. except:
  346. try:
  347. temp = i.contents[0].contents[0]
  348. except:
  349. temp = ""
  350. temp_list.append(temp)
  351. flight_list.append({
  352. "机号": temp_list[0],
  353. "机型": temp_list[1],
  354. "发动机": temp_list[2],
  355. "航班号": temp_list[3],
  356. "进港起飞": temp_list[4],
  357. "进港到达时间": temp_list[5],
  358. "航站": temp_list[6],
  359. "离港起飞时间": temp_list[7],
  360. "离港到达": temp_list[8],
  361. "进港机位": temp_list[9],
  362. "离港机位": temp_list[10],
  363. "保留": temp_list[11],
  364. "任务类型": temp_list[12],
  365. "随机": temp_list[13],
  366. "维修人员": temp_list[14],
  367. "放行人员": temp_list[15],
  368. "工作状态": temp_list[16],
  369. "工作状态时间": temp_list[17],
  370. "重要航班": temp_list[18],
  371. "备降/返航": temp_list[19],
  372. "延误": temp_list[20],
  373. "附加信息": temp_list[21],
  374. })
  375. print(flight_list)
  376. return flight_list
  377. def isLogining(self, *args):
  378. self.timerSingal()
  379. try:
  380. notLogining = self.driver.find_element(By.CSS_SELECTOR, '.layui-layer-content')
  381. print(notLogining.text)
  382. btn = self.driver.find_element(By.CSS_SELECTOR, '.layui-layer-btn0')
  383. self.actions.click(btn)
  384. WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'singleSubmit')))
  385. loginbtn = self.driver.find_element('id', 'singleSubmit')
  386. time.sleep(0.5)
  387. self.actions.click(loginbtn)
  388. self.actions.perform()
  389. WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "j_username"))).send_keys(
  390. self.username)
  391. time.sleep(0.5)
  392. self.driver.find_element('name', "j_password").send_keys(self.password)
  393. time.sleep(0.5)
  394. self.driver.find_element('name', "j_password").send_keys(Keys.ENTER)
  395. # if self.activeMode == "工作指令(WO)管理":
  396. # self.openMaintitle("航线维修")
  397. # self.openSubTitle("工作指令(WO)管理")
  398. # self.activeMode = ""
  399. self.openMaintitle("航线维修")
  400. if args!=():
  401. self.openSubTitle(args[0])
  402. else:
  403. self.openSubTitle("工作指令(WO)管理")
  404. except exceptions.NoSuchElementException as e:
  405. print("已登录")
  406. print(e)
  407. def quitWeb(self):
  408. self.driver.quit()
  409. self.driver = None
  410. def webDriveIsAvailable(self):
  411. object_existed = False
  412. if self.driver is not None:
  413. try:
  414. self.driver.execute_script('javascript:void(0);')
  415. object_existed = True
  416. except:
  417. # webdriver要求浏览器执行Javascript出现异常
  418. try:
  419. self.driver.quit()
  420. finally:
  421. self.driver = None
  422. finally:
  423. return object_existed
  424. def reStartWebDrive(self, *args):
  425. if not self.webDriveIsAvailable():
  426. try:
  427. self.driver = webdriver.Edge()
  428. self.actions = ActionChains(self.driver)
  429. except:
  430. self.driver = webdriver.Chrome()
  431. self.actions = ActionChains(self.driver)
  432. self.openAmro()
  433. self.openMaintitle("航线维修")
  434. if args!=():
  435. self.openSubTitle(args[0])
  436. else:
  437. self.openSubTitle("工作指令(WO)管理")
  438. self.activeMode = ""
  439. def timerSingal(self):
  440. print("发送指令---")
  441. if self.webDriveIsAvailable():
  442. print("发送持续指令")
  443. self.q.put("cz")
  444. else:
  445. print("发送重启指令")
  446. self.q2.put("cz2")
  447. self.reStartWebDrive()
  448. def directSendMsg(self, msg, atuser):
  449. timestamp = str(round(time.time() * 1000))
  450. secret = 'SEC185f68b4fbce62bb7cfc72ef3d84444e7b9781e602716af36c50bf52c8cee791'
  451. secret_enc = secret.encode('utf-8')
  452. string_to_sign = '{}\n{}'.format(timestamp, secret)
  453. string_to_sign_enc = string_to_sign.encode('utf-8')
  454. hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
  455. sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
  456. # print(timestamp)
  457. # print(sign)
  458. headers = {'Content-Type': 'application/json'} # 定义数据类型
  459. webhook = 'https://oapi.dingtalk.com/robot/send?access_token=56a4674577a0f034fda2ec99cb5e8c31d9e2cb53151cd019691ce62430e9da39&timestamp=' + timestamp + "&sign=" + sign
  460. atTittle = ""
  461. for n in atuser:
  462. atTittle += "@{}".format(n)
  463. data = {
  464. "msgtype": "markdown",
  465. "markdown": {
  466. "title": "定时通知",
  467. "text": "{}{}".format(atTittle, msg)
  468. },
  469. "at": {
  470. "atMobiles": atuser,
  471. "isAtAll": False
  472. }
  473. }
  474. res = requests.post(webhook, data=json.dumps(data), headers=headers) # 发送post请求
  475. print(res.text)
  476. def searchJob(self):
  477. nmsg = ""
  478. data_list = self.getWOData()
  479. for i in data_list:
  480. nmsg += self.createMsg(i['机号'], i['状态'], i['时间'], i['内容'])
  481. self.directSendMsg(nmsg, ['13032201605'])
  482. def createMsg(self, bnum, state, times, cont):
  483. MSG = """
  484. #### 机号:{}
  485. ##### 状态:{}
  486. ##### 时间:{}
  487. ##### 内容:{}
  488. ###### ------------------------
  489. """.format(bnum, state, times, cont)
  490. return MSG
  491. if __name__ == '__main__':
  492. AMRO = amro()
  493. # AMRO.openWeb('https://www.baidu.com')
  494. # print(AMRO.webDriveIsAvailable())
  495. # AMRO.quitWeb()
  496. # print(AMRO.webDriveIsAvailable())
  497. AMRO.openAmro()
  498. AMRO.openMaintitle("航线维修")
  499. #AMRO.openSubTitle("工作指令(WO)管理")
  500. AMRO.openSubTitle("航班动态")
  501. AMRO.getFlightData()
  502. #AMRO.WO()
  503. #time.sleep(5)
  504. #AMRO.quitWeb()