适用于Linux系统的苏大每日健康打卡的无界面打卡程序,按照下面操作自行设置即可,主代码修改自 EuGEne老哥,谢谢你
如果是macOS或者Windows可以魔改本教程实现打卡
pip install selenium
curl https://intoli.com/install-google-chrome.sh | bash
自己手动下载chrome浏览器就行,如果早就安装了就不用管了,然后可以参考原作者的实现有界面打卡
先查看chrome版本
google-chrome --version
再下载对应版本的driver
http://npm.taobao.org/mirrors/chromedriver上查地址
复制一下链接地址
然后拼接并解压
wget http://npm.taobao.org/mirrors/chromedriver/84.0.4147.30/chromedriver_linux
unzip chromedriver_linux64.zip
新建一个daka.py
的文件,这个地方修改了原作者的一些代码,主要在打开浏览器函数中作了修改
# encoding=utf-8
from selenium import webdriver
from time import strftime, localtime
import requests
import time
import json
import os
# 开启浏览器
# 开启浏览器
def openChrome():
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
options.add_argument('window-size=1600x900') # 指定浏览器分辨率
options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
#options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
#options.add_argument('--headless') # 浏览器不提供可视化页面.linux下如果系统不支持可视化不加这条会启动失败
options.add_argument('disable-infobars')
driver = webdriver.Chrome(options=options,executable_path='./chromedriver')
return driver
def find(driver, str):
try:
driver.find_element_by_xpath(str)
except:
return False
else:
return True
# 流程
def operate_dk(driver):
# 打开配置文件
try:
with open("config.json", encoding='utf-8') as f:
config = json.load(f)
except:
print("配置文件错误!请检查配置文件是否与py文件放置于同一目录下,或配置文件是否出错!\n请注意'现人员位置'只可填入以下四项中的任意一项:'留校', '在苏州', '江苏省内其他地区', '在其他地区'")
driver.quit()
return -1
else:
# 老版本登陆
# url = "http://ids1.suda.edu.cn/amserver/UI/Login?goto=http%3a%2f%2fmyauth.suda.edu.cn%2fdefault.aspx%3fapp%3dsswsswzx2%26jumpto%3d&welcome=%e5%b8%88%e7%94%9f%e7%bd%91%e4%b8%8a%e4%ba%8b%e5%8a%a1%e4%b8%ad%e5%bf%83&linkName=%e5%a6%82%e6%9e%9c%e6%97%a0%e6%b3%95%e4%bd%bf%e7%94%a8%e7%bb%9f%e4%b8%80%e8%ba%ab%e4%bb%bd%e7%99%bb%e5%bd%95%ef%bc%8c%e8%af%b7%e7%82%b9%e5%87%bb%e8%bf%99%e9%87%8c&linkUrl=http://aff.suda.edu.cn/_web/ucenter/login.jsp&gx_charset=UTF-8"
# driver.get(url)
# # 找到输入框并输入查询内容
# elem = driver.find_element_by_id("IDToken1")
# elem.send_keys(config["学号"])
# elem = driver.find_element_by_id("IDToken9")
# elem.send_keys(config["密码"])
# # 提交表单
# driver.find_element_by_xpath("//*[@id='loginBtn']").click()
# try:
# driver.find_element_by_xpath("//*[text()='首页']")
# 新版登陆
url = "https://auth.suda.edu.cn/cas/login?service=https%3A%2F%2Fauth.suda.edu.cn%2Fsso%2Flogin%3Fredirect_uri%3Dhttps%253A%252F%252Fauth.suda.edu.cn%252Fsso%252Flogin%26x_client%3Dcas"
driver.get(url)
# 找到输入框并输入查询内容
elem = driver.find_element_by_id("username")
elem.send_keys(config["学号"])
elem = driver.find_element_by_id("password")
elem.send_keys(config["密码"])
# 提交表单
driver.find_element_by_xpath("//*[@id='fm1']/div[7]").click()
try:
driver.find_element_by_xpath("//*[text()='账户信息']")
except:
print('登陆失败!请检查学号密码是否正确')
os.system('killall chromedriver')
return -1
else:
print('登录成功!')
url = "http://aff.suda.edu.cn/_web/fusionportal/detail.jsp?_p=YXM9MSZwPTEmbT1OJg__&id=2749&entranceUrl=http%3A%2F%2Fdk.suda.edu.cn%2Fdefault%2Fwork%2Fsuda%2Fjkxxtb%2Fjkxxcj.jsp&appKey=com.sudytech.suda.xxhjsyglzx.jkxxcj."
driver.get(url)
print('访问页面')
# 这个页面必须点两次,不晓得为啥
time.sleep(1)
try:
driver.find_element_by_xpath(
"/html/body/div/div[2]/div/section/div/div[2]/div[1]/a[1]").click()
time.sleep(1)
print('准备点击小窗口')
driver.find_element_by_xpath(
"//*[@class='action-btn action-do']").click()
# 切换到小框内
print("切换到小框内")
iframe1 = driver.find_element_by_id("layui-layer-iframe1")
driver.switch_to.frame(iframe1)
except:
driver.quit()
flag = False
while(flag == False):
time.sleep(1)
flag = find(driver, "//*[text()='"+config["学号"]+"']")
# 填写体温
elem = driver.find_element_by_id("input_swtw")
elem.send_keys("36.8")
elem = driver.find_element_by_id("input_xwtw")
elem.send_keys("36.8")
## 个人健康状况-正常
driver.find_element_by_xpath("//*[@id='checkbox_jkzk33']").click()
#xrywz = {'在校': 'radio_xrywz5', '在苏州': 'radio_xrywz7','江苏省其他地区': 'radio_xrywz9', '在其他地区': 'radio_xrywz23'}
#driver.find_element_by_xpath("//*[@id='"+xrywz[config["现人员位置"]]+"']").click()
# 更新后通过select来选择人员位置地址
xrywz = {'在校': '2', '在苏州': '3','江苏省其他地区': '4', '在其他地区': '7'}
driver.find_element_by_xpath("//*[@id='select2-select_xrywz-container']").click()
driver.find_element_by_xpath('//*[@id="select2-select_xrywz-results"]/li/ul/li['+xrywz[config["现人员位置"]]+']').click()
# 输入家庭地址
elem = driver.find_element_by_id("input_jtdz")
elem.send_keys(config["家庭地址"])
# 是否医学隔离中
driver.find_element_by_xpath("//*[@id='radio_sfyxglz7']").click()
# 当日行动轨迹是否外出
driver.find_element_by_xpath("//*[@id='radio_sfywc11']").click()
# 是否与新冠确诊病例/无症状感染者接触过
driver.find_element_by_xpath("//*[@id='radio_sfygrzjcg15']").click()
# 是否与新冠确诊病例/无症状感染者有行程轨迹交叉
driver.find_element_by_xpath("//*[@id='radio_sfyxcgjjc19']").click()
# 是否有中高风险地区旅居史(包括途径中高风险地区)
driver.find_element_by_xpath("//*[@id='radio_sfyzgfxljs23']").click()
# 是否与中高风险地区人员接触
driver.find_element_by_xpath("//*[@id='radio_sfyzgfxryjc27']").click()
# 提交
print("submit")
driver.find_element_by_xpath("//*[@id='tpost']").click()
time.sleep(1)
try:
driver.find_element_by_xpath("//*[text()='提交成功!']")
print('打卡成功!')
driver.find_element_by_xpath(
"//a[@class='layui-layer-btn0']").click()
ddpost("今天的打卡已经成功执行")
wxpost("主人,打卡成功啦~")
except:
try:
driver.find_element_by_xpath(
"//*[text()='当天已经提交过,是否继续提交?']")
print("已打卡过!")
driver.find_element_by_xpath(
"//a[@class='layui-layer-btn0']").click()
ddpost("今天的打卡已经成功执行")
wxpost("主人,打卡GET啦~")
except:
print("打卡失败!请重新开始")
driver.find_element_by_xpath(
"//a[@class='layui-layer-btn0']").click()
ddpost("今天的打卡失败,请手动打卡")
wxpost("今天的打卡失败,请手动打卡")
driver.quit()
os.system('killall chromedriver')
time.sleep(3)
print("即将退出程序...")
driver.quit()
os.system('killall chromedriver')
# 钉钉webhook机器人推送
def ddpost(content):
with open("config.json", encoding='utf-8') as f:
config = json.load(f)
timenow = strftime("%Y-%m-%d %H:%M:%S", localtime())
url = "https://oapi.dingtalk.com/robot/send?access_token="+config['ddkey']
data = '{"msgtype":"markdown","markdown":{"title":"每日疫情打卡","text":"# 每日打卡提醒 \n >### 消息提示:' + \
content + ' \n >### 打卡时间:' + timenow + '"}}'
headers = {'Content-Type': 'application/json'}
byte_data = data.encode("utf-8")
rep = requests.post(url=url, data=byte_data, headers=headers)
print("钉钉打卡成功")
# 微信server酱机器人推送
def wxpost(content):
with open("config.json", encoding='utf-8') as f:
config = json.load(f)
driver.get("https://sc.ftqq.com/"+config['wxkey']+".send?text="+content)
print("微信打卡成功")
# 主函数
if __name__ == '__main__':
print("这是一个自动健康打卡的程序。\n\n请在同目录下的config.json中配置打卡信息,例如:\n'学号': '1827405055',\n'密码': '12345678',\n'现人员位置': '在苏州', (请注意只可填入以下四项中的任意一项:'在校', '在苏州', '江苏省其他地区', '在其他地区')\n'家庭地址': '工业园区'\n其余所有属性均为打卡系统自动填充的上一次打卡信息\n如果需要自动打卡,可以在ddkey或wxkey当中填写你申请的钉钉webhook机器人accesskey或在wxkey当中填写微信server酱公众号的accesskey\n\n程序即将启动...")
driver = openChrome()
operate_dk(driver)
保存,然后在同目录下新建一个config.json
文件用来存放个人信息,自行修改即可,注意人员位置只可以填写以下四项中的任意一项:'在校', '在苏州', '江苏省其他地区', '在其他地区'
{
"学号": "xxxxxx",
"密码": "xxxxxx",
"现人员位置": "江苏省其他地区",
"家庭地址": "home",
"ddkey":"钉钉webhook的accesskey",
"wxkey":"server酱的accesskey"
}
最后python3 data.py即可自动打卡
可以通过定时任务来自动化进行打卡操作
可以在打卡成功后自定义推送给自己的邮箱或者qq微信来实现推送功能 如果需要自动打卡,可以在config.json文件中的ddkey当中填写你申请的钉钉webhook机器人accesskey
或在wxkey当中填写微信server酱公众号的accesskey
这样均可以实现自动化打卡
200730 更新打卡的地址
200808 新增自动推送
200824 更新温度打卡
200828 日常更新登陆页面
210121 更新chromedriver版本88,更新打卡逻辑