📲 我在校园打卡(Python)

新版本我在校园取消了原来的token鉴权机制,改为JWSESSION进行鉴权。

我结合两个位大神的程序更改了一下源代码实现了以下功能

😊目前实现

  • 使用自动登录的方式获取jwsession值,将jwsession储存在leanCloud
  • 增加了一言一句话,调用google翻译的api来翻译一言一句话(心灵鸡汤😂)
  • 使用PushPlus每天自动发送告诉你是否打卡成功邮件

🚩准备工作

纯python编写,需要安装第三方库requests leancloud

🌕依赖安装(本地测试,也可以不测试,之间上传)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple leancloud

👌开始

1. 获取 PushPlus 的 token

微信搜索公众号“pushplus 推送加”,关注后即可生成属于自己的 token,后面需要用到

2.注册leanCloud

1)注册 leanCloud 账号

2)到控制台新建应用,应用名字随意,应用版本选择 开发版

3)进入应用,点击左侧的“数据存储 ➡ 结构化数据”,新建 Class:名称为“Info”,Class 访问权限为“所有用户”,下面的 ACL 权限选择“限制写入”

4)进入刚才创建的 Class,添加新列,值为“jwsession”,之后添加新行,注意这时候 objectId 会有一个值。如果你知道如何抓包获取自己的 jwsession,则可以填入 jwsession 值,否则可以随便填。

5)点击左侧的“设置 ➡ 应用凭证”,记住 appId 和 masterKey(请务必自己保管好,不要泄露) 的值,待会需要用到

3. 创建云函数

1)注册腾讯云账号并登录,进行实名认证

2)到 https://console.cloud.tencent.com/scf/list?rid=1&ns=default ,选择 “新建云函数” ➔ “自定义创建”,提交方法,可以直接在线编辑然后将代码复制里面,然后点击完成就创建好了

4. 修改配置文件

到刚才新创建的云函数中,打开代码配置文件进行修改。

1)“我在校园”账号配置项说明:

  • username:“我在校园”的账号,一般是你的手机号码
  • password:“我在校园”的密码,忘记了打开小程序重新设置就行
  • temperature:默认上报的体温为 36°C,如果你想随机上报体温,请以“36~38”的形式填写
  • city:你学校所在的城市
  • school:你学校的名字

2)“pushPlus” 账号配置项说明:

  • isEnable:默认 false,表示不开启消息提醒功能,若要开启请修改为 true
  • notifyToken:之前你从 pushPlus 公众号那里获取的 token

3)“leanCloud” 账号配置项说明:

  • appId:之前在 leanCloud 获取的 appId
  • masterKey:之前在 leanCloud 获取的 masterKey

5. 安装 leanCloud 库

到刚才新创建的云函数中,ctrl + shift + ~ 新建终端,cd 进入 index.py 所在的文件夹中,通过如下命令安装 leanCloud 库:

pip3 install leancloud -t .

可能会报错,主要是因为相关库版本不匹配的问题,不影响正常使用。看到 successfully installed 就说明安装成功了。

代码段(云函数)

# -*- Codeing = utf-8 -*-
# @Time : 2021/11/5 8:12
# @Author : Wans
# @File : 健康打卡2.5.py
# @Software : PyCharm


import json
import logging
import random
import requests
import time
import datetime
import leancloud

# 将你的账号和密码写在下面引号内
username = ""
password = ""
# 修改此处token值,打开官网扫码点击一对一就可以看见token值:http://www.pushplus.plus/ 将获取到的token值填写在下面引号内
token = ''
# leancloud的appId和key值
appId = ""
masterKey = ""

logger = logging.getLogger()
logger.setLevel(logging.INFO)


class leanCloudss:
    # 初始化 leanCloud 对象
    def __init__(self):
        leancloud.init(appId, master_key=masterKey)
        self.obj = leancloud.Query('Info').first()

    # 获取 jwsession
    def getJwsession(self):
        return self.obj.get('jwsession')

    # 设置 jwsession
    def setJwsession(self, jwsession):
        self.obj.set('jwsession', jwsession)
        self.obj.save()


# 自动登录获取jwsession值
class WoZaiXiaoYuanPuncher:
    def __init__(self):
        # JWSESSION
        self.jwsession = None
        # 打卡结果
        self.status_code = 0
        # 登陆接口
        self.loginUrl = "https://gw.wozaixiaoyuan.com/basicinfo/mobile/login/username"
        # 请求头
        self.header = {
            "Accept-Encoding": "gzip, deflate, br",
            "Connection": "keep-alive",
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.13(0x18000d32) NetType/WIFI Language/zh_CN miniProgram",
            "Content-Type": "application/json;charset=UTF-8",
            "Content-Length": "2",
            "Host": "gw.wozaixiaoyuan.com",
            "Accept-Language": "en-us,en",
            "Accept": "application/json, text/plain, */*"
        }
        # 请求体(必须有)
        self.body = "{}"

    # 登录
    def login(self):

        url = f'{self.loginUrl}?username={username}&password={password}'
        self.session = requests.session()
        # 登录
        response = self.session.post(url=url, data=self.body, headers=self.header)
        res = json.loads(response.text)
        if res["code"] == 0:
            print("使用账号信息登录成功")
            jwsession = response.headers['JWSESSION']
            return jwsession
        else:
            print(res)
            print("登录失败,请检查账号信息")
            self.status_code = 5
            return False

class Custom:
    def __init__(self):
        pass

    # 调用一言一句话
    def YiYan(self):
        data = {
            'c': 'j',
            'encode': 'text',
            'charset': 'utf-8',
        }
        HitokotoUrl = 'https://v1.hitokoto.cn/'
        YiJvHua = requests.get(url=HitokotoUrl, params=(data)).text
        # url_google = 'http://xy1314.xyz/API/Google/api.php?msg={}&b=en'.format(YiJvHua)
        # translation = requests.get(YiJvHua).text
        return YiJvHua

    # 调用PushPlus
    def PushPlus(self, text):
        data = {
            "title": "我在校园",
            "content": "{}".format(text),
            "template": "json"
        }
        PushPlus_Url = "http://www.pushplus.plus/send?token={}".format(token)
        result = requests.get(PushPlus_Url, params=(data)).text
        return result


# 判度是否返回的code来推送消息
def get_status(self):
    Send_News = Custom()
    if self['code'] == 0:
        text = "哥哥帮你打卡成功了呦!!送哥哥一句话:<br><br>{}".format(Send_News.YiYan())
        return Send_News.PushPlus(text)
    elif self['code'] == 1:
        text = "健康打卡已经结束了哦!!!"
        return Send_News.PushPlus(text + '<br>' + Send_News.YiYan())
    elif self['code'] == -10:
        text = "···jwsession已失效"
        return Send_News.PushPlus(text + '<br>' + Send_News.YiYan())
    else:
        text = "!!!发生未知错误"
        return Send_News.PushPlus(text + '<br>' + Send_News.YiYan())


class answer:
    def __init__(self):
        self.api = "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",
            # 修改5:User-Agent
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat",
            # 修改6:Referer
            "Referer": "https://servicewechat.com/wxce6d08f781975d91/181/page-frame.html",
            "Content-Length": "360",
            "JWSESSION": "{}".format(leanCloudss().getJwsession())
        }

        self.data = {
            "answers": '["0","1","36.5","无"]',
            # 修改8:打卡地址
            "longitude": "109.02697",  # 经度
            "latitude": "32.6955",  # 纬度
            "country": "中国",
            "province": "陕西省",
            "city": "西安市",
            "district": "**区",
            "township": "**街道",
            "street": "***路",
            "areacode": "1111111",
        }

    def get_seq(self):
        current_hour = datetime.datetime.now()
        current_hour = current_hour.hour + 8
        if 0 <= current_hour <= 18:
            return 0
        else:
            return 1

    def run(self):
        print("JWSESSION:" + self.headers["JWSESSION"])
        print('当前时间为:', datetime.datetime.now())
        self.res = requests.post(self.api, headers=self.headers, data=self.data, ).json()  # 打卡提交
        time.sleep(1)
        print(self.res)
        if self.res['code'] != 0 and self.res['code'] != 1:
            leanClouds().setJwsession(WoZaiXiaoYuanPuncher().login())
            get_status(self.res)
            return False
        else:
            get_status(self.res)
            return True


if __name__ == "__main__":
    if answer().run():
        pass
    else:
        answer().run()


def main_handler(event, context):
    logger.info('got event{}'.format(event))
    return answer().run()

📢 声明

  1. 本项目仅供编程学习/个人使用,请遵守Apache-2.0 License开源项目授权协议。
  2. 请在国家法律法规和校方相关原则下使用。
  3. 开发者不对任何下载者和使用者的任何行为负责。
  4. 本程序无任何后门,所有数据仅存留于使用者机器上。
  5. 请不要轻易将自己的账号信息告诉他人。