中南大学图书馆座位管理系统网页版早上六点定时登录预约脚本Windows(localhost)/Linux(server)python+selenium

【2023-11-10】这期间变化比较多,这篇博客要保留做纪念了,最新版在这里。

【更新2023.5.8】记录一下吧。期间运行蛮成功的,但是有两个问题,一是座位是通过XPATH选择的,开始还好,后面发现几乎每天的XPATH都会发生改变,于是改用了css选择器,效率上会低一些,但是可以防止我约错位置啊!!第二个就是学校服务器不允许网页登录认证,这是学校问题哈,好在只是坏了一次。下面贴一点预约成功的记录吧。再多说一点,技术无罪,一定不能浪费学校宝贵的资源啊!

【下面是css的更改】

 还有就是羽毛球馆的预约,emmm,不多说。

【2023-9-12】补充:网址变了,CSU_LIB_url = "https://ca.csu.edu.cn/authserver/login?service=http%3A%2F%2Flibzw.csu.edu.cn%2Fcas%2Findex.php%3Fcallback%3Dhttp%3A%2F%2Flibzw.csu.edu.cn%2Fhome%2Fweb%2Ff_second"

有关python、selenium的知识可能需要自己百度一下。下面是windows下的工具:

我的Google Chrome版本

我下载的对应的chromedriver

windows平台下的代码:t_datetime.py

# MY MOTTO: 少时须知凌云志,曾许人间第一流.
# By: Liam-Jdi
# Time:3/30/2023 2:35 PM

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from datetime import datetime
from datetime import timedelta
import time

print("begin:")
print(time.strftime('%Y:%m:%d %H:%M:%S', time.localtime(int(time.time()))))

CSU_LIB_url = "https://ca.csu.edu.cn/authserver/login?service=http%3A%2F%2Flibzw.csu.edu.cn%2Fcas%2Findex.php%3Fcallback%3Dhttp%3A%2F%2Flibzw.csu.edu.cn%2Fhome%2Fweb%2Ff_second"   #登录认证的界面
path =Service(r"C:\chromedriver_win32\chromedriver.exe") #chromedriver下载的位置
browser = webdriver.Chrome(service=path)
browser.implicitly_wait(10)#等待十秒,这个很必要,不然后续可能获取不到元素
#打开网页
browser.get(CSU_LIB_url)
username="YOUR STUDENT ID"    #这里输入您的学号
password="YOUR PASSWORD"       #密码
browser.find_element(By.ID,"username").clear()
browser.find_element(By.ID,"username").send_keys(username)
browser.find_element(By.ID,"password").clear()
browser.find_element(By.ID,"password").send_keys(password)
browser.find_element(By.ID,"login_submit").click()

tomorrow_result = (datetime.now()+timedelta(days=1)).strftime('%Y-%m-%d')
segment = str((datetime.now()-datetime(2023,1,1,5,58)).days+1429695+1)
#下面的这个网址是与你要预约的校区和楼层有关的,我们这里示范的是湘雅新校区图书馆三楼,其它的需要自行登录查看,格式都是类似的,差异就只是segemnt前的。
browser.get('http://libzw.csu.edu.cn/web/seat3?area=77&segment='+segment+'&day='+tomorrow_result+'&startTime=07:30&endTime=22:00')
#下面的这个就是预约对应的位置,需要自己尝试。
browser.find_element(By.XPATH,"##自己尝试,熟练使用浏览器的检查功能##").click()
time.sleep(0.5)
time.sleep(0.5)
browser.find_element(By.XPATH,"/html/body/div[11]/div/table/tbody/tr[3]/td/div[2]/button[2]").click()
time.sleep(0.5)
browser.find_element(By.XPATH,"/html/body/div[11]/div/table/tbody/tr[3]/td/div[2]/button").click()
print(time.strftime('%Y:%m:%d %H:%M:%S', time.localtime(int(time.time()))))
time.sleep(20)
browser.quit()


启动 定时任务的脚本:t_apscheduler.py

# MY MOTTO: 少时须知凌云志,曾许人间第一流.
# By: Liam-Jdi
# Time:3/30/2023 2:30 PM

import os
from apscheduler.schedulers.blocking import BlockingScheduler


def execute():
    os.system('python t_datetime.py')

scheduler = BlockingScheduler()

scheduler.add_job(execute,'cron',hour=6,minute=00)

scheduler.start()

运行t_apscheduler.py 即可。

windows一般是本地自己的电脑上运行,但是自己电脑一般不会在早上六点开机(或许可以定时开机,我没有尝试)。所以如果条件允许可以使用服务器搭建python环境实现。我使用的服务器是腾讯云的centos系统。版本和driver如下:

 下面是服务器端代码:t_datetime.py

# MY MOTTO: 少时须知凌云志,曾许人间第一流.
# By: Liam-Jdi
# Time:3/30/2023 2:35 PM
# QQ-Mail:3161796832@qq.com
#说明:这个文件是预约图书馆的脚本

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from datetime import datetime
from datetime import timedelta
from selenium.webdriver.chrome.options import Options
import time
import os

#图书馆登录的路径
CSU_LIB_url = "https://ca.csu.edu.cn/authserver/login?service=http%3A%2F%2Flibzw.csu.edu.cn%2Fcas%2Findex.php%3Fcallback%3Dhttp%3A%2F%2Flibzw.csu.edu.cn%2Fhome%2Fweb%2Ff_second"

#浏览器路径和driver路径
binary_location = '/usr/bin/google-chrome'
chrome_driver_binary = '/usr/local/Soft/Chrome/chromedriver'
chrome_options = Options()
chrome_options.binary_location = binary_location
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--window-size=1960,1080')

chromedriver = chrome_driver_binary
os.environ["webdriver.chrome.driver"] = chromedriver

browser = webdriver.Chrome(executable_path='/usr/local/Soft/Chrome/chromedriver', chrome_options=chrome_options)

print("begin:")
print(time.strftime('%Y:%m:%d %H:%M:%S', time.localtime(int(time.time()))))
browser.implicitly_wait(10)#等待十秒
#打开网页
browser.get(CSU_LIB_url)
username="YOUR_STUDENT_ID"
password="YOUR_PASSWORD"
browser.find_element(By.ID,"username").clear()
browser.find_element(By.ID,"username").send_keys(username)
browser.find_element(By.ID,"password").clear()
browser.find_element(By.ID,"password").send_keys(password)
browser.find_element(By.ID,"login_submit").click()

#现在开始预约
tomorrow_result = (datetime.now()+timedelta(days=1)).strftime('%Y-%m-%d')
segment = str((datetime.now()-datetime(2023,1,1,5,58)).days+1429696)
browser.get('http://libzw.csu.edu.cn/web/seat3?area=77&segment='+segment+'&day='+tomorrow_result+'&startTime=07:30&endTime=22:00')
browser.find_element(By.XPATH,"##自己尝试,熟练使用浏览器的检查功能##").click()
time.sleep(0.5)
browser.find_element(By.XPATH,"/html/body/div[11]/div/table/tbody/tr[3]/td/div[2]/button[2]").click()
time.sleep(0.5)
browser.find_element(By.XPATH,"/html/body/div[11]/div/table/tbody/tr[3]/td/div[2]/button").click()

print("end:")
print(time.strftime('%Y:%m:%d %H:%M:%S', time.localtime(int(time.time()))))
time.sleep(20)
browser.quit()

定时任务的脚本:t_apscheduler.py同上windows的。

我在服务器上 使用nohub后台进程。

nohub python t_apscheduler.py > zndxtsg.log 2>&1 &
//后台进程,退出终端仍可运行。将错误和输出都重定向到zndxtsg.log文件中,可供后续查看。

很多细节没有写出来,但是大致思路给出了,同学可以按照这个思路自己设计自己的脚本。

如果需要也可以联系我。QQ:3161796832.

希望大家合理利用工具,不要浪费中南大学宝贵的图书馆资源嗷!

写在最后:因为本人是计算机专业学生,想写一个预约脚本已经很久了,但之前因为各种原因没有进行到底。最近我的一位卷王朋友和我提了一嘴,早上六点起床约图书馆,然后八点就要去上早八,约完之后想睡个回笼觉根本睡不饱。想来也是,我可不忍心让她每天六点起床约图书馆然后睡眠不足课上打瞌睡。那就动手去做吧!写这个脚本前前后后花了大概两天的时间吧,原理和过程很简单,只不过在调试的过程中会出现这样或那样的问题。写这个之前其实是不确定linux是否可以使用selenium进行相关操作的,我是在windows上调试好了,稍作修改在linux下继续调试。可能还有一点小问题,因为第一天早上正常预约,但是第二天早上域名解析出现了错误,猜测是因为腾讯云dns解析出错了,但是我白天运行是正常的,又或者图书馆预约的界面在6点时并未准时刷新,所以我把定时启动时间向后调了5s,再看一下效果吧。整个过程最具有探索性的部分应该就是segment部分,因为那个id号是与预约日期有关的,我还因为乱猜那个被warning了!!!不过后来感觉那个应该不会记录我的操作,一定是管理人员在吓唬我,哈哈哈哈。(扯远了)虽然我尝试找到segment计算方法但是并没找到,不过大概可以确定的是,在有限数据中,segment每过一天加一,所以看到代码里那个计算segment的公式就不要惊讶了。

最后希望我的那位朋友吃饱穿暖睡足,一直做一只快乐小狗勾啊!

被警告的页面(呜呜呜
被警告了呜呜呜

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值