概述

今天两节课的签到都错过了 /(ㄒ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. Vue基础系列文章11---router基本使用

    1.系统中引入路由js文件,加两个连接,分别到用户管理和用户注册页面 <router-link to="/user">用户列表</router-link> ...

  2. 安装 Nginx 修改默认端口

    用远程工具连接我们上次购买的机器,这里我要介绍一个知识点,博主使用的工具是 MobaXterm,这个工具有一个多操作的功能,在下图的位置可以开启多操作,然后连接你的服务器机子即可: 首先我们将机子里面 ...

  3. 爱了爱了!推荐一个Github 70k+点赞的Java学习指南!

    大家好,我是 Guide 哥!今天给大家推荐一个非常不错的 Java 教程类开源项目-JavaGuide ,Github 地址: https://github.com/Snailclimb/JavaG ...

  4. FaceFusion:探索无限创意,创造独一无二的面孔融合艺术!

    FaceFusion:探索无限创意,创造独一无二的面孔融合艺术! 它使用先进的图像处理技术,允许用户将不同的面部特征融合在一起,创造有趣和令人印象深刻的效果.这个项目的潜在应用包括娱乐.虚拟化妆和艺术 ...

  5. 火遍外网的Keychron测评,带你入坑;ps马上5.20了送一个给你的心爱的她/他。

    那些年用过的机械键盘 如果你经常上YouTube或Instagram,然后你又对键盘感兴趣,我相信你肯定看到过他--Keychron K2,他真的是一款曝光量很高的键盘. 1.键盘keychron k ...

  6. 解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module ‘brotli‘ has no attribute ‘error‘

    解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module 'brotli' has no attribute 'error' ...

  7. Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  8. Nginx的反向代理做负载均衡

    对于一个大型网站,随着网站的访问量快速增长,单台服务器很难再支撑起需要,所以我们会购置多个服务器来满足业务量的需求,然后再利用Nginx提供的反向代理功能,来实现多台服务器间的协作功能,提高网站的处理 ...

  9. Vue3学习(16) - 左侧显示分类菜单

    写在前面 和大家不太一样,我觉得今年的自己更加relax,没有亲戚要走,没有朋友相聚,也没有很好的哥们要去叙旧,更没有无知的相亲,甚至可以这么说没有那些闲得慌的邻居. 也可以说是从今天开始,算是可以进 ...

  10. 【Unity3D】Unity与Android交互

    1 前言 ​ 本文主要介绍 Unity 打包发布 Android apk 流程.基于 AndroidJavaObject(或 AndroidJavaClass)实现 Unity 调用 Java 代码. ...