北邮每日打卡脚本(失败记录)

北邮疫情防控系统每日打卡脚本

博客原文地址
selenium使用教程

程序使用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
上一篇:JavaScript中的变量阴影


下一篇:从另一个Javascript文件调用IIFE