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
| import json import logging from time import sleep import time import datetime import requests from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.action_chains import ActionChains
user = '' passwd = '' current_url = 'https://authserver.nju.edu.cn/authserver/index.do' get_app_info_url = 'http://ehallapp.nju.edu.cn/xgfw/sys/yqfxmrjkdkappnju/apply/getApplyInfoList.do' post_app_info_url = 'http://ehallapp.nju.edu.cn/xgfw/sys/yqfxmrjkdkappnju/apply/saveApplyInfos.do' SCKEY = "" set_time = [(8, 35)] max_attempt = 5
data = { "WID": "", "CURR_LOCATION": "江苏省南京市鼓楼区小粉桥", "IS_TWZC": 1, "IS_HAS_JKQK": 1, "JRSKMYS": 1, "JZRJRSKMYS": 1 }
def daka(): login_flag, browser = login() if not login_flag: return
browser.get(get_app_info_url) get_info_str = browser.find_element_by_tag_name('pre') get_info_json = json.loads(get_info_str.text) data['WID'] = get_info_json['data'][0]['WID'] logger.info("成功获取WID") time.sleep(3) post_url = post_app_info_url + '?'
for i in data: post_url += str(i) + '=' + str(data[i]) + '&' browser.get(post_url) post_info_str = browser.find_element_by_tag_name('pre') post_info_json = json.loads(post_info_str.text)
if post_info_json['code'] == str(0): logger.info("成功打卡")
sleep(40) browser.quit() datee = datetime.date.today() send_message("小主打卡成功") logger.info(str(datee) + " 流程结束")
def login(): chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') browser = webdriver.Chrome(options=chrome_options)
try: url = "https://authserver.nju.edu.cn/authserver/login" browser.implicitly_wait(10) browser.get(url)
user_name_input = browser.find_element_by_id('username') user_name_input.send_keys(user) user_pwd_input = browser.find_element_by_id('password') user_pwd_input.send_keys(passwd)
except: logger.info("打开打卡网页失败,请确认网络") send_message("打开打卡网页失败,请确认网络") return False, None
logger.info("成功打开打卡网页")
login_button = browser.find_element_by_css_selector('.auth_login_btn.primary.full_width') ActionChains(browser).move_to_element(login_button).click(login_button).perform() browser.implicitly_wait(5)
fail_cnt = 0 while True: if browser.current_url == current_url: logger.info("登录成功") return True, browser else: if len(browser.find_element_by_id('msg')) > 0: send_message("打卡失败,用户名密码错误,程序已退出,请检查") logger.info("打卡失败,用户名密码错误,请检查") exit(0)
if fail_cnt >= max_attempt: send_message("登录超时超过最大尝试次数,请检查网络或打卡系统已崩溃") logger.info("登录超时超过最大尝试次数") return False, None time.sleep(10) browser.get("https://authserver.nju.edu.cn/authserver/login") logger.info("登录超时,正在重试") fail_cnt += 1
def main(): logger.info("正在进行验证...") flag, browser = login() time.sleep(3) browser.quit() logger.info("时间未到,等待打卡")
if not flag: exit(0) while True: while True: time_up = False now = datetime.datetime.now() for hour, minute in set_time: if now.hour == hour and now.minute == minute: time_up = True if time_up: break logger.debug(f"时间未到,当前时间 {now}") sleep(20) logger.info("时间已到,正在打卡") daka()
def send_message(msg): if SCKEY == "": return payload = {'text': msg} requests.get(f"https://sc.ftqq.com/{SCKEY}.send", params=payload)
if __name__ == "__main__": log_file = "log.log" formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") logger = logging.getLogger("main") fh = logging.FileHandler(log_file, mode='w') fh.setFormatter(formatter) ch = logging.StreamHandler() ch.setFormatter(formatter) logger.addHandler(fh) logger.addHandler(ch) logger.setLevel(logging.INFO) main()
|