每日打卡,三检打卡 实现定时自动打卡

每日打卡,三检打卡 实现定时自动打卡

打卡小程序:微信小程序(我在校园

最近突发奇想,想搞个自动打卡,不然被班长每天催着打卡,生怕漏打卡,一直上闹钟提醒打卡,

为了解决自动打卡问题,我搜集了一些资料并整理那些大佬的经验,最终实现了在云端打卡,可以释放手机,自动打卡了…

于是乎就决定自己总结一下流程,为今后的实践做参考.

参考并借鉴大佬博客:

  1. https://blog.csdn.net/King_why_love/article/details/110453071
  2. https://blog.csdn.net/King_why_love/article/details/110860778
  3. https://blog.csdn.net/abraham76/article/details/110204797
  4. https://www.cnblogs.com/liulinghua90/p/9109282.html (Fiddler安装问题)
需要准备的工具: 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小时的时间差。

  1. 可以通过语言的时间处理相关库或代码包,识别 UTC 时间并转换为+8区北京时间

  2. 或者可以通过设置环境变量 TZ=Asia/Shanghai指定时区。(2选1)


  • 修改设置环境变量的做法:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


第五步 设置定时触发器


用户可以编写 SCF 函数来处理定时任务(支持秒级触发)。定时器会在指定时间自动触发 SCF 函数。定时触发器具有以下特点:

  • Push 模型:定时器指定时间到达时直接调用相关函数的 Invoke 接口来触发函数。该事件源映射关系保存在SCF 函数中。
  • 异步调用:定时器始终使用异步调用类型来调用函数,结果不会返回给调用方。有关调用类型的更多信息,请参阅 调用类型

定时触发器属性

  • 定时器名称(必选):最大支持60个字符,支持 a-zA-Z0-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秒

在这里插入图片描述

总结

  1. 通过参考借鉴几位大佬的博客,本人比较顺利的实现了自动打卡的操作,总之很实用,再也不用上闹钟打卡了.

  2. 其次,因为token值有时间限制(就好像验证码一样,都是有有效期的),所以就决定着这并不能一劳永逸,但是可以减少我们的打卡工作,通过喵提醒,会告知token值是否失效,失效了再登录上电脑微信,再用Fiddler进行抓包,获取token值,这时只需更改token值就行.

  3. 还有喵提醒设置的提醒只有48小时内的,需要进行激活48小时使用.

  4. 以上的操作基本是不会产生费用的,如果硬要说有,那就是你付出了时间成本,去学习使用.

  5. 最后还有一个问题没解决就是健康打卡那里的选项,每次打卡只选了第一个问题的选项,后面的问题都是空着的,希望有大佬可以继续完善。(问题已解决)

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页