中科大EPC自动程序(2022python版)


一、前言


本程序参考了前辈 @眕眕这篇文章
但前辈的程序不能正确运行,主要问题评论区已有人指出。
最大的问题是“预约”按钮的自动点击,原程序在检测到课程时对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_BOT
    Version : 1.0
    Function : 通过chrome循环访问EPC,自动抢课。
    Instructions: 1. 一次性使用。完成一次抢课操作后程序终止,需再次运行。
                   2. 极少数情况下异常退出,再次启动即可。本学期EPC规则为:
                      单日学时 ≤ 3, 同一老师的同一主题不可重复选, 同时段只能选一节课。
                      上述情况出现时程序会因为无法选课异常退出。
    Author : 星岛僧
    2021/11/3
"""
import datetime
import smtplib
import time
from email.mime.text import MIMEText

from 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')
            break
        time.sleep(1)


# 发邮件通知
def Send_mail(text):
    msg_from = 'xxxxxxn@163.com'  # 发送方邮箱
    passwd = 'xxxxxxxx'  # 填入发送方邮箱的授权码
    msg_to = 'xxxxxxxx'  # 收件人邮箱

    subject = "您的EPC bot"  # 主题
    msg = MIMEText(text)
    msg['Subject'] = subject
    msg['From'] = msg_from
    msg['To'] = msg_to
    try:
        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:
#             break


login()  # 登录
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列表中的索引为152739...上课时间在在tds列表中的索引为tds[18][1],tds[30][1]...操作的索引为2537...
    # 没课的状态下,tds索引长度为15
    if len(tds) > 15:
        i = 15
        while 1:
            # 从第一行开始向下遍历,寻找合适课程
            day = tds[i].text
            hour = 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.alert
                time.sleep(0.5)
                dig_alert.accept()
                # 发送邮件
                Send_mail('Picked a EPC class for you just now')
                # 选到课了就退出程序 给网页充足的响应时间
                status = False
            i = i + 12
            # 遍历完了退出循环
            if i > len(tds) - 1:
                break
    else:
        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强多了哈^^

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值