-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdaka.py
199 lines (173 loc) · 9.48 KB
/
daka.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# 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)