图书馆 签到 & 预约
GMAIL:lianghaioh@gmail.com
更新与纠正(2021/10/13)
程序已集成预约和签到功能。
预约:预约明天的座位
签到:完成今天的预约,需要程序一直保持在后台
通知:邮件提醒
Bug: 周四执行程序时会出现预约错误,原因是图书馆周五下午不开放,目前正在解决,等周四的时候在测试。
相关文件下载
图书馆系统界面
1.预约与管理
2. 扫码签到
1. Webdriver安装与配置
1.1 下载 chromedriver
-
用chrome浏览器打开 查看版本
-
在此处下载与版本相对应的chromedriver
-
将 chromedriver放在python路径下
-
测试是否配置成功
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()