因为这些天要求报体温限制了我的双手,还时不时的给忘了。怎么办,自动化吧!怎么自动化,直接服务器定时任务吧。这里因为从调试到服务器定时任务并实现任务通知,整个的流程比较复杂,我就简单说一下自己开发的思路吧。个人娱乐,大佬轻喷。毕竟这种不起眼的脚本也就只有我好意思拿得出手。好久没更新文章了,水一下。(既然不能搞漏洞复现就安心写开发)
使用的操作还是相对比较复杂的,这里简单罗列一下吧。后文对比较复杂的操作进行详细介绍。
这里用了第三方,一个打码平台。毕竟验证码识别这东西一块钱可以识别很多次,没必要去自己做。当然不嫌麻烦可以去卷积神经网络做深度学习。我感觉没必要吧,API它不香吗。现成的模块,直接调用就ok了。
使用selenium做自动化时,我们经常会遇到的一个让人头疼的问题就是文件上传。问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,问题就解决了。分析HTML,发现无论是普通前台还是Extjs,他们的html有一个共同的特点,具有以下代码:
<input ..... type="file" ...../>
我们可以使用selenium自带的sendkeys把文件路径(相对绝对无所谓)传给该元素,就可绕过选择窗口直接上传文件。
解决方案: driver.find_element_by_name(XXXXX).sendKeys("filePath")定位元素根据情况而定,有时候用name定位不到时,可使用xpath进行定位。如:driver.find_element_by_xpath("//li[@id='img_list_1']/
input[@type='file']").send_keys('E:\imgs/1.png')
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
任务完成后的机器人提醒有跟多种。我这里简单讲一下最简单的Server酱。当然我还是习惯调用钉钉API。
Server酱是什么?
Server酱」,英文名「ServerChan」,是一款「手机」和「服务器」、「智能设备」之间的通信软件。
说人话?就是从服务器、路由器等设备上推消息到手机的工具。
开通并使用上它,只需要一分钟:
微信扫码登入
设置消息通道
发消息,一般有两种方式:在支持Server酱的软件界面或配置文件中填入SendKey,即可使用。你也可以自己往 https://sctapi.ftqq.com/
#!/user/bin/ # -*- coding:UTF-8 -*- # Author:Master from selenium import webdriver from time import sleep from PIL import Image # 打码平台,网站自行注册http://ttshitu.com/ from 打码平台 import base64_api import time from selenium.webdriver.support.select import Select ren={'姓名':'身份证号',} for key,value in ren.items(): sfz = value passwd = sfz[12:] path = r'./chromedriver' print(key+'正在填报体温!') driver = webdriver.Chrome(executable_path=path) # 考虑网站安全性,自行修改网址 driver.get("https://www.cnblogs.com/mastersir/p/16261963.html") #账号登录 driver.find_element_by_xpath('//*[@id="name"]').send_keys(sfz) sleep(1) driver.find_element_by_xpath('//*[@id="password"]').send_keys(passwd) sleep(2) #保存验证码 driver.save_screenshot('aa.png') rangle = ( int(1948), int(587), int(2222), int(645)) i = Image.open('./aa.png') code_img_name = './code.png' frame = i.crop(rangle) frame.save(code_img_name) img_path = './code.png' # 打码平台账号密码 code = base64_api(uname='admin', pwd='admin', img=img_path) sleep(1) #输入验证码登录 driver.find_element_by_xpath('//*[@id="veryCode"]').send_keys(code) sleep(2) driver.find_element_by_xpath('//*[@id="denglu"]').click() Cookies=driver.get_cookies() Cookies = Cookies[0]['name'] +'=' + Cookies[0]['value'] #填报体温 sleep(1) driver.get('http://wwww.yunxs.top/student/student/healthReport/healthReportList.jsp') time.sleep(1) driver.find_element_by_xpath('/html/body/form/div/button').click() sleep(1) s = driver.find_element_by_xpath('/html/body/form/div/div/div[4]/div/div[2]/div[1]/div/select') Select(s).select_by_visible_text("正常") s.click() time.sleep(1) y = driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[3]/div/select') Select(y).select_by_visible_text("是") y.click() time.sleep(1) driver.find_element_by_xpath('/html/body/form/div/div/div[4]/div/div[2]/div[6]/div/input').send_keys("正常") driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[7]/div/input').send_keys("正常") sleep(1) s2= Select(driver.find_element_by_id('province')) s2.select_by_value('XX省') time.sleep(1) s3= Select(driver.find_element_by_id('city')) s3.select_by_value('XX市') time.sleep(1) s4= Select(driver.find_element_by_id('district')) s4.select_by_value('XX市') sleep(1) jsString = "document.getElementsByClassName('form-control dingWeiInfo')[0].removeAttribute('readonly')" driver.execute_script(jsString) driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[10]/div[1]/input').send_keys("XX省XX市XX区XX路") sleep(2) upload = driver.find_element_by_xpath('//*[@id="imgUplod"]') # 上传图片路径 upload.send_keys('/Users/Downloads/xck.jpeg') sleep(1) driver.find_element_by_xpath('//*[@id="text"]/div[5]/button').click() sleep(1) # 确认弹窗 alert=driver.switch_to.alert alert.accept() print('\033[1;35m 已完成 \033[0m') print('-'*30) sleep(3)
八、总结
脚本用了最基础的方法。通过selenium实现谷歌自动化模拟点击屏幕。验证码识别由于是代码生成的,最后非图片格式,所以无法直接进行下载处理。这里解决办法是截屏,定位截取验证码,在进行识别。在图片上传操作的时候容易获取错误xpath,具体参考上文描述。如果点一下还觉得累就去服务器做个定时任务吧。这次水文就到这了。