python+selenium 实现疫情自动填报(前面两个都不会也可以做)

0.前言

疫情如此严峻,学校也每日监督每个学生去打卡,可能由于某天因为事情耽搁了,导员在大群里@我的时候就很尴尬,就想着学习一下如何实现自动打卡。也在网上找了很多博客,发现好像都很复杂,也难以入手。没得办法最后只得硬挑一个博客去看去学习。
在过程中也发现基本上是两种方法去实现自动打卡的:

  • 模拟客户端向服务端直接发送报文
  • 利用浏览器驱动去模仿人操作浏览器去填报

个人觉得第二个方法简单一点,所需知识也不多(真正大佬请忽略)。

1.安装python和selenium以及浏览器驱动(chrome为例)

1.1安装python

Python官网:https://www.python.org/ 不过速度较慢
百度网盘:本人使用的版本 为python 3.7.1
链接:https://pan.baidu.com/s/1SudrBM5ILIyTReImZrDGuA
提取码:410n
下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。
如果没有填加到环境变量中,请添加至环境变量中:
在这里插入图片描述

1.2安装selenium

selenium是一个浏览器为web自动化测试工具,原本是用来检测浏览器的。由于selenium可以控制浏览器,即用selenium打开的浏览器内容都可以通过特定的方式获取到。一般用于获取javaScript动态渲染的页面。
最简单的方法:win+r打开命令行,输入:

pip install selenium 

静待安装完成。安装完成后,在输入:

pip list

即可查看是否安装成功。在这里插入图片描述
如果说过程中报错了或者没有成功。可能是没有下载pycharm。请参考下载教程:https://www.runoob.com/w3cnote/pycharm-windows-install.html
下载专业版本(教师或者学生可以免费使用,具体申请可以自行百度),
如果先麻烦的话,社区版完全免费,对于此项目也是完全可行的。

1.3下载对应浏览器驱动(以chrome为例)

1.3.1查看自己的浏览器版本

浏览器地址栏输入:chrome://version 会得到关于你的chrome浏览器的具体信息。以下为部分截图:在这里插入图片描述
例如 我使用的就是上图中第一行所写的:78.0.3904.70 (正式版本)

1.3.2下载对应浏览器驱动

下载地址:

下载完成后,进行解压。解压后将webdriver移动/复制到chrome浏览器安装目录下。在这里插入图片描述
最后将chrome.exe的路径添加到环境变量的path中去:
在这里插入图片描述

2.编写代码

这一部分是核心,却也是最简单的部分。因为此次使用的方法是模拟浏览器操作,想一想也就两步:

  1. 找到一个元素
  2. 输入或者点击

完事了!!!
本文是以西工大和西电的健康填报为例。

2.1定位一个元素

selenium webdriver中有很多的定位方法:
By.id()、By.xpath()、By.linkText()、By.partialLinkText() 、By.tagName() 、By.className()、By.cssSelector()等等
通过名字也都可以看出来,无非是每一个标签的id、name、class、xpath等等去定位的。在网页中摁f12,可以查看源代码。就能准确获知每一个标签的属性了,通过属性去定位就OK了。
本人说一下我使用的最笨的方法,不管你啥标签,我都是用xpath去定位,又准又好(对于一些学习前端的小伙伴,建议都去试一试)。
那么xpath是什么呢?问得好,不知道,自个百度吧,我也讲不清
虽然讲不清,但是不妨碍我去获取标签的xpath:
f12打开源代码,找到网页上对应的元素。右键单击-》copy-》copy xpath 。
这样就讲该元素的xpath复制到了剪贴板了。
使用下面这个函数就可以定位了:
driver.find_element_by_xpath()
其他的也一样例如:
driver.find_element_by_partial_link_text()

2.2 对定位到的元素模拟操作。

  • 点击:调用click()函数就模拟了一次点击
  • 清空文本框:clear()
  • 输入文本:send_keys()
    以上内容就足以填写所有的东西了。

2.3大功告成,完整代码(供参考,内为西工大和西电)

西工大版本(可以提交多次,拿来作实验):

from selenium import webdriver
import time

#西工大
# 打开chrome浏览器
driver = webdriver.Chrome()
# 进入健康情况填报官网
url = r'http://yqtb.nwpu.edu.cn/wx/xg/yz-mobile/index.jsp'
driver.get(url)
# 最大化窗口
driver.maximize_window()
# 登录信息
username = driver.find_element_by_id('username')
stu_number = '自己的学号'
username.send_keys(stu_number)
stu_password = '自己的密码'
password = driver.find_element_by_id('password')
password.send_keys(stu_password)
# 点击登录
driver.find_element_by_class_name('submit_button').click()
time.sleep(1)
# 点击健康登记
driver.find_element_by_partial_link_text('健康登记').click()

# 因为西工大会自动记录上一天的信息,所以不需要填报其他信息可直接提交
'''
#如果需要更改一些内容可参考以下代码
# 当前所在位置
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[3]/label[3]').click()

# 由于本人选取的国内,所有还有省市区的选择
driver.find_element_by_xpath('//*[@id="province"]/option[18]').click()
driver.find_element_by_xpath('//*[@id="city"]/option[4]').click()
driver.find_element_by_xpath('//*[@id="district"]/option[4]').click()

# 近15天是否前往或经停过武汉市、湖北省,或其他有病例报告的社区?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[6]/label[3]').click()
driver.find_element_by_xpath('//*[@id="sfjthb_ms"]').clear()
driver.find_element_by_xpath('//*[@id="sfjthb_ms"]').send_keys('人在湖北')

# 近15天接触过出入或居住在武汉市、湖北省的人员,以及其它有病例社区的发热或呼吸道症状患者?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[8]/label[3]').click()
driver.find_element_by_xpath('//*[@id="hbjry_ms"]').clear()
driver.find_element_by_xpath('//*[@id="hbjry_ms"]').send_keys('人在湖北')

# 近15天您或家属是否接触过疑似或确诊患者,或无症状感染患者(核酸检测阳性者)?
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[10]/label[1]').click()

# 今天的体温范围
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[12]/label[1]').click()

# 您或家属有无疑似症状?(可多选) 选择不上不明原因
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[14]/label[1]/div[1]').click()

# 您或家属当前健康状态
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[17]/label[1]').click()

# 您或家属是否正在隔离?(隔离是根据上级单位、医院相关要求的居家或封闭性隔离,宅在家的不属隔离)
driver.find_element_by_xpath('//*[@id="rbxx_div"]/div[20]/label[1]').click()
'''
# 点击提交信息
driver.find_element_by_partial_link_text('提交填报信息').click()
time.sleep(1)
# 郑重承诺
driver.find_element_by_xpath('//*[@id="qrxx_div"]/div[2]/div[25]').click()
# 确认提交
driver.find_element_by_partial_link_text('确认提交').click()
time.sleep(2)
# 关闭浏览器
driver.close()

西电版本(仅可提交一次,请慎重):

from selenium import webdriver
import time

# 西电
# 打开chrome浏览器
driver = webdriver.Chrome()
# 进入健康情况填报官网
url = r'https://xxcapp.xidian.edu.cn/ncov/wap/default'
driver.get(url)
# 最大化窗口
#driver.maximize_window()

# 登录信息
username = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[1]/input');
stu_number = '自己的学号'
username.send_keys(stu_number)
stu_password = '自己的密码'
password = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/input');
password.send_keys(stu_password)
# 点击登录
driver.find_element_by_xpath('//*[@id="app"]/div[3]').click()
time.sleep(5)
# 由于西电也会保存上日记录,所以只需要获取当前位置即可。如果想改变某些内容,可参考上西工大版本
driver.find_element_by_xpath('/html/body/div[1]/div/div/section/div[4]/ul/li[8]/div/input').click()
# 等待获取地理位置
time.sleep(5)
# 提交
driver.find_element_by_xpath('/html/body/div[1]/div/div/section/div[5]/div/a').click();
time.sleep(5)
# 确认提交
driver.find_element_by_xpath('//*[@id="wapcf"]/div/div[2]/div[2]').click()
# 提交成功确定
driver.find_element_by_xpath('//*[@id="wapat"]/div/div[2]/div').click()
# 关闭浏览器
driver.close()

PS:代码中的time.sleep()是让线程暂停一段时间,单位为秒(s)。目的是为了防止部分页面打开(跳转)较慢,导致后续代码运行失败。

2.4 发个qq邮件通知(不需要也可以直接跳过)

先上代码:填好对应的邮箱、授权码(获取方法在注释中)、以及发送内容即可。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发送给个人邮箱
# 用于构建邮件头
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = '发送方@qq.com'
# 进入qq邮箱->设置->账户->找到stmp服务,点击开启。验证后会给你一个授权码,直接复制,填入下方即可
password = '自己的授权码'

# 收信方邮箱
to_addr = '收信方@qq.com'

# 发信服务器
smtp_server = 'smtp.qq.com'

# 邮箱正文内容,第一个参数为内容(正文部分),第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('今日已经填报好健康信息', 'plain', 'utf-8')

# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('每日疫情填报情况')

# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()

2.5 配合自动开关机,实现自动打卡。

定时自动关机的方法很简单:
控制面板-》搜索计划任务-》打开计划任务-》点击右侧创建基本任务-》输入名称(必填)及详细内容(选填)-》下一步,触发器选择‘每天’-》下一步,选择好每一天的触发时间-》下一步,操作选择‘启动程序’-》下一步,程序或脚本 中填入 ‘shutdown’,参数为 ‘-s -t 00’ 意思是延迟0s关机,也就是触发时立即关机。-》完成。
关于定时开机:
我尝试了很多种方法,包括创建计划任务、修改注册表、定时开关机软件等等,都没能够成功。本人也正在努力!

以上就是全部内容了,有知道如何自动开机的小伙伴,一定要评论告诉我呀!

欢迎评论和指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章