THU羽毛球场预约脚本
环境准备
time, selenium, PIL, re, baidu-aip
在chrome浏览器的设置–关于Chrome中查询Chrome版本,在https://chromedriver.chromium.org/downloads中下载对应的驱动。
对于较新版本,可以在https://googlechromelabs.github.io/chrome-for-testing/中找,最好使用stable的。
下载驱动并解压后,将其复制到Chrome的安装目录(右击快捷方式,选择打开文件所在的目录,如下图中的chromedriver.exe)
打开环境变量,选择系统变量中的Path,点击编辑,新建,复制上述文件夹目录添加进去。我这里就是
C:\Program Files\Google\Chrome\Application\
这里我们对验证码的识别是使用的百度手写字体识别的API,可以在百度智能云官网https://cloud.baidu.com/
申请。点击产品——识别——文字识别,选择手写文字识别,即可在应用列表创建应用。这里是有每天免费调用额度的。
创建应用后可以看到AppID、API Key、Secret Key,这里需要复制自己的并粘贴到Captcha_OCR.py
的对应位置。
需要新建一个供Chrome浏览器打开和控制的端口。打开设置,隐私和安全性——Windows安全中心——防火墙和网络保护——高级设置,
在入站规则中新建规则,可以自行设置一个新的端口号。
代码修改
set_time = time.mktime(time.strptime("2023-08-25 15:21:00", "%Y-%m-%d %H:%M:%S"))
wait_until(browser, set_time)
在main.py
修改开抢的日期和时间。
将上述开通的端口号,复制到main.py
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:2028")
注意这里ip地址不用修改。
这里需要手动选择是哪个体育场,如选择气膜馆,接下来
脚本按按钮的顺序是,先点击类型(乒乓球/羽毛球),再点击日期,再点击时间和场地号,
最后点击提交。如果想要自行改变预约的运动场类型、时间段、场地,需要手动查询网页中
对应的XPATH并粘贴到代码中。
例如如果将场地类型改为紫荆网球场,则在网页中右击紫荆网球场对应的位置,
点击“检查”,在弹出的网页源码中高亮的部分右击,选择copy–copy full Xpath,
粘贴到main.py
type_xpath = '/html/body/div[2]/div/div[2]/div[1]/div/div/div[3]/ul/li[3]/a'
对应的部分。修改日期也是同理。
修改时间和场地号稍微麻烦一点,需要修改两处。在想要选择的时间框右击,点击
检查进入网页源码后,还是copy full Xpath,粘贴到main.py
time_xpath = '/html/body/table/tbody/tr[10]/td[1]'
但这里还需要复制iframe的Xpath,方法是沿着时间对应的高亮源码往上找,
找到对应的iframe右击复制,粘贴到main.py
time_iframe_xpath = '/html/body/div[2]/div/div[2]/div[1]/div/div/div[5]/iframe'
这里对验证码的识别是在屏幕中固定位置截图并识别,因此对于不同尺寸的屏幕,位置也不同。
默认的是13.6寸屏幕的位置,对于其他屏幕,运行代码后会得到captcha.png
,需要调整Captcha_OCR.py
中截图位置的语句
bbox = (830, 600, 950, 665)
im = ImageGrab.grab(bbox)
修改对应坐标点,保证得到的captcha.png
是验证码图片。
运行代码
1、在cmd中输入
chrome.exe --remote-debugging-port=2028 --user-data-dir="D:\selenum\AutomationProfile"
其中端口号为自己开通的端口号。于是可以打开一个新的Chrome界面。
在这个界面登录info并打开预约界面后,关闭其他所有界面。
2、在main.py
中点击运行,运行后切换到Chrome界面并全屏。
若未到时间会不断刷新,到点后会开始自动点击选择并提交,直至出现
选择付款界面,这时已经锁定场地。
需要注意的是,这里验证码的识别成功率并不高,因此可能会出现多次刷新重复尝试的现象,
这属于正常。