概述

今天两节课的签到都错过了 /(ㄒoㄒ)/~~

所以决定花点时间做一个自动签到的工具

经过观察发现超星的结构很简单,全都是get请求

目标是,能稳定的长时间在线,每隔一段时间就遍历一次列表中的课程,检查是否有签到,签到成功之后发送邮件通知我

之前维护代理IP的数据库的代码已经稳定工作两个星期了 开心o( ̄▽ ̄)ブ

代码

# -*- coding: utf-8 -*
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import requests as rq
import re
import time
import os name = "xxxx"; # 学号
pwd = "xxxx"; # 密码
schoolid = "xxx"; #学校id
UA = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}
cookie = ""; #所有的课程列表 这个是进入课程 点击任务之后 url中的一部分 懒得分离了 直接放在这里了
course_list=[
"courseId=206282287&jclassId=12510333",
"courseId=210417835&jclassId=21309835",
"courseId=206867449&jclassId=18308658"
] #邮件提醒
def sendMail2(recv_mail,title,content):
msg_from = 'xxxxx@163.com' # 发送方邮箱
passwd = 'xxxx' # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to = [recv_mail] # 收件人邮箱
msg = MIMEText(content,'plain', 'utf-8')
msg['Subject'] = title
msg['From'] = formataddr(["选课提醒助手", msg_from])
msg['To'] = recv_mail
try:
s = smtplib.SMTP_SSL("smtp.163.com", 465)
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
print('邮件发送成功')
except s.SMTPException as e:
print(e)
wirte2file(str(e))
finally:
s.quit() def stlog(msg):
print(msg)
with open("log.txt","a") as f:
time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime());
f.write(time_str+" "+str(msg)+"\n") def getHtml(url,headers): #获取网页独立开来方便做异常处理
try:
r = rq.get(url,headers=headers,timeout=10)
return r
except Exception as e:
stlog(e) def login():
global cookie
stlog("登录成功")
url = "http://passport2.chaoxing.com/api/login?name="+name+"&pwd="+pwd+"&schoolid="+schoolid+"&verify=0"
r = getHtml(url,headers=UA)
cookie = r.headers["Set-Cookie"] def getActionID(html,course):
if len(html) == 0:
return
res = re.findall("activeDetail\(.*.,2,null\)",html)
if len(res) == 0: #没有ID的时候 表示可能是cookie过期了
login() #重新登录
for a in res:
signIn(a[13:-8],course) # 获取所有课程的任务界面
def openTask():
global cookie
headers = {}
headers.update(UA)
headers.update({"cookie":cookie})
for course in course_list:
r = getHtml("https://mobilelearn.chaoxing.com/widget/pcpick/stu/index?"+course,headers=headers);
if r == None:
return
getActionID(r.text,course) def signIn(activeId,course):
if os.path.exists("id.txt"):
with open("id.txt",'r') as f:
ids = f.readlines()
if activeId+"\n" in ids:
return
url = "https://mobilelearn.chaoxing.com/widget/sign/pcStuSignController/preSign?activeId="+str(activeId)+"&"+course
headers = {}
headers.update(UA)
headers.update({"cookie":cookie})
res = getHtml(url,headers=headers)
res = res.text
if "qd_Success" in res: #断言
with open("id.txt",'a') as f:
#sendMail2("xxxxxxx@qq.com","签到成功",res)
stlog(str(activeId)+"签到成功")
f.write(str(activeId)+"\n")
else:
stlog("可能失败了")
stlog(res)
time.sleep(1) count = 0;
while True:
openTask()
count+=1
stlog("----------"+str(count)+"-----------")
time.sleep(100)

其他的

我是windows编写的代码 但是放到linux服务器上面跑的时候遇到了几个问题

文件编码问题

中文注释linux不能正确识别

最前面加

# -*- coding: utf-8 -*

windows 和 linux下换行符不同的问题



上面 后面带^M的是windows的换行符在linux中vim的显示,,, 这样的问题就造成,我判断一个签到是否有被签到的时候会对比错误

需要注意 如果看不懂代码 请不要直接运行上面代码 仅供参考,因为目标网页随时可能发生变化

参考

https://www.z2blog.com/index.php/learn/423.html

[Python] 超简单的 超星学习通自动签到的更多相关文章

  1. 完全机器模拟浏览器操作自动刷网课!不怕被封!!-----python基于selenium实现超星学习通刷视频网课

    (使用过程中有小伙伴反映如果课程的第一章是空白的页面会报错,我当时做的时候是根据我自己的课程,没有第一节是空页面的现象,这个以后有时间我再改一下吧,或者小伙伴自己修改一下也可) 原谅我这个标题党,对叭 ...

  2. [原创]python之简单计算器(超详解,只有基本功能+-*/,还有括号处理)

     不想看过程的话,直接看文章最后的正式源码 作业需求及分析: 流程图 https://www.processon.com/diagraming/580c5276e4b03c844a5a9716 初期感 ...

  3. python requests 简单实现易班登录,自动点赞,评论,发表

    小编能力有限,本文纯属瞎编,如有雷同,你去打辅导员涩 一.前戏 有个操蛋,操蛋,操蛋的辅导员促使小编成长,原因:易班需要活跃度,辅导员安排班上每个人必须去易班上 写文章,写评论,发投票...  我觉得 ...

  4. vscode配置c++环境(超简单)

    vscode配置c++环境(超简单) 超简单!!! 配置c++最麻烦的就是mingw的环境,有很多不同的版本,很杂乱,这里我们用最简单的办法展示. 下载一个devc++. 如果你问我,为什么下了dev ...

  5. python超简单的web服务器

    今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py   1 2 3 #!/usr/bin/python import Simp ...

  6. Python超简单的HTTP服务器

    Python超简单的HTTP服务器 安装了python就可以 python -m SimpleHTTPServer 执行这一个命令即可实现一个HTTP服务器,将当前目录设为HTTP服务目录,可以通过h ...

  7. jsp学习---使用jsp和JavaBean实现超简单网页计算器

    一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...

  8. TypeC一个微软开发的超简单.NET依赖注入/IoC容器

    控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...

  9. 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

    本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...

  10. 打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)具体解释

    为什么要做这个看起来不靠谱的东西呢? 由于刚学android开发,还不能非常好的熟练控制android界面的编辑和操作,所以我的一个急着要的运用就改为html5版本号了,反正这个运用也是须要从serv ...

随机推荐

  1. CTT Day3

    T1 忘了叫什么名字 对于一个排列 \(p\),定义它的权值为其有多少个子串是一个值域从 \(1\) 开始的排列.给定排列 \(p\),对于 \(1\le i\le j\le n\),定义 \(f(i ...

  2. node中的fs模块和http模块的学习

    读取文件 fs 模块 第1个参数就是要读取的文件路径 第2个参数是一个回调函数(error,data)=>{} error 如果读取失败,error 就是错误对象 如果读取成功,error 就是 ...

  3. vue3.2中setup语法糖父组件如何调用子组件中的方法

    父组件如何调用子组件中的方法 父组件.vue <template> <div> <aa ref="testRef"></aa> &l ...

  4. 4.6 Windows驱动开发:内核遍历进程VAD结构体

    在上一篇文章<内核中实现Dump进程转储>中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descriptor即虚 ...

  5. IDE 不用鼠标 向下选择

  6. OGG_Linux_x64_BigData启动ggsci时报错:error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

    问题描述 [root@hadoop03 ggs]$ ./ggsci ./ggsci: error while loading shared libraries: libjvm.so: cannot o ...

  7. NC18389 收益

    题目链接 题目 题目描述 小N是一家金融公司的项目经理.他准备投资一个项目,这个项目要融资L元,融资成功后会得到M元的利润.现在有n个客户.对于第i个客户,他有mi元钱.小N承诺假如最后筹够钱,会给这 ...

  8. 【分布式】load balance 04-java 从零手写实现负载均衡

    负载均衡系列专题 01-负载均衡基础知识 02-一致性 hash 原理 03-一致性哈希算法 java 实现 04-负载均衡算法 java 实现 本节我们来看一下如何实现一负载均衡框架. 源码 核心接 ...

  9. k8s-权限管理

    目录 1. 身份认证 node节点操作 创建普通用户并授权 1. 生成私钥 2. 生成zhangsan用户证书请求文件 3. 为zhangsan用户颁发证书 4. 创建命名空间及pod 5. 创建角色 ...

  10. 【framework】surfaceflinger启动流程

    1 前言 ​ surfaceflinger 的作用是合成来自 WMS 的 Surface 数据,并发送到显示设备. ​ SurfaceFlinger 服务不同于 AMS.WMS.IMP.PMS.DMS ...