概述

今天两节课的签到都错过了 /(ㄒ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. 重新学习一下new Date()

    new Date()你知道多少 很多小伙伴可能都知道, Date是js中的一个内置对象,用于处理日期和时间. 当你调用 new Date() 时,它会创建一个新的日期(Date) 对象. 表示当前本地 ...

  2. 大数据面试题集锦-Hadoop面试题(二)-HDFS

    你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案.如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料. 目录 ...

  3. vim 从嫌弃到依赖(6)——插入模式

    插入模式是vim中主要用来处理输入的一种模式,在这种模式中,用户的输入的字符会显示在窗口中.该模式中的行为与在普通编辑器中输入类似.由于在该模式中输入的字符会被当做有效输入,因此该模式下涉及的到命令也 ...

  4. Vue双向数据绑定原理-下

    Vue双向数据绑定原理-下这一篇文章主要讲解Vue双向数据绑定的原理,主要是通过Object.defineProperty()来实现的,这里我们手写Vue双向数据绑定的原理. 首先我提出一个需求,我的 ...

  5. Intel自曝未来三代酷睿!AI性能涨2倍、再涨2倍

    根据最新财报数据,Intel 2023年第四季度154.1亿美元,同比增长10%,全年收入542亿美元,同比下跌14%,预计2024年第一季度收入122-132亿美元. 其中,酷睿处理器业务为主的CC ...

  6. 【题解】P5461 赦免战俘

    一.题目 现有 \(2^n\times2^n\ (n≤10)\) 名作弊者站成一个正方形方阵等候 kkksc03 的发落.kkksc03 决定赦免一些作弊者.他将正方形矩阵均分为 4 个更小的正方形矩 ...

  7. delphi 异常测试(我自己捕捉)

    由于最近的短信模块老是报SocketErorr错误,有的时候也不确定是哪里有问题,影响短信的销售,所以这里这样写,把出现的异常捕捉到显示出来.然后跳过这个不发送 ------------------- ...

  8. JS LeetCode 566. 重塑矩阵题解分析,数组降维的几种方式

    壹 ❀ 引 今天是过完年到公司的第二天,年前因为封版,到今天我们小组是第一个发版的组,然后就各种踩坑,到现在还在公司等运维解决jenkins问题,闲着也是闲着,做一道算法题,简单记录下解题思路,本题来 ...

  9. NC24416 [USACO 2013 Nov G]No Change

    题目链接 题目 题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K ...

  10. 【Unity3D】伽马校正

    1 伽马相关概念 1.1 人眼对亮度变化的感知 ​ 人眼对亮度变化的感知不是线性的,如下图,人眼对亮区的亮度变化不太敏感,对暗区的亮度变化较敏感.另外,我们可以想象一下,在一个黑暗的房间里,由 1 根 ...