【Python开发】那些年因填报体温困扰了我的双手
一、起因
因为这些天要求报体温限制了我的双手,还时不时的给忘了。怎么办,自动化吧!怎么自动化,直接服务器定时任务吧。这里因为从调试到服务器定时任务并实现任务通知,整个的流程比较复杂,我就简单说一下自己开发的思路吧。个人娱乐,大佬轻喷。毕竟这种不起眼的脚本也就只有我好意思拿得出手。好久没更新文章了,水一下。(既然不能搞漏洞复现就安心写开发)
二、问题需求
使用的操作还是相对比较复杂的,这里简单罗列一下吧。后文对比较复杂的操作进行详细介绍。
- 谷歌自动化
- 登录界面验证码识别
- 本地图片上传
- 识别弹窗
- xpath解析
- 完成提醒
三、验证码
这里用了第三方,一个打码平台。毕竟验证码识别这东西一块钱可以识别很多次,没必要去自己做。当然不嫌麻烦可以去卷积神经网络做深度学习。我感觉没必要吧,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,具体参考上文描述。如果点一下还觉得累就去服务器做个定时任务吧。这次水文就到这了。
本文来自博客园,作者:Master先生,转载请注明原文链接:https://www.cnblogs.com/mastersir/p/16261963.html