# clock_in
介绍
吉林大学自动健康打卡v2.0
软件架构
- selenium - chromedriver 【调用chrmoe】
- win32gui【酷Q被屏蔽,故改用该方案】
开发思路
- 用selenium完成测试,获取网页中“已完成项目”数据,通过win32gui打开对应QQ聊天窗口,在服务器上创建计划最佳
安装教程
- 将chrmoe驱动存放至 chrome根目录下Application文件夹 【C:\Program Files (x86)\Google\Chrome\Application】
- 新增系统变量 【path C:\Program Files (x86)\Google\Chrome\Application】
- 安装 pip , selenium , win32api , win32gui
使用说明
- 1.修改个人信息
- username = "zhuyu18" # 账号
- pwd = "#######" # 密码
- recv_qq = "zy" # 接收反馈的QQ
- 2.对应QQ聊天窗口须保持开启
- 3.电脑,创建计划,每日固定时间开机并运行脚本【服务器上部署最佳】
************** 详细步骤 **************
1.安装chromedriver
1.1打开chrome浏览器,键入 chrome://version ,查询版本
1.2下载对应版本驱动
地址:https://npm.taobao.org/mirrors/chromedriver/
1.3将驱动置于chrome根目录下的Application目录下
1.4添加系统变量
2.创建计划
2.1 win+R 键入compmgmt.msc 打开计算机管理
2.2创建 clock_in文件夹
2.3创建计划 填入clock_in的filepath
3.修改py文件
3.1导入依赖, 安装pip, pip install selenium...
from selenium import webdriver
import win32gui
import win32con
import win32clipboard as w
import time
3.2修改个人信息,username,pwd,recv_qq
3.3xpath获取,网页F12,用div id name select 等标签均可获取
4.结果展示
5.demo
# -*- coding:utf-8 -*-
from selenium import webdriver
import win32gui
import win32con
import win32clipboard as w
import time
# ========================= 信息-需修改 =========================
username = "zhuyu18" # 账号
pwd = "########" # 密码
recv_qq = "zy" # 接收反馈的QQ
loading_time = 10 # 预留页面加载时间10秒 , 视电脑配置修改
# ========================= url-无需修改 =========================
login_url = "https://ehall.jlu.edu.cn/jlu_portal/login" # 登录url
remind_url = "https://ehall.jlu.edu.cn/taskcenter/workflow/done" # 登录url
# ========================= xpath-无需修改 =========================
uid_xpath = './/input[@name="username"]' # 账号xpath
pwd_xpath = './/input[@name="password"]' # 密码xpath
button_xpath = './/input[@name="login_submit"]' # 登录按钮xpath
stu_xpath = './/a[@href="/jlu_portal/guide?id=83E36211-C52A-4533-913F-F4D42C677D2A"]' # 研究生健康打卡按钮xpath
handle_xpath = './/input[@value="我要办理"]' # 我要办理按钮xpath
loc_con_xpath = './/div[@id="V1_CTRL119_Container"]' # 所在市容器按钮xpath
loc_xpath = './/div[@class="infoplus_suggester_item suggest_selected"]' # 所在市下拉框xpath
checkbox_xpath = './/input[@name="fieldCNS"]' # 承诺按钮xpath
confirm_xpath = './/a[@class="command_button_content"]' # 确认按钮xpath
ok_xpath = './/button[@class="dialog_button default fr"]' # 好按钮xpath
# ========================= 驱动-无需修改 =========================
global driver
driver = webdriver.Chrome() # 设置Chrome驱动
def web_init():
driver.maximize_window() # 最大化窗口
driver.implicitly_wait(6) # 隐式等待
driver.get(login_url) # 获取网页
def web_close():
driver.quit() # 关闭所有关联的窗口
def web_load():
time.sleep(loading_time) # 预留页面加载时间5秒
def auto_login(username_, pwd_, uid_xpath_, pwd_xpath_, button_xpath_):
web_load()
driver.find_element_by_xpath(uid_xpath_).clear() # 清空已存在内容
driver.find_element_by_xpath(uid_xpath_).send_keys(username_) # 传入用户名
web_load()
driver.find_element_by_xpath(pwd_xpath_).clear() # 清空已存在内容
driver.find_element_by_xpath(pwd_xpath_).send_keys(pwd_) # 传入密码
web_load()
driver.find_element_by_xpath(button_xpath_).click() # 通过登录按钮并单击登录
def submit(stu_xpath_, handle_xpath_, loc_con_xpath_, loc_xpath_, checkbox_xpath_, confirm_xpath_, ok_xpath_):
driver.find_element_by_xpath(stu_xpath_).click() # 研究生健康状况申报
web_load()
driver.find_element_by_xpath(handle_xpath_).click() # 我要办理
web_load()
driver.switch_to.window(driver.window_handles[1]) # 切换窗口句柄至最新窗口
web_load()
# ========================= 该部分代码针对需要手动选择市区的用户,可以选择注释 =========================
driver.find_element_by_xpath(loc_con_xpath_).click() # 定位到复选框容器V1_CTRL119_Container
web_load()
driver.find_element_by_xpath(loc_xpath_).click()
web_load()
# ========================= 该部分代码针对需要手动选择市区的用户,可以选择注释 =========================
driver.find_element_by_xpath(checkbox_xpath_).click() # 本人承诺以上填写内容均真实可靠
web_load()
driver.find_element_by_xpath(confirm_xpath_).click() # 确认填报
web_load()
driver.find_element_by_xpath(ok_xpath_).click() # 好
web_load()
def remind(remind_url_, recv_qq):
driver.get(remind_url_) # 获取网页
web_load()
row = driver.find_elements_by_tag_name('tr')
result_list = []
for i in row:
j = i.find_elements_by_tag_name('td')
for item in j:
text = item.text
result_list.append(text)
today = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
result_msg = today+'-'+result_list[0]+'-'+result_list[1]+'-'+result_list[2]+'-'+result_list[3]
print(result_msg)
send(recv_qq, result_msg) # 发送最近的一条打卡记录
def send(name, msg):
# 打开剪贴板
w.OpenClipboard()
# 清空剪贴板
w.EmptyClipboard()
# 设置剪贴板内容
w.SetClipboardData(win32con.CF_UNICODETEXT, msg)
# 获取剪贴板内容
date = w.GetClipboardData()
# 关闭剪贴板
w.CloseClipboard()
# 获取qq窗口句柄
handle = win32gui.FindWindow(None, name)
if handle == 0:
print('未找到窗口!')
# 显示窗口
win32gui.ShowWindow(handle, win32con.SW_SHOW)
# 把剪切板内容粘贴到qq窗口
win32gui.SendMessage(handle, win32con.WM_PASTE, 0, 0)
# 按下后松开回车键,发送消息
win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
time.sleep(2) # 延缓进程
if __name__ == '__main__':
web_init() # 驱动初始化
auto_login(username, pwd, uid_xpath, pwd_xpath, button_xpath) # 登录操作
submit(stu_xpath, handle_xpath, loc_con_xpath, loc_xpath, checkbox_xpath, confirm_xpath, ok_xpath) # 提交操作
remind(remind_url, recv_qq) # 发送提醒信息
web_close() # 测试结束