北邮疫情防控系统每日打卡脚本
程序使用selenium库,原因是这个打卡系统似乎是单独的,比较简单,没有任何权限管理验证码这样的安全系统,所以可以使用,再高级点就不行了。
Linux(CentOS7)上安装selenium的环境
浏览器和驱动一定要对应上,否则就会出现各种问题,下面准备了80.0.3987.106版本对应的浏览器和驱动
将下载好的传入服务器,安装已经上传谷歌浏览器
# 安装谷歌浏览器以及相关依赖
yum localinstall google-chrome-stable_current_x86_64.rpm
# 查看谷歌浏览器版本号
google-chrome-stable --version
# 测试谷歌浏览器
google-chrome --headless --disable-gpu --dump-dom --no-sandbox https://www.baidu.com
移动谷歌驱动
# 移动驱动
sudo mv chromedriver /usr/bin/chromedriver
# 测试驱动是否可用
chromedriver
配置python环境,用pip3安装python用到的包,然后就可以运行了。
具体程序
程序比较失败,一是微信定位不知道怎么弄,本来以为定位只是为了获取表单数据,还是想简单了,目前程序能打卡但是定位不在北京;二是学生机实属辣鸡,跑个python都费劲,还是naive了。
from selenium import webdriver
from lxml import etree
import time
# 无可视化界面
from selenium.webdriver.chrome.options import Options
# 规避检测
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
import schedule
# 创建一个参数对象,用来控制chrome以*面模式打开
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-blink-features=AutomationsControlled')
# 实例化浏览器对象
# bro = webdriver.Chrome(executable_path='./chromedriver', options=chrome_options)
bro = webdriver.Chrome(executable_path='/usr/bin/chromedriver', options=chrome_options)
# 打开可使用可视化界面
# bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://app.bupt.edu.cn/ncov/wap/default/index')
# 登陆
def login(username, password):
login_url = bro.current_url
username_tag = bro.find_element_by_xpath("//*[@id='app']/div[2]/div[1]/input")
password_tag = bro.find_element_by_xpath("//*[@id='app']/div[2]/div[2]/input")
username_tag.send_keys(username)
password_tag.send_keys(password)
btn = bro.find_element_by_xpath("//*[@id='app']/div[3]")
btn.click()
report_url = bro.current_url
while report_url == login_url:
report_url = bro.current_url
time.sleep(3)
print("登陆成功: ", report_url)
return True
# 填写表单
def report():
# 是否在校选择
btn_in_school = bro.find_element_by_xpath(
"/html/body/div[1]/div/div/section/div[4]/ul/li[4]/div/div/div[1]/span[1]")
btn_in_school.click()
# 位置选择
btn_location = bro.find_element_by_xpath("/html/body/div[1]/div/div/section/div[4]/ul/li[8]/div/input")
bro.execute_script("arguments[0].removeAttribute('readonly')", btn_location)
btn_location.send_keys("北京市 海淀区")
# 风险选择
btn_risk = bro.find_element_by_xpath("/html/body/div[1]/div/div/section/div[4]/ul/li[9]/div/div/div[2]/span[2]")
btn_risk.click()
time.sleep(3)
# 点击提交
btn_submit = bro.find_element_by_xpath("/html/body/div[1]/div/div/section/div[5]/div/a")
btn_submit.click()
time.sleep(3)
# 取消填报
btn_confirm = bro.find_element_by_xpath("//*[@id='wapat']/div/div[2]/div")
btn_confirm.click()
print("取消填报")
btn_city = bro.find_element_by_xpath("/html/body/div[1]/div/div/section/div[4]/ul/li[10]/div/div/div[4]/span[1]")
btn_city.click()
time.sleep(3)
# 点击提交
btn_submit = bro.find_element_by_xpath("/html/body/div[1]/div/div/section/div[5]/div/a")
btn_submit.click()
time.sleep(3)
btn_has_submit = bro.find_element_by_xpath("//*[@id='wapcf']/div/div[2]/div[2]")
btn_has_submit.click()
print("打卡成功")
time.sleep(3)
def run_main():
if login("账号", "密码") is True:
report()
bro.quit()
print("退出")
if __name__ == '__main__':
run_main()
while True:
schedule.every().day.at("00:05").do(run_main)
遇到的坑
CentOS7安装谷歌浏览器后无法yum功能使用,需要到/etc/yum.repos.d目录下,找到chrome的repo,也就是google-chrome.repo, 删除掉或者mv到别的地方,然后yum clean all, 就能解决。
rm -rf /etc/yum.repos.d/google-chrome.repo
yum clean all