云函数实现南昌大学疫情打卡自动化

云函数 专栏收录该内容
1 篇文章 0 订阅

#为什么要做自动打卡:起因就是因为学校强制要求要在企业微信学校应用打卡,无论原因没打卡得交800字检讨。不得已,懒是第一生产力就想到云函数实现自动打卡,程序总不会忘吧。

1,企业微信应用怎么找到需要的URL,并成功打卡

起先我想到能不能分享打卡页面的链接给到桌面端,用浏览器来找需要的参数。虽然想法是对的,但是过程出现了问题。从页面分享的链接中未包含微信给到应用的code,继而无法获取token,从浏览器打开会显示用户不存在,那只能换个思路,让应用获取code再从浏览器打开。
在这里插入图片描述

直接获取链接,从桌面端打开
在这里插入图片描述

打开开发者模式(F12),点击网络(network)。为了知道我们选择打卡后浏览器做了什么可以把先之前的记录清空。
在这里插入图片描述

修改一次信息,看看有什么新的活动在这里插入图片描述

可以发现,发送修改信息后多出的活动。
在这里插入图片描述

可以看到请求标头(headers)有token,表单数据(date)包含打卡信息。到这里该怎么做基本就一目了然了。

# encoding=utf-8
import requests
#南昌大学企业微信打卡专属
date = {
        'addressCity': "南昌市",
        'addressInfo': "南昌大学前湖校区",
        'addressProvince': "江西省",
        'closeHb': "否",
        'closeIll': "否",
        'healthDetail': "无异常",
        'healthStatus': "无异常",
        'inChina': "是",
        'isGraduate': "否",
        'isIll': "否",
        'isIsolate': "否",
        'isIsolation': "否",
        'isolatePlace': "无",
        'isolationPlace': "无",
        'temperature': 0,
        'temperatureStatus': "正常",
        'userId': "54181200**"	#填入你的学号
}
headers = {
'Host': 'jc.ncu.edu.cn',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.81',
'token': '******************************',
}#token填入获取的token

url = 'http://jc.ncu.edu.cn/gate/student/signIn'
req = requests.post(url,headers=headers,data=date)
print(req.json())
#返回示例:{'code': '0', 'message': '打卡成功'}

2,云端部署并微信通知打卡状态

仅仅是打卡成功还不够,当然还得知道成没成。

# -*- coding: utf8 -*-
import requests
from io import StringIO
import pytz
import datetime
import json

class Wechat:
    #一个通过注入token打卡的类
    def __init__(self):
        self.url = 'http://jc.ncu.edu.cn/gate/student/signIn'
        self.userId = 54181200    #填写自己的学号
        self.token = '************************'
                        #填写获取的token带引号
        #初始化日志
        self.sio = StringIO('【企业微信签到日志(test)】\n')
        self.sio.seek(0, 2)  # 将读写位置移动到结尾
        self.tz = pytz.timezone('Asia/Shanghai')
        self.nowtime = datetime.datetime.now(self.tz).strftime("%Y-%m-%d %H:%M:%S")
        self.sio.write('运行日期:'+self.nowtime+'\n')    #记录打卡日期时间
    def sendnews(self):
        #表单数据
        date = {
        'addressCity': "南昌市",
        'addressInfo': "南昌大学前湖校区",
        'addressProvince': "江西省",
        'closeHb': "否",
        'closeIll': "否",
        'healthDetail': "无异常",
        'healthStatus': "无异常",
        'inChina': "是",
        'isGraduate': "否",
        'isIll': "否",
        'isIsolate': "否",
        'isIsolation': "否",
        'isolatePlace': "无",
        'isolationPlace': "无",
        'temperature': 0,
        'temperatureStatus': "正常",
        'userId': self.userId
        }
        #请求标头
        headers = {
            'Host': 'jc.ncu.edu.cn',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.81',
            'token': self.token
        }
        req = requests.post(self.url, data=date, headers=headers)
        dump = req.json()
        code = dump["code"]
        message = dump["message"]
        self.sio.write('code状态:')
        self.sio.write(code + '\n')
        self.sio.write('打卡状态:')
        self.sio.write(message)

    def return_(self):
        return self.sio.getvalue()

class WeiXinsend:
    #一个用于调用企业微信DPI发送短消息的类
    def __init__(self,):
        self.corpid = '*********'  # 企业ID
        self.agentid = 1000003  # "企业应用" 第一行 agentid
        self.secret = '**********'  # "企业应用" 第二行 secret
        self.touser = "BaiHongBin"  # "通讯录"->"成员详情" 的帐号 (就是你自己的账号名)

    #获取access_token
    def get_access_token(self):
        url = " https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + self.corpid + "&corpsecret=" + self.secret
        req = requests.get(url=url)
        self.token = json.loads(req.text)["access_token"]

    #获取并发送消息
    def send_new(self):
        url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + self.token
        req = requests.post(url=url, data=json.dumps(self.date))
        if json.loads(req.text)["errcode"] == 0:
            print("(+) 发送成功!")
        else:
            print("(-) 发送失败!")

    # 发送应用消息的格式模板
    def date_x(self,news):
        date = {
            "touser": self.touser,  # 用户对象
            "msgtype": "text",  # 消息类型
            "agentid": self.agentid,  # 企业应用的id
            "text": {
                "content": news  # 消息内容
            }
        }
        self.date = date

    #消息发送接口
    def send_news(self,news):
        hobin = WeiXinsend()
        hobin.date_x(news)
        hobin.get_access_token()
        hobin.send_new()
def main_handler(event, context):
	hobin = Wechat()
	hobin.sendnews()
	WeiXinsend().send_news('{}'.format(hobin.return_()))
将完整的代码部署在云端就行了(可以使用腾讯云函数。如何使用企业微信API获取打卡状态CSDN有很多教程,就不写了)

哎,望疫情早日结束,不打卡的日子早点到来!

  • 2
    点赞
  • 3
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值