所需工具
- Fiddler抓包工具
- 微信PC客户端
- python3+selenium
- linux服务器
原理
健康打卡页面需要微信授权登录才能正常访问,所以先用抓包工具获取真实的授权登录地址,登录后获取保存登录信息的token,再使用selenium模拟用户登录并进行打卡操作,最后在服务器上部署python定时任务实现每天自动打卡
获取token
微信授权
打开抓包工具Fiddler
如果端口被占用,点是
来选择一个随机端口
打开后软件会自动开启捕捉
如果出现以下提示,点击它来重新捕捉
然后打开PC端微信,进入健康打卡界面
点击登出
,页面会刷新,以此来重新授权,获取授权地址
如果弹出此框,点击yes
一般的话会自动登录,否则就手动登录一下
登录成功后再回到Fiddler中,找到Tunnel to open.weixin.qq.com
下面一行的记录
右键复制URL,然后到浏览器中访问
我们会看到微信授权访问的页面
点击同意,就会跳转到健康打卡界面
接着打开F12开发者模式,在应用程序
-本地存储
(Application
-LocalStorage
)中记录着我们的token
,将右边的值
记录下来,里面保存着我们的登录信息
易班授权
经csdn评论区大佬提醒,还可以通过易班的登录授权来验证
不想登微信以及抓包的话还可以访问此处获得token,获取token步骤同上
编写脚本
其中js
里token
改成上一步获取到的token
province
,city
,area
分别代表地区选择 三列选项中每一列的第几个选项
编写daka.py
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
# 导入时间模块
import time
# 填写获取到的token
js='window.localStorage.setItem("hduhelp_ncov_dailysign_token","token")'
# 省 市 区 从上往下数第几个 如第1个,第2个 7 9 4表示浙江省杭州市江干区
province=7
city=9
area=4
# 获取驱动路径
DRIVER_PATH = './chromedriver'
# 浏览器设置
options = Options()
options.add_argument('--no-sandbox')
# 无头参数
options.add_argument('--headless')
options.add_argument('--disable-gpu')
# 启动浏览器
browser = Chrome(executable_path=DRIVER_PATH, options=options)
# 访问url
browser.get("https://healthcheckin.hduhelp.com/")
#窗口最大化
browser.maximize_window()
# 添加token
browser.execute_script(js)
# 刷新浏览器
browser.refresh()
# 间隔时间太短会导致打卡失败 因为界面元素还没有加载出来
time.sleep(2)
# 点击 确认打卡 按钮
browser.find_element_by_css_selector('.van-button.van-button--info.van-button--normal').click()
time.sleep(1)
# 点击弹出的 确认 按钮 因为之后才能填写位置信息
browser.find_element_by_class_name('van-dialog__confirm').click()
time.sleep(1)
# 点击 确认 手动填写位置按钮
browser.find_element_by_class_name('van-field__control--right').click()
time.sleep(1)
# 获取滑动选择框
pickers=browser.find_elements_by_class_name('van-picker-column__wrapper')
for i in range(province):
# 依次点击 直到选择了对应城市
pickers[0].find_elements_by_class_name('van-picker-column__item')[i].click()
for i in range(city):
# 同上
pickers[1].find_elements_by_class_name('van-picker-column__item')[i].click()
for i in range(area):
# 同上
pickers[2].find_elements_by_class_name('van-picker-column__item')[i].click()
# 点击 确认 地区选择按钮
browser.find_element_by_class_name('van-picker__confirm').click()
time.sleep(1)
# 点击 确认打卡 按钮
browser.find_element_by_css_selector('.van-button.van-button--info.van-button--normal').click()
time.sleep(1)
# 点击 确认负责 按钮
browser.find_element_by_css_selector('.van-button.van-button--default.van-button--large.van-dialog__confirm.van'
'-hairline--left') .click()
time.sleep(1)
#退出窗口
browser.quit()
print('打卡成功')
部署
部署的目的就是自动化,所以需要一台能够顺利执行定时任务的设备(笔记本,树莓派,服务器均可)
安卓设备可以尝试高级终端Termux这个软件
不过如果要在windows上部署,要先把上面的脚本写成windows能运行的版本
依赖的安装windows与linux相似(chrome,chromedrive,selenium)
这里以安装了宝塔的centos服务器为例
安装依赖项
需要安装:
- chrome
- chromedrive
- selenium
linux下各依赖项的安装可以看这一篇文章 Linux-Centos下selenium部署
运行脚本
安装好chrome
,chromedrive
及selenium
后,将chromedrive
和daka.py
放在同一目录下
比如我放在了服务器根目录的python
文件夹中
然后在终端中执行
python3 daka.py
等待执行成功即可
定时任务
如果使用的是宝塔,直接添加计划任务即可
检验是否成功查看任务日志或者点进打卡页面或者杭电助手有没有在每天上午8点半提醒你打卡
注意事项
进入打卡页面默认会保存上一次打卡时填的选项,这个脚本只是模拟了打卡页面的登录和地理位置填写,健康状况,晨间体温,生活状况
等还是和上一次填写是一样,所以确保上一次填写时是正确的选项
sacsac
这个依赖太重了