自从开学以来学校要求学生每天都小北打卡体温上报,忘记打卡辅导员亲自过来找你喝茶,放假依然不放过。而打卡只能第二天的七点开始才能打卡,一觉醒来都中午了没有第一时间打卡又找我聊天,就想一个自动打卡的脚本,去giehub找了一波果然有人已经写出来了,感谢大佬的脚本:lovebai。仅是搬运别的脚本和个人使用教程。
一、本地运行:Git方式
这是原作者的方式,脚本地址有教程,但个人觉得比较麻烦,也不合适小白,最下面那个教程是我修改作者的源代码。
二、本地运行:直接定时运行
首先将脚本下载到本地,如果是windows电脑,那么可以用系统自带的任务管理器定时运行,具体怎么使用自己百度吧。linux的话就装个宝塔,里面有定时。注意这里会有坑,不知道为什么会有时候windows的定时任务有时候会不运行,server2012版本跟win10都遇到过,这里也不推荐使用这种方式。
三、docker青龙面板方式运行
这里如果安装了docker过的人就比较了解,需要安装青龙镜像,直接下载上传到青龙面板或者直接新建脚本复制原作者脚本。具体怎么安装请查看教程
以下是我自己的:
注意记得安装模块,其中有几个模块是不用的,青龙也安装不了的(难度挺大)。安装好直接定时运行就可以了。
如果你是啥也不会的小白,那么请按照以下教程
代码是修改lovebai的。
以下是在windows环境下的使用过程:
1.下载 python3.8:官网下载地址(有点慢)
https://www.python.org/ftp/python/3.8.1/python-3.8.1-amd64.exe
2.安装python:由于我自己本身已经安装,这里就不截图了,直接点击下一步就可以了。记得安装的时候勾选上添加环境变量。
3.测试安装是否成功:win键 + R键 ,输入cmd,点击确定。在cmd环境下输入:python -V 显示版本号则证明安装成功,如果报错有可能是没有将python添加到系统环境变量中,请自行百度搜索 python添加到系统环境变量
4.安装python requests库:
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
我的已经安装完成,所以才提示这个。
5.新建文本文件,打开文件并将以下代码复制进去,修改代码或者到 我的GitHub 上直接下载使用:
import base64
import random
import requests
import time
import datetime
# 定义运行时间,24小时制
timeing = '7' # 设置每天早上7点开始运行,每运行成功一次会延迟几秒运行,理论上:单个账号运行300次便延迟一分钟
# 定义运行过程中网络延迟导致打卡的时间从七点慢慢到八点的时间
timesub = 0 # 默认是减零,可以看运行日志下次运行的时间决定,账号越多后面减的也应该越多,这是由于程序在运行过程中请求打卡网络的延迟问题造成
# 设置账号 密码
array = [
["你的账号", "你的密码"],
["你的第二个账号", "第二个账号的密码"],
]
# 东区宿舍 经纬度
LOCATION = "109.632015,23.239991"
# 位置,可选通过接口获取
COORD = "中国-湖北省-武汉市-江夏区"
# API地址
BASE_URL = "https://xiaobei.yinghuaonline.com/xiaobei-api/"
captcha_url = BASE_URL + 'captchaImage'
# 登录
login_url = BASE_URL + 'login'
# 打卡
health_url = BASE_URL + 'student/health'
# header 请求头
HEADERS = {
"user-agent": "iPhone10,3(iOS/14.4) Uninview(Uninview/1.0.0) Weex/0.26.0 1125x2436",
"accept": "*/*",
"accept-language": "zh-cn",
"accept-encoding": "gzip, deflate, br"
}
def get_health_param(coord):
# 体温随机为35.8~36.7
temperature = str(random.randint(358, 367) / 10)
# 107.807008,26.245838
rand = random.randint(1111, 9999)
# 经度
location_x = LOCATION.split(',')[0].split(
'.')[0] + '.' + LOCATION.split(',')[0].split('.')[1][0:2] + str(rand)
# 纬度
location_y = LOCATION.split(',')[1].split(
'.')[0] + '.' + LOCATION.split(',')[1].split('.')[1][0:2] + str(rand)
location = location_x + ',' + location_y
return {
"temperature": temperature,
"coordinates": coord,
"location": location,
"healthState": "1",
"dangerousRegion": "2",
"dangerousRegionRemark": "",
"contactSituation": "2",
"goOut": "1",
"goOutRemark": "",
"remark": "无",
"familySituation": "1"
}
def xiaobei_update(username, password):
print("\n"+username+"开始操作")
flag = False
# 获取验证信息
try:
print("开始获取验证信息")
response = requests.get(url=captcha_url, headers=HEADERS)
uuid = response.json()['uuid']
showCode = response.json()['showCode']
print("验证信息获取成功")
except:
print("验证信息获失败")
return False
# 使用验证信息登录
try:
print("正在登录小北平台")
response = requests.post(url=login_url, headers=HEADERS, json={
"username": username,
"password": str(base64.b64encode(password.encode()).decode()),
"code": showCode,
"uuid": uuid
})
# print(response)
print("平台响应:"+response.json()['msg'])
except:
print("登录失败")
return False
# 检测Http状态
if response.json()['code'] != 200:
print("登陆失败:"+response.json()['msg'])
else:
try:
print(username+"登陆成功,开始打卡")
HEADERS['authorization'] = response.json()['token']
response = requests.post(
url=health_url, headers=HEADERS, json=get_health_param(COORD))
# print(response)
except:
print(username+"打卡失败")
HEADERS['authorization'] = ''
# 解析结果
try:
if "已经打卡" in response.text:
print(username+"?今天已经打过卡啦!")
flag = True
elif response.json()['code'] == 200:
print(username+"?恭喜您打卡成功啦!")
flag = True
else:
print(username+"打卡失败,平台响应:" + response.json())
except:
return False
return flag
if __name__ == "__main__":
count, failed = 0, 0
failed_username = ""
while True:
nowtime = datetime.datetime.now().strftime('%H')
print(f'您设置时间的运行时间为 {timeing}点 运行')
if nowtime == timeing or timeing == str(int(nowtime)-1):
while True:
# 循环打卡列表
for i in array:
if xiaobei_update(i[0], i[1]) == False:
failed = failed+1
failed_username = failed_username+str(i[0])+",\n"
count = count+1
time.sleep(1)
if failed == 0:
title = "\n?恭喜您打卡成功啦!一共是"+str(count)+"人"
else:
title = "\n?共操作"+str(count)+"人,失败"+str(failed)+"人"
message = "失败账号:\n"+failed_username
print(title)
count, failed = 0, 0
print('程序将在 ' + (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S") + ' 继续运行\n\n')
time.sleep(60*60*24-timesub) # 24小时的秒数减去运行过程网络延迟的时间
else:
print('当前不在运行时间段,程序将不会运行,一个小时后将再次运行')
time.sleep(3600)
其中,只需要账号密码修改为你的账号密码,比如我的:
如果你还有其他账号可以按以下图的格式,每添加一个账号就需要 [”,”], 的形式添加:
如果你只有一个账号,把第二个删除了就可以了,如图:
其他可以根据注释来修改,默认是每天早上的7点多跟8点多运行。
5.将txt文件的后缀名修改py
注意,如果你的txt文件不显示后缀,需要在文件扩产名显示,如图:
6.运行python程序
在cmd环境下,输入: python 然后直接将刚才修改的文件拖进cmd里面,它会显示路径的,回车便执行,一直运行便可,到时间它会运行的。
注意:文件名后缀名是注意:文件名后缀名是 .py,不是.py.txt