我在校园2.5
📲 我在校园打卡(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
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 获取的 appIdmasterKey
:之前在 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()
📢 声明
- 本项目仅供编程学习/个人使用,请遵守Apache-2.0 License开源项目授权协议。
- 请在国家法律法规和校方相关原则下使用。
- 开发者不对任何下载者和使用者的任何行为负责。
- 本程序无任何后门,所有数据仅存留于使用者机器上。
- 请不要轻易将自己的账号信息告诉他人。