python+selenium+chromdriver 图书馆预约和签到程序

GMAIL:lianghaioh@gmail.com

更新与纠正(2021/10/13)

程序已集成预约和签到功能。
预约:预约明天的座位
签到:完成今天的预约,需要程序一直保持在后台
通知:邮件提醒

Bug: 周四执行程序时会出现预约错误,原因是图书馆周五下午不开放,目前正在解决,等周四的时候在测试。
相关文件下载

图书馆系统界面

1.预约与管理

在这里插入图片描述

2. 扫码签到

在这里插入图片描述

1. Webdriver安装与配置

1.1 下载 chromedriver

  1. 用chrome浏览器打开 查看版本

  2. 此处下载与版本相对应的chromedriver

  3. 将 chromedriver放在python路径下

  4. 测试是否配置成功

2. 相关python包

pip install selenium
pip install json
pip install smtp

3. 配置文件说明

{
"userName":"*************",#登录10.240.32.6:8099 的用户名
"password":"************", # 密码
"url":"http://update.unifound.net/wxnotice/s.aspx?c=100601185_Seat_100601462_1FC", # 座位二维码提取出的url,可以在 https://jiema.wwei.cn/ 中提取
"email":"260936@qq.com", # 接受消息的邮箱
"floor":4, # 楼层
"room":3, # 这个在网页上看房间在所在楼层的顺序,从1开始,例如403东的顺序是3
"seatId":86 # 座位的号码
}

4. 说明

4.1 预约

固定时段

[8:00 - 13:00] [13:00 - 18:00] [18:00 - 22:00]

由于周五白天只能预约到12:00。因此,程序在周四当天会出现预约错误。

另外,好久之前的代码了,印象模糊,所以就先将就着用吧。我会直接提供源码

4.2 签到

根据预约时段,程序会在 [8:00] [13:00] [18:00] 自动签到。

4.3 使用说明

在早上8点左右打开程序后直接挂着就行,如果相结合windows设置计划程序,那么需要自行修改程序,直接修改Mains()函数即可。

5. 源代码

from selenium import webdriver
import time
import datetime
import calendar
import smtplib
import json
from email.mime.text import MIMEText

class Lib:
    def __init__(self):
        with open("./default.json") as fp:
            Info = json.load(fp)
            self.user = Info["userName"]
            self.pwd = Info["password"]
            self.url = Info["url"]
            self.email = Info["email"]
            self.floor = Info["floor"]
            self.room = Info["room"]
            self.id = Info["seatId"]
            self.appoint = "http://10.240.32.6:8099/ClientWeb/xcus/ic2/Login.aspx?sys=person"
    '''
    @Date: 2021/09/09
    @Message: Send-Email-Server Default
    '''
    def sendEmail(self,text,remail):
        smtp = "smtp.163.com";
        subject = "图书馆占座"
        sender = "messagesmxy@163.com";  # send email
        pwds = "FYWRZLZFYDNBZLYL";  # security Code
        content = text;  # Message Text
        recver = remail;  # Receive email address
        message = MIMEText(content, "plain", "utf-8");
        message['Subject'] = subject;
        message['To'] = recver;
        message['Form'] = sender;
        smtp = smtplib.SMTP_SSL(smtp, 994);  # 实例化邮箱
        smtp.login(sender, pwds);  # 登录
        smtp.sendmail(sender, [recver], message.as_string())
        smtp.close();
        return 1;
    '''
    @Date: 2021/09/09
    @Message: 返回相应坐标
    '''
    def Dates(self):
        date = []
        year = datetime.datetime.now().year
        month = datetime.datetime.now().month
        day = datetime.datetime.now().day
        day_range = calendar.monthrange(year, month)[1];
        if year == 12 and day == day_range:
            year = year + 1;
            month = 1;
            day = 1;
        if year != 12 and day == day_range:
            month = month + 1
            day = 1;
        else:
            day = day + 1;
        end = int(datetime.datetime(year, month, day).strftime("%W"))
        begin = int(datetime.datetime(year, month, 1).strftime("%W"))
        date.append(end - begin + 1);
        date.append(datetime.datetime(year, month, day).weekday() + 1)
        return date
    '''
    @Date: 2021/09/09
    @Message:预约明天的座位
    预约时段:
    8:00 - 13:00
    13:00 - 18:00
    18:00 - 22:00
    注:由于周五图书馆的原因,在周四当天执行预约程序时会出错。
    '''
    def Appoint(self):
        # 自动化配置
        option = webdriver.ChromeOptions()
        #option.add_argument('--headless') #如果不需要显示执行过程的话,请添加本语句
        option.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging']);
        driver = webdriver.Chrome(options=option);
        # 启动预约网站
        driver.get(self.appoint)
        time.sleep(2)
        # 输入账号和密码,登录
        driver.find_element_by_id("username").send_keys(self.user)
        driver.find_element_by_id("password").send_keys(self.pwd)
        driver.find_element_by_class_name("btn-success").click();  # 登录
        time.sleep(2)
        '''
        预约成功后,开始挑选预定的座位
        '''
        Floors = driver.find_elements_by_class_name("glyphicon-circle-arrow-down");
        # print(len(Floors))
        # 挑选楼层
        Floors[self.floor-2].click();  # 点击二楼
        time.sleep(1);
        # 挑选房间
        room_str = "/html/body/div[5]/div/table/tbody/tr/td[1]/div/div/div/div[4]/ul/li["+str(self.floor+1)+"]/ul/li";  # 可以知道房间的数目
        strs = "]/a/span"
        room = room_str + "[" + str(self.room) + strs
        driver.find_element_by_xpath(room).click()
        time.sleep(2)
        # 跳转明天的预约
        dateOps = driver.find_element_by_class_name("fp-date");
        dateOps.click()
        time.sleep(1)
        '''
        关于日期的跳转
        '''
        year = datetime.datetime.now().year;
        month = datetime.datetime.now().month;
        day = datetime.datetime.now().day;
        day_range = calendar.monthrange(year, month)[1];
        date = self.Dates();  # 返回明天是当月的第几周和该周第几天
        x = date[0];  # 行坐标
        y = date[1];  # 列坐标
        # str_date_choose="/html/body/div[6]/table/tbody/tr[2]/td[1]/a["
        str_date_choose = "/html/body/div[6]/table/tbody/tr[";
        str_date_x_y = str_date_choose + str(x) + "]/td[" + str(y) + "]/a";
        if day == day_range:
            # 今天是改月的最后一天,明天是下月第一天
            # 跳转月份
            driver.find_element_by_class_name("ui-icon-circle-triangle-e").click();
        # print(str_date_x_y)
        date_choosen = driver.find_elements_by_xpath(str_date_x_y);  # 已经选择
        if len(date_choosen) == 0:
            str_date_x_y = "//*/table/tbody/tr[" + str(x) + "]/td[" + str(y) + "]/a";
            date_choosen = driver.find_element_by_xpath(str_date_x_y);  # 已经选择
        date_choosen[0].click()
        time.sleep(2)
        ###座位
        seats = driver.find_elements_by_xpath("/html/body/div[5]/div/table/tbody/tr/td[2]/div/div[2]/div/"
                                              "div[2]/div[1]/div[1]/div[4]/div/div[2]/div[3]/div");
        seats[self.id-1].click()
        '''
            预约时间
            '''
        ###start_time
        timeOps = driver.find_elements_by_xpath(
            "/html/body/div[8]/div[2]/form/div[1]/table/tbody[2]/tr[2]/td[2]/div/span[1]/select[1]/option");
        if len(timeOps) == 0:
            timeOps = driver.find_elements_by_xpath(
                "//*/form/div[1]/table/tbody[2]/tr[2]/td[2]/div/span[1]/select[1]/option")
        ##[8:00---13:00] timeOps[1]
        ###[13:00---18:00]  timeOps[1]
        ####[18:00--22:00]  timeOps[1]
        ##[8:00---13:00]
        # timeOps[n].click();
        timeOps[1].click();  # 选择start_time
        ###end_time
        timeEnds = driver.find_elements_by_xpath(
            "/html/body/div[8]/div[2]/form/div[1]/table/tbody[2]/tr[2]/td[2]/div/span[3]/select/option");
        if len(timeEnds) == 0:
            timeEnds = driver.find_elements_by_xpath(
                "//*/form/div[1]/table/tbody[2]/tr[2]/td[2]/div/span[3]/select/option")
        timeEnds[len(timeEnds) - 1].click();  # 获取
        time.sleep(2);
        driver.find_element_by_class_name("mt_sub_resv").click();  # 提交
        time.sleep(2);
        temp_infos = driver.find_element_by_xpath("/html/body/div[9]/div[2]/p");
        self.sendEmail(self.user + temp_infos.text, self.email);  # 发送消息
        if "成功" not in temp_infos.text:
            return False
        date_choosen.clear();
        ##点击返回
        driver.find_element_by_xpath("/html/body/div[9]/div[3]/div/button[2]").click();
        time.sleep(10);
        driver.close();
        time.sleep(4)
        return True;
    '''
    @Date: 2021/09/09
    @Message: 签到程序
    '''
    def Checking(self):
        option = webdriver.ChromeOptions();
        # option.add_argument('--headless')
        option.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging']);
        driver = webdriver.Chrome(options=option);
        # 启动网站
        driver.get(self.url);
        time.sleep(4);
        '''
        输入账号、密码并登录
        '''
        driver.find_element_by_name("szLogonName").send_keys(self.user);
        driver.find_element_by_name("szPassword").send_keys(self.pwd);
        driver.find_element_by_class_name("btn").click();
        time.sleep(10);  # 加载资源
        '''
            验证信息并签到
            '''
        temp_info = driver.find_element_by_xpath("/html/body/div/div[1]/p");
        if "成功" not in temp_info.text:
            fault_info_1 = driver.find_element_by_xpath("/html/body/div/div[2]/p").text;  # 故障原因
            self.sendEmail(fault_info_1, self.email)
            return 0;
        btn = driver.find_element_by_xpath("/html/body/div/div[3]/button");
        btn.click();  # 签到
        temp_info_1 = driver.find_element_by_xpath("/html/body/div/div[1]/p");
        if "成功" not in temp_info_1.text:
            fault_info_2 = driver.find_element_by_xpath("/html/body/div/div[2]/p").text;  # 故障原因
            self.sendEmail(fault_info_2, self.email)
            return 0;
        driver.close()
        return 1;

    '''
    @Date: 2021/09/09
    @Message: 主控程序 - 设置预约和签到时间
    如果想更改程序的话,直接在该模块更改即可
    注:所有的时间设置都与nowTime相关
    '''
    def Mains(self):
        ##开始签到
        try:
            # 不到7点55不可以预约和签到
            if self.nowTime() < 475:
                time.sleep(60 * (475 - self.nowTime()));  # 开始休眠
            if self.nowTime() <= 2400:
                while True:
                    if self.Appoint() == 1:
                        break;
                time.sleep(2);
                while True:
                    if self.Appoint() == 1:
                        break;
                time.sleep(2);
                while True:
                    if self.Appoint() == 1:
                        break;
            time.sleep(10);
        except:
            print("预约失败")
        ##开始签到

        if self.nowTime() < 480:
            time.sleep(60 * (480 - self.nowTime()));  # 开始休眠
        # 8:00 - 8:30 第一次签到
        if self.nowTime() >= 480 and self.nowTime() <= 510:
            if self.Checking() == 0:
                while True:
                    if self.Checking() == 1:
                        break;
                    time.sleep(60);
            else:
                self.sendEmail(self.user + "签到成功_1", self.email)
                print("签到成功_1")
        if self.nowTime() < 780:
            print("当前未到13:00,不可签到-----", datetime.datetime.now());
            time.sleep(60 * (781 - self.nowTime()));
        if self.nowTime() >= 780 and self.nowTime() <= 810:
            if self.Checking() == 0:
                while True:
                    if self.Checking()  == 1:
                        break;
                time.sleep(60);
            else:
                self.sendEmail(self.user + "签到成功_2", self.email)
                print("签到成功_2")
        if self.nowTime() < 1080:
            print("当前未到18:00,不可签到-----", datetime.datetime.now());
            time.sleep(60 * (1081 - self.nowTime()));
        if self.nowTime() >= 1080 and self.nowTime() <= 1130:
            if self.Checking() == 0:
                while True:
                    if self.Checking()  == 1:
                        break;
                time.sleep(60);
            else:
                self.sendEmail(self.user + "签到成功_3", self.email)
            print("签到成功_3")
        return
    '''
    @Date: 2021/09/09
    @Message: 计算当前时间是今天的第几分钟。
    例如:当前为 8:30, 则返回 8*60+30=510
    '''
    def nowTime(self):
        dt = datetime.datetime.now();
        hours = dt.hour;  # 小时[0,24]
        mins = dt.minute;  # 分钟[0,60]
        return hours * 60 + mins;
if __name__ == '__main__':
    lib = Lib()
    lib.Mains()
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值