目录

  • 一、前言
  • 二、源程序
  • 三、使用步骤
    • 1.把用到的库都安装了
    • 2.下载谷歌浏览器驱动
    • 3.改学号密码
    • 4.改收发邮箱
    • 5.改预定时间
  • 四、运行步骤
  • 注意事项

一、前言


本程序参考了前辈 @眕眕的这篇文章
但前辈的程序不能正确运行,主要问题评论区已有人指出。
最大的问题是“预约”按钮的自动点击,原程序在检测到课程时对tds[25]元素自动点击:

if (week <=MAX) & ((day,course_time) in BOOK_TIME):  #如果满足条件,则自动选课tds[25].click() #选课

但在实测中,tds[25]元素包含:

<input type="submit" style="cursor:pointer" height="25" value="预 约" <="" td=""> # 这个是按钮
<input type="hidden" name="submit_type" value="book_submit">

原程序没有正确定位到预约按钮,所以不会出现点击预约之后的弹窗,程序运行到这一步时出错。
本文对此处进行了修正:

tds[i + 10].find_element(By.CSS_SELECTOR, '[type="submit"]').click()

解决了此问题。由于作业还没写完,其他优化和改进不再详细描述。

二、源程序

"""USTC_EPC_BOTVersion : 1.0Function : 通过chrome循环访问EPC,自动抢课。Instructions: 1. 一次性使用。完成一次抢课操作后程序终止,需再次运行。2. 极少数情况下异常退出,再次启动即可。本学期EPC规则为:单日学时 ≤ 3, 同一老师的同一主题不可重复选, 同时段只能选一节课。上述情况出现时程序会因为无法选课异常退出。Author : 星岛僧2021/11/3
"""
import datetime
import smtplib
import time
from email.mime.text import MIMETextfrom selenium import webdriver
from selenium.webdriver.common.by import By# 学号密码
username = 'SC2101xxxx'
password = 'xxxxx'# 可选时间
BOOK_TIME = [['周一', '19:00-20:30'],['周二', '10:00-11:30'], ['周二', '19:00-20:30'],['周三', '16:00-17:30'], ['周三', '19:00-20:30'],['周四', '14:00-15:30'], ['周四', '16:00-17:30'], ['周四', '19:00-20:30'],['周五', '14:00-15:30'], ['周五', '08:00-09:30'], ['周五', '19:00-20:30'],
]
# Topic url
url = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2002'# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'd:\chromedriver.exe')# 打开首页
def login():wd.get('http://epc.ustc.edu.cn/n_left.asp')name = wd.find_element(By.NAME, 'name')name.send_keys(username)passwd = wd.find_element(By.NAME, 'pass')passwd.send_keys(password)# 手动输入验证码,登录成功后跳出此循环while True:if wd.find_elements(By.NAME, 'name') == []:  # 登陆成功,已跳转print('Log in')breaktime.sleep(1)# 发邮件通知
def Send_mail(text):msg_from = 'xxxxxxn@163.com'  # 发送方邮箱passwd = 'xxxxxxxx'  # 填入发送方邮箱的授权码msg_to = 'xxxxxxxx'  # 收件人邮箱subject = "您的EPC bot"  # 主题msg = MIMEText(text)msg['Subject'] = subjectmsg['From'] = msg_frommsg['To'] = msg_totry:s = smtplib.SMTP_SSL("smtp.163.com", 465)s.login(msg_from, passwd)s.sendmail(msg_from, msg_to, msg.as_string())print('succeed')except:print("发送失败")# def pick_class(web, a):
#     i = 15
#     while 1:
#         # 从第一行开始向下遍历,寻找合适课程
#         day = a[i].text
#         hour = a[i + 3].text.split('\n')[1]
#         # 找到预定时间段,点击预定
#         if [day, hour] in BOOK_TIME:
#             a[i + 10].click()
#             # 处理弹窗
#             alert = web.get_alert()
#             alert.accept()
#             # 发送邮件
#             Send_mail('Picked a EPC for you just now')
#             # 计数器+1
#             CONT = CONT + 1
#         i = i + 12
#         if i > len(a) - 1:
#             break
#         # 选两节课
#         if CONT == 2:
#             breaklogin()  # 登录
wd.implicitly_wait(15)# 选课进行标志位
status = True
# 进入TD界面
wd.get(url)
while status:# 刷新界面wd.refresh()# 查看所有课程# wd.find_element(By.NAME, 'check_all_class').click()# 查找元素tds = list(wd.find_elements(By.CSS_SELECTOR, 'td[align="center"]'))# for i in range(50):#     print(i, tds[i].text)# “星期几”在tds列表中的索引为15,27,39...上课时间在在tds列表中的索引为tds[18][1],tds[30][1]...操作的索引为25,37...# 没课的状态下,tds索引长度为15if len(tds) > 15:i = 15while 1:# 从第一行开始向下遍历,寻找合适课程day = tds[i].texthour = tds[i + 3].text.split('\n')[1]# 找到预定时间段,点击预定if [day, hour] in BOOK_TIME:# Send_mail('There is a class in EPC')tds[i + 10].find_element(By.CSS_SELECTOR, '[type="submit"]').click()#  处理弹窗# wd.switch_to.active_element.click()dig_alert = wd.switch_to.alerttime.sleep(0.5)dig_alert.accept()# 发送邮件Send_mail('Picked a EPC class for you just now')# 选到课了就退出程序 给网页充足的响应时间status = Falsei = i + 12# 遍历完了退出循环if i > len(tds) - 1:breakelse:now = datetime.datetime.now()print(now.strftime("%Y-%m-%d %H:%M:%S"))print('No class')# 访问间隔time.sleep(8)# <input type="submit" style="cursor:pointer" height="25" value="预 约" <="" td=""> 这个是按钮
# <input type="hidden" name="submit_type" value="book_submit">

三、使用步骤

1.把用到的库都安装了

这一步如果不会建议百度

2.下载谷歌浏览器驱动

确保电脑上有谷歌浏览器,下载与浏览器版本匹配的chromedriver,并将程序第36行的路径改为chromedriver的存放路径。

wd = webdriver.Chrome(r'd:\chromedriver.exe')

3.改学号密码

程序第22、23行

username = 'xxxxxxx'
password = 'xxxxxxx'

4.改收发邮箱

程序第56行之后
这里注意授权码不是密码,怎么获取问百度。

    msg_from = 'xxxxx@163.com'  # 发送方邮箱passwd = 'xxxxxxxxxxx'  # 填入发送方邮箱的授权码msg_to = 'xxxxxxx@qq.com'  # 收件人邮箱

第66行,如果发件邮箱是163就不变,如果是QQ邮箱就把163改为qq

    s = smtplib.SMTP_SSL("smtp.163.com", 465)

5.改预定时间

第25行之后:

BOOK_TIME = [['周一', '19:00-20:30'],['周二', '10:00-11:30'], ['周二', '19:00-20:30'],['周三', '16:00-17:30'], ['周三', '19:00-20:30'],['周四', '14:00-15:30'], ['周四', '16:00-17:30'], ['周四', '19:00-20:30'],['周五', '14:00-15:30'], ['周五', '08:00-09:30'], ['周五', '19:00-20:30'],
]

就按这个格式改你预定的时间。

四、运行步骤

运行程序后会弹出一个chrome窗口:

账号密码已经自动填好,手动填写验证码并点击log in,窗口会转入Topic Discussion界面,自动刷新。

注意事项

  1. 做完上面的步骤,手动登录之后,你要做的所有操作程序都会帮你做,有的时候会看到窗口显示有课,别点,程序已经帮你点过了。
  2. 预约失败属于正常现象,EPC网站太**了,响应极慢(不然我也不会开发这个),重新启动程序即可。
  3. 程序异常退出是因为EPC的规则,比如同一话题不能选两次,再次运行即可
  4. 不完美,可改进,后辈加油。

源码公开,使用教程完备,比某骗赞sd强多了哈^^

中科大EPC自动程序(2022python版)相关推荐

  1. 如何构建识别图像中字符的自动程序?一文解读OCR与HTR

    选自Medium 作者:Ajinkya Khalwadekar机器之心编译 参与:Panda.蛋酱 在机器学习和计算机视觉领域,光学字符识别(OCR)和手写文本识别(HTR)长期以来都是人们研究的重要 ...

  2. Autocad、中望CAD自动加载程序研究(注册表法、acad.rx、acaddoc.lsp或acad.lsp)

    Autocad.中望CAD自动加载程序研究(注册表法.acad.rx.acaddoc.lsp或acad.lsp) 一.使用注册表 假设你的arx文件名字是aaa.arx绝对路径是c:\aaa.arx ...

  3. 我的一个学生在运维工作中写的自动日志清理脚本程序

    本文是我的一个学生在运维工作中写的自动日志清理脚本程序,我这里不评价该shell脚本写的好与坏,只是发出来,和大家做一个分享,如果能给大家带来一点点思路上的参考就够了. 自动日志清理脚本程序 #!/b ...

  4. 二代CMS旅游网站程序国际版开发中(支持英文、法文等),支持拓展语言包

    二代CMS旅游网站程序国际版开发中(支持英文.法文.德文等),支持拓展语言包,理论上可以拓展成任何一种语言,前端和后端都支持在线语言切换,前端还支持支付货币的币种切换,敬请期待! 转载于:https: ...

  5. 在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数

    在做研究的时候我们经常需要对模型的参数就行相应的选择,然而有没有觉得每次更改一个参数都需要运行一次仿真程序觉得很无聊呀,运行完程序还要看效果怎么样,然后再根据效果来调整参数,再次运行程序,如此反复. ...

  6. 一个中科大差生的 8 年程序员工作总结

    关注.星标公众号,直达精彩内容 之前分享过一些大佬的程序人生,不少读者留言说喜欢看这类文章,因为多多少少都会对自己有一定的启发,而且也快过春节了,相信大家也没有心思看技术文章了,哈哈. 这个星期我又发 ...

  7. 数字图像分析 中科大 2019回忆版考题及复习重点

    本人在考数字图像分析之前,发现一篇博客:数字图像分析 中科大 2017回忆版考题及复习重点 这篇博客对我帮助较大,自己以及身边的小伙伴们都按照这上面的重点进行复习 今天我也考完了这门课,所以也进行一波 ...

  8. 2019中科大数学考研复试题(回忆版)

    **2019中科大数学考研复试题(回忆版)** 实变函数 1.平面上横坐标或纵坐标为有理数的点集测度为零. 2.{fn}\{f_{n}\}{fn​}是一列可测函数,则 (a)若∫A∣fn−fn−1∣d ...

  9. 我们的系统检测到您的计算机网络中存在异常流量。此网页用于确认这些请求是由您而不是自动程序发出的。

    我们的系统检测到您的计算机网络中存在异常流量.此网页用于确认这些请求是由您而不是自动程序发出的. 用google搜索的时候遇到了这个问题. 具体的原因google也有说明 归纳成下面两点. 可能存在恶 ...

  10. 中科大软件学院人工智能2021秋期末考试涉及知识点(回忆版)

    中科大软件学院人工智能2021秋期末考试涉及知识点(回忆版) 一个关于反向传播的的梯度计算 类似这个链接的算法,但是题目计算是抽象的.激活函数是sigmoid 输入图片size(64,64,3),经过 ...

最新文章

  1. html 8 盒子的background 颜色的面积
  2. 一个完整的Windows程序框架
  3. 机械硬盘4k读写速度_有容乃大,18T企业级机械硬盘旗舰—希捷银河Exos X18测试...
  4. C语言章节作业第五次,C语言第五次上机作业参考答案
  5. Struts + Spring + Hibernate 进阶开端(一)
  6. C语言(从入门到精通)
  7. JS实现将数字金额转换为大写人民币汉字的方法
  8. 数字未来,NFT未来,Game Farmer创始人胡烜峰在IGS上讲述FoxNFT和他的故事
  9. Uniapp实现加入购物车抛物线效果
  10. canvas获取鼠标轨迹相对坐标
  11. FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning(论文翻译)
  12. electron vue点击按钮关闭_electron+vue制做桌面应用--自定义标题栏最大/小化和关闭...
  13. 马斯克要将特斯拉汽车送上火星,还要将《太空怪人》作为背景音乐
  14. 造血干细胞最新研究进展
  15. Complete Internet Repair(电脑网络修复工具)官方中文版V8.1.3.5222 | 网络修复工具使用后仍不能上网?快试试万能网络修复大师
  16. Matlab使用Camera Calibrator工具箱标定相机
  17. QA和QC,傻傻分不清?
  18. 数字城市发展,哪些技术可以深度应用
  19. 哈夫曼树、哈夫曼编码详解
  20. Pr 入门教程之如何添加视觉效果?

热门文章

  1. Fireworks-CS5入门到高级129讲视频教程
  2. 仿iPhone通讯录制作小程序自定义选择组件
  3. bigemap功能介绍,视频教程
  4. bigemap功能介绍
  5. Windows系统查询硬盘序列号
  6. [AI教程]最全人工智能图谱解析和视频下载
  7. 你所不了解的“三消”游戏
  8. GPS之家论坛最新地图下载精选 汇集论坛精华 不断更新中(2013.3.30)
  9. android开发地图找房,androidsdk | 百度地图API SDK
  10. linux firefox 插件开发教程,火狐(firefox)浏览器插件开发简明教程