我在校園"不打卡" (第三版)
前段時間有小伙伴說JWsession失效很快, 每次都要抓包, 當時我還不信, 因為沒遇到過。直到昨天突然發現JWsession值失效了, 我還是和往常一樣去抓包獲取JWsession值, 可到第二天就驚呆了, 第一次發現這玩意失效這么快, 我尋思着不能每次都這么干吧,這就失去方便我們打卡的意義了。
內心是
通過查找些資料, 查到了用賬號和密碼登錄的操作。
這里借鑒了這篇博客的方法 :https://blog.csdn.net/qq_43531216/article/details/119428517, 通過賬號和密碼來獲取JWsessio的方法
話不多, 先解決獲取JWsession
的問題 :
注意 : 這里只是在測試 JWsession 怎么獲取
測試JWsession獲取
import requests
import json
# 登陸接口
# self.loginUrl = "https://gw.wozaixiaoyuan.com/basicinfo/mobile/login/username"
# 登陸
class Login:
def __init__(self):
# 賬戶名或者手機號
self.username = "xxxxxxxx" #一般是手機號
# 登錄密碼
self.password = "xxxxxxxx" #數字密碼
# 登陸接口
self.loginUrl = "https://student.wozaixiaoyuan.com/basicinfo/mobile/login/username"
# 請求頭
self.header = {
"Host": "student.wozaixiaoyuan.com",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"User-Agent": "xxxxxxxxxxxxxxx",
"Content-Length": "29",
}
# 請求體(必須有) self.body = "{}"
self.body = "{}"
def login(self):
# 用戶名或賬號
url = self.loginUrl + "?username=" + self.username + "&password=" + self.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
jwsession = response.headers['JWSESSION']
print(jwsession)
return True
else:
print("登陸失敗,請檢查賬號信息和密碼是否正確")
self.status_code = 4
return False
if __name__ == "__main__":
Login().login()
在pycharm中運行的結果 :
經過測試獲取JWsession沒問題; 那接下來就插入代碼中
賬號和密碼的問題
去年的版本應該是沒有賬號的, 都是直接用微信登錄的, 今年增加了綁定手機號和設置密碼, 如果忘記密碼了,也不要着急, 用手機驗證碼就能修改
首先打開我在校園
的微信小程序, 點擊我的
點擊設置
點擊密碼修改
忘記密碼的話選驗證手機
, 記得密碼的話, 想修改密碼可以直接修改
ok, 記住密碼和賬號就可以操作了
總代碼
接下來修改基於第一版和第二版的代碼:
以下代碼還是需要第一次抓包的信息的, 不會抓包的小伙伴可以看第一版的, 第一版的有抓包過程描述, 只需抓一次包后, 后續沒啥問題就不用抓包了.
如果沒有看過第一第二版的小伙伴可以去看一下,再來操作會方便很多, 之前的方法就不贅述了.
第一版 : https://blog.csdn.net/honorzoey/article/details/111386632?spm=1001.2014.3001.5501
第二版 : https://blog.csdn.net/honorzoey/article/details/118658903?spm=1001.2014.3001.5501
博客園地址 : 我在校園打卡第一版
博客園地址 : 我在校園打卡第二版
有些改動為了盡量簡潔, 這里沒有提供多賬號打卡, 下面代碼是一個賬號打卡的, 然后xxxxxxx的地方是需要根據自己的信息填的(個人隱私的原因,在我的代碼能運行成功后的部分代碼含有個人信息, 我就都用 xxxx 代替了), 還是希望小伙伴能認真看一下代碼, 不要全部照搬, 根據自身情況修改, 代碼不難的, 有基礎都是可以的. 如果有個別模塊(庫)的用法不清楚的, 可自行上網查找或者查看python的官方文檔, 這也是學習的過程呀!
import json
import logging
import requests, time, random
import datetime
# 新加的發郵件功能
import smtplib # smtp服務器
from email.mime.text import MIMEText # 郵件文本
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 "jwsession已失效,請及時更換jwsession值"
else:
return "發生未知錯誤,請及時檢查!"
# 健康打卡提交后字典的參數,返回中文
def get_status2(self):
if self['code'] == 0:
return "自動打卡(健康打卡)成功"
elif self['code'] == 1:
return "健康打卡時間結束"
elif self['code'] == -10:
return "jwsession已失效,請及時更換jwsession值"
else:
return "發生未知錯誤,請及時檢查!"
# 定義發郵件函數sendemail()
def sendemail(receiver, content):
subject = "我不在校園打卡" # 郵件標題
sender = "xxxxxxxxxx@126.com" # 發送方的郵件
recver = receiver # 接收方
password = "xxxxxxxx" # 郵箱的授權密碼; 注意是授權密碼, 不是郵箱密碼; 詳情看第二版
message = MIMEText(content, "plain", "utf-8")
# content 發送內容 "plain"文本格式 utf-8 編碼格式
message['Subject'] = subject # 郵件標題
message['To'] = recver # 收件人
message['From'] = sender # 發件人
smtp = smtplib.SMTP_SSL("smtp.126.com", 994) # 實例化smtp服務器
# smtp = smtplib.SMTP_SSL("smtp.163.com", 465) # 實例化smtp服務器
smtp.login(sender, password) # 發件人登錄
smtp.sendmail(sender, [recver], message.as_string()) # as_string 對 message 的消息進行了封裝
smtp.close()
# 定義用密碼登錄的函數
def login(username,password):
# 登陸接口
loginUrl = "https://student.wozaixiaoyuan.com/basicinfo/mobile/login/username"
url = loginUrl + "?username=" + username + "&password=" + password
session = requests.session()
# 請求頭
headers = {
"Host": "student.wozaixiaoyuan.com",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"User-Agent": "xxxxxxxxxxxxxxxxx", #這個第一次抓包都有,換上自己的就行
"Content-Length": "29",
}
# 請求體(必須有) body = "{}"
body = "{}"
response = session.post(url=url, data=body, headers=headers)
res = json.loads(response.text)
if res["code"] == 0:
print("登陸成功")
# 登錄成功獲取JWSESSION
jwsession = response.headers['JWSESSION']
print(jwsession)
record = "登陸成功 jwsession值為"+jwsession
return jwsession
else:
print("登陸失敗,請檢查賬號信息和密碼是否正確")
record = "登陸失敗,請檢查賬號信息和密碼是否正確"
return False
class Do:
def __init__(self):
self.wechatName = "xxxxxxx" # 可寫微信昵稱, 不修改也可
# 喵提醒通知
self.notifytoken = 'xxxx' # 喵碼
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": "xxxxxxxxxxxxxx", # 自行修改
"Referer": "xxxxxxxxxxx", # 第一次抓包都有的
"Content-Length": "29",
} # 以上都可以在抓包中獲取參數信息
# 請求體(必須有) self.body = "{}"
self.body = "{}"
# 日檢日報數據
self.data1 = {
"answers": '["0"]',
"seq": self.get_seq(),
"temperature": self.get_random_temprature(), # 通過隨機函數進行填寫體溫數據
"latitude": "xxxxxxxx", # 維度
"longitude": "xxxxxxxx", # 經度
"country": "xx",
"city": "xxx市",
"district": "xx區",
"province": "xxx省",
"township": "xxxx街道",
"street": "xxxxx",
} # 位置信位息也是通過抓包獲取之前是記錄
# 健康打卡數據
self.data2 = {
# "answers": '["0"]',
"answers": '["0","3","1","無","無","0"]', # 根據自己的打卡的選項寫哈, 別搞錯了呀, 不然被隔離就慘了
"latitude": "xxxxxxx", # 維度
"longitude": "xxxxxxxxx", # 經度
"country": "中國",
"city": "xx市",
"district": "xx區",
"province": "xx省",
"township": "xxx街道",
"street": "xxxxx",
} # 置信位息也是通過抓包獲取之前是記錄
# 獲取隨機體溫
def get_random_temprature(self):
random.seed(time.ctime())
return "{:.1f}".format(random.uniform(36.1, 36.7)) #隨機獲取溫度 范圍在36.1到36.7的正常溫度
# seq的1,2,3代表着早,中,晚 , 根據觸發器定的觸發運行時間來決定運行哪段代碼
def get_seq(self):
current_hour = datetime.datetime.now()
# current_hour = current_hour.hour + 8
current_hour = current_hour.hour
if 0 <= current_hour <= 8: # 0點到8點這個時間段能運行代碼的話就觸發第一個打卡即有健康打卡和日檢日報的打卡
return "1"
elif 11 <= current_hour < 14: # 11點到12點內僅僅觸發日檢日報的打卡
return "2"
elif 17 <= current_hour < 20: # 17點到20點內僅僅觸發日檢日報的打卡
return "3"
else: # 除了上述時間外的時間, 都觸發兩個打卡即健康打卡和日檢日報的打卡
return "1"
def run(self):
# 賬戶名或者手機號
username = "xxxxxxxxxxx" #一般是手機號碼
# 登錄密碼
password = "xxxxxx" # 一般是6到8位純數字密碼
lo = login(username, password)
if lo == False:
print("登錄失敗!有可能是賬號或密碼錯誤")
sendemail("xxxxxxxxxx@qq.com", "打卡失敗; 登錄失敗!有可能是賬號或密碼錯誤" + "\n" + "時間為:" + str(
datetime.datetime.now())) # 調用發郵件函數, 這個郵箱是接收郵箱
msg = {
"id": self.notifytoken,
"text": '記得激活48小時提醒' + '\n' + "打卡失敗; 登錄失敗!有可能是賬號或密碼錯誤" + "\n" + "時間為:" + str(
datetime.datetime.now()),
"type": "json"
}
else:
self.headers["JWSESSION"] = lo
print("JWsession:" + self.headers["JWSESSION"])
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)
sendemail("xxxxxxxx@qq.com", "現在進行雲端自動打卡" + "\n" + get_status1(res1) + "\n" + get_status2(
res2) + "\n" + "哈哈哈\n" + "打卡時間為:" + str(datetime.datetime.now()) ) # 調用發郵件函數,這個郵箱是接收郵箱
msg = {
"id": self.notifytoken,
"text": "記得激活48小時提醒" + '\n' + self.wechatName + ",現在進行雲端自動打卡" + '\n' + get_status1(
res1) + '\n' + get_status2(res2) + '\n' + "哈哈" ,
"type": "json"
}
else:
sendemail("xxxxxxxx@qq.com", "現在進行雲端自動打卡" + "\n" + get_status1(res1) + "\n哈哈\n" + "打卡時間為:" + str(
datetime.datetime.now())) # 調用發郵件函數, 這個郵箱是接收郵箱
msg = {
"id": self.notifytoken,
"text": '記得激活48小時提醒' + '\n' + self.wechatName + ',現在進行雲端自動打卡' + '\n' + get_status1(res1) + '\n' ,
"type": "json"
}
print(type(msg))
requests.post("http://miaotixing.com/trigger", data=msg)
current_hours = datetime.datetime.now()
current_hours = current_hours.hour
print(current_hours)
return True
if __name__ == "__main__":
uses = Do()
uses.run()
def main_handler(event, context):
logger.info('got event{}'.format(event))
return Do().run()
以上代碼有郵件提醒和公眾號:喵提醒的功能; 如果不需要提醒可自行修改或注釋掉部分代碼; 以上代碼僅供參考, 可能還有其他問題存在, 以實際情況為准.
注意 : 隨着代碼增加, 執行時間也在增長, 需要在雲函數上設置執行超時時間(盡量設置長些)
說明一下, 如果代碼太龐大, 雲函數不一定能運行的起來, 適當增加功能就好, 我就是試過在pycharm上能跑得出, 到雲函數上就不行了.
- 第三版的改動主要是以不用手動抓包獲取JWsession為主, 其他的沒啥新增, 希望小伙伴能都能測試成功!
附加
有個小伙伴反應,運行代碼的時候賬號被凍結, 貌似這種方法也不太穩定, 我也遇到了, 有時候密碼和賬號都正確也登錄不上..... 確實很不穩
但凍結之后通過手機驗證碼修改密碼還是可以在小程序上登錄的
以上內容僅供參考學習, 有問題歡迎評論區留言