每日打卡,三检打卡 实现定时自动打卡
打卡小程序:微信小程序(我在校园)
文章目录
最近突发奇想,想搞个自动打卡,不然被班长每天催着打卡,生怕漏打卡,一直上闹钟提醒打卡,
为了解决自动打卡问题,我搜集了一些资料并整理那些大佬的经验,最终实现了在云端打卡,可以释放手机,自动打卡了…
于是乎就决定自己总结一下流程,为今后的实践做参考.
参考并借鉴大佬博客:
需要准备的工具: Fidder
抓包工具、腾讯云的云函数、微信提醒工具(喵提醒)
原理为抓包token值模拟登录,再通过脚本将打卡数据post上传至服务器。
第一步:注册并实名腾讯云(创建云函数)
-
腾讯云官网: https://cloud.tencent.com
-
必须得实名才能使用,其次腾讯云的云函数不用花钱,一般正常使用是不会超过额度的
-
腾讯云函数计算计费方式
腾讯云函数计算为按需付费产品,在您创建函数时无需付费,之后根据您使用函数时实际产生的调用次数、函数运行占用资源的时间和公网流量计费,具体的计费方式如下:
腾讯云函数计算开通地址 https://cloud.tencent.com/product/scf/
腾讯云函数计算官方最新价格介绍 https://cloud.tencent.com/product/scf/pricing- 函数调用次数:每月前100万次免费,超过部分1.30元/百万次
- 函数运行占用资源时间:每月前400,000GB秒免费,超过部分0.00011元/GB*秒
- 公网流量:每月前1GB免费,超过部分0.76元/GB
腾讯云函数计算价格说明:
- 腾讯云函数计算按照账户中所有的函数使用总量计费,即以上计费项均以账户中所有函数使用量的总和计算,每月的免费用量也由账户中所有函数共享。
- 函数运行占用资源时间单位(GB×秒)的计算方法是:申请占用资源的容量大小(GB)×占用时间(秒)。例如,调用一次申请了128M的内存,实际使用64M的内存,使用了8秒,则占用资源为128MB×8秒。
- 函数代码的存储不产生任何费用,您已上传的代码将在函数计算中持久保存。
- 公网流量包括从:公网调用函数时传入和返回的数据;在函数中通过公网传输的数据。
- 函数使用腾讯云内网访问其它服务产品的流量不会产生费用,比如在腾讯云腾讯云服务器中调用函数或者在函数中访问BOS所产生的数据流量均不计费。
腾讯云函数计算计费公式
总费用 = 函数调用次数费用 + 函数运行占用资源时间费用 + 公网流量费用
实名认证后再搜索框搜索云函数
创建云函数
这样函数就创建好了,先放置一会,待会再编辑.
第二步,微信公众号关注喵提醒
注册后添加提醒,获取喵码
获取喵码
手机微信中搜索公众号喵提醒,注册后添加提醒,获取喵码
记住这个喵码待会代码中要用到
也可以用其他工具提示执行信息
注:该公众号设置的提醒只有48小时内有效,如果想继续延长就要激活48小时提醒,它会有有效期显示.
第三步 抓包token值(在电脑端操作)
注意,这里面的token是非常重要,几乎是整个自动签到的核心。因为每个用户有一个指定的token,服务器凭此来区分不同用户。获取到了token就能进行签到,不过可惜的是
我在校园
对token设置了时间限制。一个token经过一段时间就过期了,需要重新获取,所以并不能一劳永逸.需要每过一段时间进行抓包更新token值(上面设置的喵提醒就是为了提示打卡的报错信息,如果token值失效,它会反馈回给你的微信,提醒你修改)
- 操作相对繁琐些
- 需要Fiddler工具进行抓包
下载最新版fiddler ,强烈建议在官网下载:https://www.telerik.com/download/fiddler
-
正常安装,下一步,下一步,安装完毕后,
-
先不用打开软件,下载并安装Fiddler证书生成器
-
Fiddler证书生成器:http://www.telerik.com/docs/default-source/fiddler/addons/fiddlercertmaker.exe?sfvrsn=2
-
打开Fiddler,点击工具栏中的Tools—>Options
-
点击
https
设置选项,勾选选择项 -
点击Actions,点击第二项:Export Root Certificate to Desktop,这时候桌面上会出现证书
FiddlerRoot.cer
文件,点击OK设置成功,关闭fiddler -
在受信任的根证书颁发机构,对证书进行导入
-
重新打开fiddler,就可以在电脑上进行
https
抓包了。
附加:
若要删除证书认证
1.清除C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA
目录下所有文件
2.清除电脑上的根证书,WIN+R快捷键,输入:certmgr.msc
, 然后回车,查找所有fiddler证书,然后删除。
3.清除浏览器上的证书文件 ,此处需要仔细查找带有FiddlerRoot
的字样,并删除,以谷歌浏览器为例说明,在浏览器上输入: chrome://settings/
,
4. 打开fiddler,点击工具栏中的Tools—>Options
,点击Actions,选择最后一项,Reset All certificates
,然后关闭
以上抓包安装就不截图说明了(以上抓包文字来着大佬博客的部分内容,简洁叙述),大佬的博客讲的很清晰,而且很实用,如果安装后不能抓包,也可参考大佬博客操作,进行检查.https://www.cnblogs.com/liulinghua90/p/9109282.html
下面进行抓包操作
先打开微信,然后打开Fiddler,再打开小程序.
通过抓包获取信息参数(要对这些参数有感觉,你就会发现有很多你要找的东西,可以参考第四步的代码,看看需要找的参数)
然后进行更新查找信息
第四步 修改现成python代码(第四,五,六步在腾讯云上操作)
这段代码主要需要修改的部分已经用xxxxxx表示,换掉xxxxxx这行的数据,就差不多可以了
分别为token值(失效后需要更换,就好比验证码一样有有效期)、打卡人昵称(可写自己的微信昵称,主要是给你自己看的)、喵提醒中的喵码(之前上面获取的)和打卡人地址(可从Fiddler中看到之前打卡的位置信息),还有按需要设置好自己想要打卡的时间范围。
将修改后的代码贴到腾讯云的云函数的index.py
中
代码:
import json
import logging
import requests, time, random
import datetime
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 日检日报提交后字典的参数,返回中文
def get_status1(self):
if self['code'] == 0:
# return "日检日报成功"
return "自动打卡(日检日报)成功"
elif self['code'] == 1:
return "日检日报打卡时间结束"
elif self['code'] == -10:
return "Token已失效,请及时更换Token值"
else:
return "发生未知错误,请及时检查!"
# 健康打卡提交后字典的参数,返回中文
def get_status2(self):
if self['code'] == 0:
return "自动打卡(健康打卡)成功"
elif self['code'] == 1:
return "健康打卡时间结束"
elif self['code'] == -10:
return "Token已失效,请及时更换Token值"
else:
return "发生未知错误,请及时检查!"
class Do:
def __init__(self):
# Token 列表
self.tokenArray = ["xxxxxxxxxxxxxxxxxxxxx"]
#用Fiddler抓包token值(需定期更换)修改,
#可以填多个token值,可以进行for循环遍历,打卡多个微信号.
#["token1","token2","token3",...,"tokenN"]
self.tokenName = ["xxxxx"] #可写微信昵称 修改
# 喵提醒通知
self.notifytoken = 'xxxxxxx' #喵码 修改
self.api1 = "https://student.wozaixiaoyuan.com/heat/save.json" # 日检日报 提交地址
self.api2 = "https://student.wozaixiaoyuan.com/health/save.json" # 健康打卡 提交地址
self.headers = {
"Host": "student.wozaixiaoyuan.com",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) xxxxxxxxxxxxx WindowsWechat",
"Referer": "https://servicewechat.com/wxcexxxxxxxxxxx/151/page-frame.html",
"token": "xxxxxxxxxxx", #需要修改,也可以不用填,开头已经有self.tokenArray
"Content-Length": "29",
} #以上都可以在抓包中获取参数信息 可修改
# 日检日报数据
self.data1 = {
"answers": '["0"]',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), #通过随机函数进行填写体温数据
"latitude": "xx.xxxxxxx", # 维度
"longitude": "xx.xxxxxxxx ", # 经度
"country": "中国",
"city": "xx市",
"district": "xx区",
"province": "xx省",
"township": "xxx街道",
"street": "xxx路",
} #置信位息也是通过抓包获取之前是记录
# 健康打卡数据
self.data2 = {
"answers": '["0"]',
#"answers": '["0","3","1","无","无","0"]',
# 把answers属性的值改为'["0","1","1",,"0","xxxxx","1"]'(xxxxx为填入的信息)
#其中0代表问题的第一个选项,1代表问题的第二个选项,以此类推就行.(根据需要填写).
#但是填选问题有风险,就是如果小程序里的选项发生变动,就会可能填错信息,
#那就只能时不时去看一下有没有信息变动.
"latitude": "xx.xxxxxxx ", # 维度
"longitude": "xx.xxxxxxx ", # 经度
"country": "中国",
"city": "xx市",
"district": "xx区",
"province": "xx省",
"township": "xxx街道",
"street": "xx路",
} #置信位息也是通过抓包获取之前是记录
# 获取随机体温
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(36.1, 36.7))
# seq的1,2,3代表着早,中,晚
def get_seq(self):
current_hour = datetime.datetime.now()
current_hour = current_hour.hour + 8
#云函数的运行环境内保持的是 UTC 时间,即0时区时间,和北京时间有8小时的时间差。
#可以通过语言的时间处理相关库或代码包,识别 UTC 时间并转换为+8区北京时间,
#或通过设置环境变量 TZ=Asia/Shanghai 指定时区。
# current_hour = current_hour.hour #(设置这个就需要配置函数环境)
if 0 <= current_hour <= 8: #通过获取当前时间来判断是否在这个时间内执行
return "1" #0到8点内执行
elif 11 <= current_hour < 14: #11点到14点执行
return "2"
elif 17 <= current_hour < 20: #17点到20点执行
return "3"
else:
return "1"
def run(self):
num = 0
for i in self.tokenArray:
#可以设置多个人的微信的token值进行遍历执行,那样一次执行就可以打多个人的卡.
self.headers["token"] = i
print("Token:" + self.headers["token"])
print(datetime.datetime.now())
res1 = requests.post(self.api1, headers=self.headers, data=self.data1, ).json() #日检日报
time.sleep(1)
print(res1)
if self.get_seq( ) == "1":
res2 = requests.post(self.api2, headers=self.headers, data=self.data2, ).json() # 健康打卡提交
time.sleep(1)
print(res2)
msg = {
"id": self.notifytoken,
# "text": "Token" + '\n' + self.tokenName[num] +self.headers["token"] + '\n'+ get_status1(res1) + '\n'+ get_status2(res2) +'\n',
"text": "记得激活48小时提醒" + '\n' + self.tokenName[num] + ",现在进行云端自动打卡" + '\n' + get_status1(res1) + '\n' + get_status2(res2) + '\n'+'哈哈',
"type": "json"
}
else:
msg = {
"id": self.notifytoken,
# "text": "Token" + '\n' + self.tokenName[num] +self.headers["token"] + '\n'+ get_status1(res1) +'\n',
# "type": "json"
"text": '记得激活48小时提醒' + '\n' + self.tokenName[num] + ',现在进行云端自动打卡' + '\n' + get_status1(res1) + '\n',
"type":"json"
}
print(type(msg))
requests.post("http://miaotixing.com/trigger", data=msg)
#喵提醒的地址,会返回执行信息情况.
num = num + 1
current_hours = datetime.datetime.now()
current_hours = current_hours.hour + 8
print(current_hours) #用来测试当前时间是否正确
return True
if __name__ == "__main__":
Do().run()
def main_handler(event, context):
logger.info('got event{}'.format(event))
return Do().run()
#带xxxxxx的信息都是要修改的
- 获取当前时间的问题:
云函数的运行环境内保持的是 UTC 时间
,即0时区时间,和北京时间有8小时的时间差。
-
可以通过语言的时间处理相关库或代码包,识别
UTC 时间
并转换为+8区北京时间 -
或者可以通过设置环境变量
TZ=Asia/Shanghai
指定时区。(2选1)
- 修改设置环境变量的做法:
第五步 设置定时触发器
用户可以编写
SCF 函数
来处理定时任务(支持秒级触发)。定时器会在指定时间自动触发SCF 函数
。定时触发器具有以下特点:
- Push 模型:定时器指定时间到达时直接调用相关函数的
Invoke 接口
来触发函数。该事件源映射关系保存在SCF 函数
中。- 异步调用:定时器始终使用异步调用类型来调用函数,结果不会返回给调用方。有关调用类型的更多信息,请参阅 调用类型。
定时触发器属性
- 定时器名称(必选):最大支持60个字符,支持
a-z
,A-Z
,0-9
,-
和_
。必须以字母开头,且一个函数下不支持同名的多个定时触发器。- 触发周期(必选):指定的函数触发时间。用户可以使用控制台上的默认值,或选择自定义标准的
Cron 表达式
来决定何时触发函数。有关Cron 表达式
的更多信息,请参考下面的内容。- 入参(可选):最大支持
4KB
的字符串,可以在入口函数的 “event” 参数中获取。
Cron 表达式
创建定时触发器时,用户能够使用标准的Cron 表达式
的形式自定义何时触发。定时触发器现已推出秒级触发功能,为了兼容老的定时触发器,因此 Cron 表达式
有两种写法。
Cron 表达式
语法一(推荐)
Cron 表达式
有七个必需字段,按空格分隔。
第一位 | 第二位 | 第三位 | 第四位 | 第五位 | 第六位 | 第七位 |
---|---|---|---|---|---|---|
秒 | 分钟 | 小时 | 日 | 月 | 星期 | 年 |
其中,每个字段都有相应的取值范围:
字段 | 值 | 通配符 |
---|---|---|
秒 | 0 - 59的整数 | , - * / |
分钟 | 0 - 59的整数 | , - * / |
小时 | 0 - 23的整数 | , - * / |
日 | 1 - 31的整数(需要考虑月的天数) | , - * / |
月 | 1 - 12的整数或JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC | , - * / |
星期 | 0 - 6的整数或 SUN,MON,TUE,WED,THU,FRI,SAT。其中0指星期日,1指星期一,以此类推 | , - * / |
年 | 1970 - 2099的整数 | , - * / |
Cron 表达式
语法二(不推荐)
Cron 表达式
有五个必需字段,按空格分隔。
第一位 | 第二位 | 第三位 | 第四位 | 第五位 |
---|---|---|---|---|
分钟 | 小时 | 日 | 月 | 星期 |
其中,每个字段都有相应的取值范围:
字段 | 值 | 通配符 |
---|---|---|
分钟 | 0 - 59的整数 | , - * / |
小时 | 0 - 23的整数 | , - * / |
日 | 1 - 31的整数(需要考虑月的天数) | , - * / |
月 | 1 - 12的整数或 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC | , - * / |
星期 | 0 - 6的整数或 SUN,MON,TUE,WED,THU,FRI,SAT。其中0指星期日,1指星期一,以此类推 | , - * / |
通配符
通配符 | 含义 |
---|---|
,(逗号) | 代表取用逗号隔开的字符的并集。例如:在“小时”字段中 1,2,3 表示1点、2点和3点 |
-(破折号) | 包含指定范围的所有值。例如:在“日”字段中,1 - 15包含指定月份的1号到15号 |
* (星号) | 表示所有值。在“小时”字段中,* 表示每个小时 |
/ (正斜杠) | 指定增量。在“分钟”字段中,输入1/10以指定从第一分钟开始的每隔十分钟重复。例如,第11分钟、第21分钟和第31分钟,以此类推 |
注意事项
在 Cron 表达式
中的“日”和“星期”字段同时指定值时,两者为“或”关系,即两者的条件分别均生效。
示例
下面展示了一些Cron 表达式
和相关含义的示例:
*/5 * * * * * *
表示每5秒触发一次0 0 2 1 * * *
表示在每月的1日的凌晨2点触发0 15 10 * * MON-FRI *
表示在周一到周五每天上午10:15
触发0 0 10,14,16 * * * *
表示在每天上午10点,下午2点,4点触发0 */30 9-17 * * * *
表示在每天上午9点到下午5点内每半小时触发0 0 12 * * WED *
表示在每个星期三中午12点触发
比如:Cron表达式
: 0 0 0,11,17 * * * * (表示每天0点,11点,17点准时触发执行)
第六步 测试发现问题(补充)
有可能出现服务器请求超时, 代码为10的情况将函数服务->函数管理->函数配置->执行超时时间设置至30秒
总结
-
通过参考借鉴几位大佬的博客,本人比较顺利的实现了自动打卡的操作,总之很实用,再也不用上闹钟打卡了.
-
其次,因为token值有时间限制(就好像验证码一样,都是有有效期的),所以就决定着这并不能一劳永逸,但是可以减少我们的打卡工作,通过喵提醒,会告知token值是否失效,失效了再登录上电脑微信,再用Fiddler进行抓包,获取token值,这时只需更改token值就行.
-
还有喵提醒设置的提醒只有48小时内的,需要进行激活48小时使用.
-
以上的操作基本是不会产生费用的,如果硬要说有,那就是你付出了时间成本,去学习使用.
-
最后还有一个问题没解决就是健康打卡那里的选项,每次打卡只选了第一个问题的选项,后面的问题都是空着的,希望有大佬可以继续完善。(问题已解决)