Python盘纪念币系列之三:自动预约脚本编写 01

前面我们通过神经网络成功的识别了验证码,这一期我们就可以开始编写自动预约脚本了。

页面观察

趁着近期可以预约鼠年纪念币,我们可以拿现成的预约界面来观察:

Python盘纪念币系列之三:自动预约脚本编写 01_第1张图片

与前面给出过的一个页面相比,现在的页面不一样的是可以填写预约数量:

其他一些之前没有反应的UI也都有了该有的反应。

在这个基础上,我们就可以开始编写脚本了。

配置文件设计

既然要写脚本,必然是要做大量的重复性工作。在这里,就是要快速的输入多组信息来预约纪念币。所以,我们要提前把需要的数据按照一定的格式准备好,这样便于脚本运行时自动读取。下面是一个例子:

users = {
    'name_1': {
        'identNo': 'identNo_1',
        'mobile': 'mobile_1',
        'location': 'location_1',
        'cardvalue0': 'cardvalue0_1'
    },
    'name_2': {
        'identNo': 'identNo_2',
        'mobile': 'mobile_2',
        'location': 'location_2',
        'cardvalue0': 'cardvalue0_2'
    },
    'name_3': {
        'identNo': 'identNo_3',
        'mobile': 'mobile_3',
        'location': 'location_3',
        'cardvalue0': 'cardvalue0_3'
    }
    ...
}

配置文件中包含了姓名、身份证号码、手机号码、地点信息以及预约数量。这些都是固定信息,是可以提前配置好的,程序会在启动之后将这些信息自动填入对应的位置。

预约脚本编写

在编写正式脚本之前,我们需要根据前文先将验证码识别写成一个独立的功能块,以免造成代码混乱:

def recognize_capchar(capchar, model, lb):
    result = ''
    image = cv2.imread(capchar, 0)
    image = image[1:-1, 1:-1]
    target_patches = get_cutted_patches(image)
    for target_patch in target_patches:
        image = cv2.resize(target_patch, (16, 16))
        # scale图像数据
        image = image.astype("float") / 255.0
        image = np.expand_dims(image, axis=-1)
        # 对图像进行拉平操作
        image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
        # 预测
        preds = model.predict(image)
        # 得到预测结果以及其对应的标签
        i = preds.argmax(axis=1)[0]
        label = lb.classes_[i]
        result += label
    return result

尝试自己填写信息,然后点击提交之后发现,这个网页并没有可以直接提交预约信息的api,所以目前来看最好的做法,还是利用selenium通过自动化测试的方式进行。

建立浏览器对象

为了能演示的清楚,这里采用Chrome来测试。

想要能运行此代码,需要安装selenium,安装方法很简单:

pip install selenium

另外,我们还需要Chrome驱动。驱动大家可以在网上搜索下载,官网需要科学上网。要注意的是下载的驱动要跟Chrome的版本匹配,然后将可执行文件存放在Path可以访问到的位置。

准备工作做好后,建立浏览器对象就很简单了,只需要引入对应的包,然后新建对象即可:

from selenium import webdriver
driver = webdriver.Chrome()

效果如下:

Python盘纪念币系列之三:自动预约脚本编写 01_第2张图片

访问对应的网址

由于每次预约的网址都不一样,所以需要提前定义好本次预约的网址。然后利用浏览器对象去访问它,代码还是一样的简单:

url = 'https://eapply.abchina.com/coin/coin/*******'
driver.get(url)

效果如下:

Python盘纪念币系列之三:自动预约脚本编写 01_第3张图片

填入信息

到这一步,网页其实跟我们自己访问时没有什么区别,只是需要把对应的信息一一填入对应的格子里,那我们接下来就来做这件事。

首先,我们需要让程序知道下一个信息要填写到哪里:

ele_name = driver.find_element_by_xpath('//*[@id="name"]')

这个//*[@id="name"]可能不知道是怎么来的,其实很简单。打开网页之后,先按照Python盘纪念币系列之二:识别验证码 01中的第二点找到小箭头,然后点击对应的输入框,在右侧源代码窗口对应位置右键,选择Copy -> Copy XPath即可获得。

获取到位置之后自然就是要把信息填写进去,也是相当简单:

ele_name.send_keys('姓名')

这样就实现自动把“姓名”填写到对应的位置了,其他固定信息(证件号码、手机号码、
2020年贺岁币(第一批))也是同样的道理。

ToDo

  1. 验证码处理
  2. 下拉框处理
  3. 日期处理

后记

限于篇幅,这里就先只写到这里,接下来的 验证码处理下拉框处理日期处理 会在下一期继续介绍,敬请期待。

本系列的所有源代码都会放在下面的github仓库里面,有需要可以参考,有问题欢迎指正,谢谢!

https://github.com/TitusWongCN/AutoTokenAppointment
接下来的会是本系列的最后一篇,主要内容包括验证码处理、下拉框处理、日期处理 ,敬请期待。

第一期:Python盘纪念币系列之一:简介

第二期:Python盘纪念币系列之二:识别验证码 01

第三期:Python盘纪念币系列之二:识别验证码 02

第四期:Python盘纪念币系列之二:识别验证码 03

第五期:Python盘纪念币系列之二:识别验证码 04

你可能感兴趣的