【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/.send 发送请求,就可以收到消息啦。

七、完整代码

#!/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,具体参考上文描述。如果点一下还觉得累就去服务器做个定时任务吧。这次水文就到这了。

posted @ 2022-05-12 12:15  Master先生  阅读(39)  评论(0编辑  收藏  举报