Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python实现工学云自动签到打卡

Python实现工学云自动签到打卡

作者头像
用户8988577
发布于 2022-12-27 08:02:01
发布于 2022-12-27 08:02:01
3.2K03
代码可运行
举报
文章被收录于专栏:言云纪言云纪
运行总次数:3
代码可运行

本文仅用于学习,请勿用于非法商业!转载请注明本文出处! 本文参考地址01:https://github.com/yecca/moguding/blob/1.0/login.py 本文参考地址02:https://blog.csdn.net/weixin_39953845/article/details/111074929

前言

顶岗实习期间学校要求工学云打卡满两百天。但是每天上下班已经很累了,如果再上班期间强制记起打卡的事情反而只会增加工作负担!本文将会以爬虫的方式来解放双手,实现工学云每日定时打卡并发送邮件进行推送!文章底部奉上完整代码!

开发环境

开发语言:Python 3.7.7 运行环境:windows10 工作版 pip库:requests,hashlib,json,time,smtplib,MIMEText 抓包工具:HTTPDebuggerUI,雷电模拟器

工学云接口

本文不叙述抓包过程,接口如下所示:

爬虫编写(Python版)

逻辑流程草图

模拟登录并保存token等信息

引入依赖库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
import json

main入口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    Login_info = {}
    login()
    print(Login_info)   # 打印获取的token等信息

登录方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def login():
    url = "https://api.moguding.net:9000/session/user/v1/login"
    headers = {
        "Content-Type": "application/json; charset=UTF-8",
        "User-Agent": "Mozilla/5.0 (Linux; U; Android 10; zh-cn; ELS-AN00 Build/HUAWEIELS-AN00) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1",
    }
    data = {
        "phone": "你的账号", 
        "password": "你的密码", 
        "loginType": "android"
        }
    res = requests.post(url,headers=headers,data=json.dumps(data)).json()
    if res['code'] != 200 :
        print("登录失败,错误信息为"+res['msg'])
    else:
        Login_info['token'] = res['data']['token']
        Login_info['userId'] = res['data']['userId']
        Login_info['moguNo'] = res['data']['moguNo']

运行效果

获取签到任务id

导入依赖库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import hashlib

main入口方法修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    Login_info = {}
    # login()
    GetPlanId()
    print(Login_info)   # 打印获取的token等信息

生成加密参方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取planId的sign
def getPlanIdSign(userId):
    byStr = str(userId) + "student" + "3478cbbc33f84bd00d75d7dfa69e0daa"
    return getMd5(byStr)

# md5加密
def getMd5(byStr):
    encode = byStr.encode('utf-8')
    return hashlib.md5(encode).hexdigest()

获取任务id方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def GetPlanId():
    login()
    url = "https://api.moguding.net:9000/practice/plan/v3/getPlanByStu"
    headers = {
        "Host": "api.moguding.net:9000",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HTC M9e Build/EZG0TF) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.1566.54 Mobile Safari/537.36",
        "sign": getPlanIdSign(Login_info['userId']),
        "Connection": "keep-alive",
        "Authorization": Login_info['token'],
        "roleKey": "student",
        "Content-Type": "application/json; charset=UTF-8",
        "Accept-Encoding": "",
    }
    data = {
        "state": ""
    }
    res = requests.post(url, headers=headers, data=json.dumps(data)).json()
    Login_info['planId'] = res["data"][0]["planId"]

运行效果

签到并发送邮件

导入依赖库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
import smtplib
from email.mime.text import MIMEText

main入口方法修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    Login_info = {}
    Login_info['address'] = "上海市-嘉定区-宝安公路" #
    get_time()  
    Sign_in()
    print(Login_info)

上下班判断方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据现在时间判断上下班签到
# 上班  8-16
def get_time():
    mytime = time.localtime()
    if mytime.tm_hour < 8 or mytime.tm_hour > 16:
        Login_info['cardType'] = 'END'  # 上班
    else:
        Login_info['cardType'] = 'START'    # 下班

签到请求加密参生成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取签到sign加密参
def getSign(cardType, planId, userId, address):
    byStr = "Android" + str(cardType) + str(planId) + str(userId) + str(address) + "3478cbbc33f84bd00d75d7dfa69e0daa"
    return getMd5(byStr)

发送邮件方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 发送邮件
def send_email(text):
    mail_host = "smtp邮件服务器地址"  
    mail_user = "smtp邮件服务器账号" 
    mail_pass = "smtp邮件服务器授权码"
    sender = mail_user	# 发件人邮箱地址
    receivers = ['收件人邮箱地址']
    content = text
    title = '工学云每日签到信息'
    message = MIMEText(content, 'plain', 'utf-8')
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
    except smtplib.SMTPException as e:
        print(e)

以上方法代码请修改自己的邮件服务器账号密码

发送签到请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 签到
def Sign_in():
    GetPlanId()
    url = "https://api.moguding.net:9000/attendence/clock/v2/save"
    headers = {
        "Host": "api.moguding.net:9000",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HTC M9e Build/EZG0TF) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.1566.54 Mobile Safari/537.36",
        "sign": getSign(Login_info['cardType'], Login_info['planId'], Login_info['userId'], Login_info['address']),
        "Connection": "keep-alive",
        "Authorization": Login_info['token'],
        "roleKey": "student",
        "Content-Type": "application/json; charset=UTF-8",
        "Accept-Encoding": "",
    }
    # 签到打卡信息,根据自己需求更改
    data = {
        "country": "中国", 
        "address": Login_info['address'], 
        "province": "上海市", 
        "city": "上海市", 
        "latitude": "39.910924547299565", # 纬度
        "description": "", 
        "planId": Login_info['planId'], 
        "type": Login_info['cardType'], 
        "device": "Android", 
        "longitude": "116.4133836971231"  # 经度
    }
    res = requests.post(url,headers=headers,data=json.dumps(data)).json()
    if res['code'] == 200 :
        print("签到成功!")
        send_email("工学云签到成功!")
    else :
        print("签到失败,错误原因:" + res.msg)
        send_email("工学云签到失败,错误原因:" + res.msg +"请登录并检查服务器配置信息是否正确!")

完整脚本1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
import hashlib
import json
import time
import smtplib
from email.mime.text import MIMEText

# 模拟登录获取token等信息
def login():
    url = "https://api.moguding.net:9000/session/user/v1/login"
    headers = {
        "Content-Type": "application/json; charset=UTF-8",
        "User-Agent": "Mozilla/5.0 (Linux; U; Android 10; zh-cn; ELS-AN00 Build/HUAWEIELS-AN00) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1",
    }
    data = {
        "phone": "工学云账号", 
        "password": "工学云密码", 
        "loginType": "android"
        }
    res = requests.post(url,headers=headers,data=json.dumps(data)).json()
    if res['code'] != 200 :
        print("登录失败,错误信息为"+res['msg'])
    else:
        Login_info['token'] = res['data']['token']
        Login_info['userId'] = res['data']['userId']
        Login_info['moguNo'] = res['data']['moguNo']

# 获取签到任务ID
def GetPlanId():
    login()
    url = "https://api.moguding.net:9000/practice/plan/v3/getPlanByStu"
    headers = {
        "Host": "api.moguding.net:9000",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HTC M9e Build/EZG0TF) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.1566.54 Mobile Safari/537.36",
        "sign": getPlanIdSign(Login_info['userId']),
        "Connection": "keep-alive",
        "Authorization": Login_info['token'],
        "roleKey": "student",
        "Content-Type": "application/json; charset=UTF-8",
        "Accept-Encoding": "",
    }
    data = {
        "state": ""
    }
    res = requests.post(url, headers=headers, data=json.dumps(data)).json()
    Login_info['planId'] = res["data"][0]["planId"]


# 获取planId的sign
def getPlanIdSign(userId):
    byStr = str(userId) + "student" + "3478cbbc33f84bd00d75d7dfa69e0daa"
    return getMd5(byStr)

# md5加密
def getMd5(byStr):
    encode = byStr.encode('utf-8')
    return hashlib.md5(encode).hexdigest()

# 签到
def Sign_in():
    GetPlanId()
    url = "https://api.moguding.net:9000/attendence/clock/v2/save"
    headers = {
        "Host": "api.moguding.net:9000",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HTC M9e Build/EZG0TF) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.1566.54 Mobile Safari/537.36",
        "sign": getSign(Login_info['cardType'], Login_info['planId'], Login_info['userId'], Login_info['address']),
        "Connection": "keep-alive",
        "Authorization": Login_info['token'],
        "roleKey": "student",
        "Content-Type": "application/json; charset=UTF-8",
        "Accept-Encoding": "",
    }
    # 签到打卡信息,根据自己需求更改
    data = {
        "country": "中国", 
        "address": Login_info['address'], 
        "province": "上海市", 
        "city": "上海市", 
        "latitude": "39.910924547299565", # 纬度
        "description": "", 
        "planId": Login_info['planId'], 
        "type": Login_info['cardType'], 
        "device": "Android", 
        "longitude": "116.4133836971231"  # 经度
    }
    res = requests.post(url,headers=headers,data=json.dumps(data)).json()
    if res['code'] == 200 :
        print("签到成功!")
        send_email("工学云签到成功!")
    else :
        print("签到失败,错误原因:" + res.msg)
        send_email("工学云签到失败,错误原因:" + res.msg +"请登录并检查服务器配置信息是否正确!")
    
# 根据现在时间判断上下班签到
# 上班  8-16
def get_time():
    mytime = time.localtime()
    if mytime.tm_hour < 8 or mytime.tm_hour > 16:
        Login_info['cardType'] = 'END'  # 上班
    else:
        Login_info['cardType'] = 'START'    # 下班

# 获取签到sign加密参
def getSign(cardType, planId, userId, address):
    byStr = "Android" + str(cardType) + str(planId) + str(userId) + str(address) + "3478cbbc33f84bd00d75d7dfa69e0daa"
    return getMd5(byStr)

# 发送邮件
def send_email(text):
    mail_host = "smtp.qq.com"  
    mail_user = "14312400@qq.com" 
    mail_pass = "授权码"
    sender = mail_user
    receivers = ['收件人邮箱']
    content = text
    title = '工学云每日签到信息'
    message = MIMEText(content, 'plain', 'utf-8')
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
    except smtplib.SMTPException as e:
        print(e)
        
if __name__ == "__main__":
    Login_info = {}
    Login_info['address'] = "上海市-嘉定区-宝安公路99" #签到地址
    get_time()  
    Sign_in()
    print(Login_info)

将该脚本设置为每日定时任务即可,本文不再叙述windows/centos系统如何设置定时任务

完整程序运行效果

对本文有任何疑问的童鞋可以本文留言或邮箱联系我。后续将会尝试Springboot版本,敬请期待!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(优化版)工学云自动打卡签到脚本
前言 基于Python实现工学云自动签到打卡文章做的脚本优化 业务逻辑代码 创建文件名为sign.py并拷入以下代码保存 import requests import hashlib import json import time import smtplib from email.mime.text import MIMEText class gxy_sign: # 初始化 def __init__(self,user_account_info,sign_info,email_in
用户8988577
2022/12/27
2.5K1
利用Python实现网易云音乐自动签到
标题:利用Python实现网易云音乐自动签到 作者:cuijianzhe 地址:https://solo.cjzshilong.cn/articles/2020/03/27/1585293177882.html
cuijianzhe
2022/06/14
1.2K0
利用Python实现网易云音乐自动签到
bugku&github自动签到脚本
建议脚本运行在国内,因为bugku貌似把国外屏蔽了。但是GitHub在国内经常被墙,需要自定义一下host,或者用github的镜像站,
R0A1NG
2022/02/19
9780
bugku&github自动签到脚本
使用Python实现平台自动打卡
但要注意,要想使用它还需要安装浏览器驱动。比如我用的是Chrome,就需要安装ChromeDriver。
李志伟
2020/08/17
1.8K0
使用Python快速监控网站状态
群里有朋友问怎么样监控自己的网站运行情况,我这里把我用的分享给大家,使用Python运行哦。
青阳
2021/08/23
1.7K0
自动签到程序 - 雨云签到
用户9426688
2023/07/07
7940
从头搭建一个flask鉴权系统之注册
因为当用户注册时,可能会涉及到给用户发送邮件,所以这里先写一个发送Email的小工具。 直接使用Python自带的smtplib库和email库,我这里使用的是Google的smtp服务,并且把登陆用户名和密码设置在环境变量中,毕竟属于敏感信息嘛。然后就是定义消息体、邮件主题等信息。另外为了提高发送邮件的效率,采用了多线程的方式。
周萝卜
2019/07/17
1.2K0
从头搭建一个flask鉴权系统之注册
Python实现论坛自动签到
[文件] DakeleSign.py ~ 4KB #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'poppy' ''' dakele bbs sigin ''' import sys import urllib2 import urllib import requests import cookielib import json from pyquery import PyQuery as pq import logging loggi
一墨编程学习
2019/08/20
2K0
Serverless 实战:通过 Serverless 架构实现监控告警
在实际生产中,我们经常需要做一些监控脚本来监控网站服务或者 API 服务是否可用。传统的方法是使用网站监控平台(例如 DNSPod 监控、360 网站服务监控,以及阿里云监控等),它们的原理是通过用户自己设置要监控的服务地址和监测的时间阈值,由监控平台定期发起请求对网站或服务的可用性进行判断。 这些方法很大众化,通用性很强,但也不是所有场景都适合。例如,如果我们的需求是监控网站状态码,不同区域的延时,并且通过监控得到的数据,设定一个阈值,一旦超过阈值就通过邮件等进行统治告警,目前大部分的监控平台是很难满足
腾讯云serverless团队
2020/04/26
9720
每日获取变更的CVE漏洞
查看CVE推送每日更新,做成类似于新闻头条的推送是企业安全从业人员最应该掌控的能力。随着安全体系工作的开展,每位甲方安全从业者从开始的朋友圈接收漏洞信息,到各个平台接收漏洞信息,但无论是三方还是朋友圈,都不能百分之百贴合与及时的自己想要掌控的漏洞信息,也正是基于这点,我开始自己做CVE的推送工作。
FB客服
2020/03/18
1.3K0
Python接口自动化(初版)
在项目conf目录创建settings.py文件,所有的配置信息写在这个文件里面。
Meccer
2022/03/12
8790
python邮件自动发送测试报告,看这篇文章就够了
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100698.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/29
4950
python邮件自动发送测试报告,看这篇文章就够了
万物皆可 Serverless 之使用 SCF+COS 给未来写封信
或许你有用过或者听说过《给未来写封信》,这是由全知工坊开发的一款免费应用,你可以在此刻给自己或他人写下一封信,然后选择在未来的某一天寄出,想必那时收到信的人看着这封来自过往的信时一定会十分感动吧。
腾讯云serverless团队
2020/06/12
1K1
【玩转腾讯云】万物皆可Serverless之使用SCF+COS给未来写封信
你也可以访问 http://letter.idoo.top/letter 来亲自体验一下(仅供测试之用,不保证服务一直可用)
乂乂又又
2020/04/22
1.2K0
【玩转腾讯云】万物皆可Serverless之使用SCF+COS给未来写封信
Python3实现自动发送邮件
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
用户9925864
2022/07/27
3390
Python3实现自动发送邮件
​prometheus中使用python手写webhook完成告警
prometheus我们都知道它是最近几年特别火的一个开源的监控工具,原生支持kubernetes,如果你使用的是kubernetes集群,那么使用prometheus将会是非常方便的,而且prometheus也提供了报警工具alertmanager,实际上在prometheus的架构中,告警能力是单独的一部分,主要是通过自定义一堆的rule即告警规则,来周期性的对告警规则进行计算,并且会根据设置的报警触发条件,如果满足,就会进行告警,也就是会向alertmanager发送告警信息,进而由alertmanager进行告警。
dogfei
2021/01/30
5.1K1
​prometheus中使用python手写webhook完成告警
相关推荐
(优化版)工学云自动打卡签到脚本
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档