Памятная монета Python Disk, серия 3: написание сценария автоматического назначения 02

рептилия

Наш скрипт бронирования ранее автоматически заполнил имя на странице, теперь давайте позаботимся об остальном

Автоматически вводить другую фиксированную информацию

Я упомянул автоматический ввод информации об имени, На самом деле, три части информации, идентификационный номер, номер мобильного телефона и монеты Лунного Нового года 2020 (первая партия) также могут быть введены автоматически.

Метод ввода на самом деле такой же, вот код:

ele_identNo = driver.find_element_by_xpath('//*[@id="identNo"]')
ele_identNo.send_keys(paras['identNo'])
ele_mobile = driver.find_element_by_xpath('//*[@id="mobile"]')
ele_mobile.send_keys(paras['mobile'])
ele_cardvalue0 = driver.find_element_by_xpath('//*[@id="cardvalue0"]')
ele_cardvalue0.send_keys(paras['cardvalue0'])

Автоматически вводить проверочный код

Как упоминалось ранее, источником кода подтверждения на веб-странице является ссылка, а не фиксированное изображение:

Исходя из этой ситуации, мы не можем напрямую прочитать текущий проверочный код по ссылке. Следующее, что лучше всего сделать, это сделать снимок экрана с текущим проверочным кодом. Однако у этого есть недостаток, заключающийся в том, что при каждом запуске необходимо сохранять временное изображение капчи. Учитывая, что в среде, где используется скрипт, не будет кэшироваться слишком много проверочных кодов, а имя файла временного изображения остается неизменным каждый раз при наличии кэша, всегда будет только одно изображение, поэтому такая стратегия приемлема. .

Как сделать скриншот текущего кода подтверждения?

seleniumЭто было понято для нас:

# 先找到验证码对应的网页元素
ele_piccaptcha = driver.find_element_by_xpath('//*[@id="piccaptcha"]')
# 然后直接调用这个元素的screenshot方法,参数是保存的路径即可实现截图
ele_piccaptcha.screenshot('./temp_capchar.jpg')

Сохраняем изображение капчи в виде файла в текущей директорииtemp_capchar.jpgдокумент. Но иногда изображение получается слишком большим из-за неаккуратного подбора элементов или по другим причинам, поэтому перед определением проверочного кода его нужно «похудеть» (что отражено в предыдущем коде):

# 先读取图片
image = cv2.imread(capchar, 0)
# 将图片上下左右各切割一个像素
image = image[1:-1, 1:-1]

Приведенный выше код инкапсулирован по умолчанию вrecognize_capcharВ методе для идентификации проверочного кода нам нужно только передать этому методу путь к изображению проверочного кода и нашей обученной модели. Следует отметить, что поскольку время инициализации нейронной сети будет намного больше, чем другие коды, лучший способ — инициализировать объект модели в начале программы, а затем использовать этот объект для автоматической идентификации проверочного кода. , делай. Для всего процесса требуется только один раз инициализировать модель, что может значительно повысить эффективность, ведь сейчас самое время собирать деньги.

# 用已经提前初始化好的模型和标签对象来对temp_capchar.jpg进行自动识别
capchar = recognize_capchar('./temp_capchar.jpg', model, lb)
# 将识别结果输入到对应的框中
ele_capchar = driver.find_element_by_xpath('//*[@id="piccode"]')
ele_capchar.send_keys(capchar)

Автоматический выбор выпадающего списка

Спереди все статические веб-элементы, как быть с такими элементами, которые нужно выделить?

На самом деле, это все еще шаг за шагом, сначала получите объект раскрывающегося списка:

ele_orglevel = driver.find_element_by_xpath('//*[@id="orglevel1"]')

Затем вы можете передать этот объект раскрывающегося спискаtextСвойства предварительно настроеныlocationИнформация получена из нижнего индекса выпадающего списка:

for org_index, org in enumerate(ele_orglevel.text.split('\n')):
    if loca in org:
        ele_org = driver.find_element_by_xpath(xpath + '/option[{}]'.format(str(org_index + 1)))
        ele_org.click()
        break

Таким образом, вы можете выбрать предварительно настроенные параметры, делая это шаг за шагом. Я делаю одно из этих повторяющихся действийforВ цикле выбор раскрывающегося списка делается независимым методом, так что код выглядит намного проще:

def choose_bank(driver, location, top_xpath):
    locations = location.split(',')
    for index, loca in enumerate(locations):
        level = str(index + 1)
        xpath = top_xpath.replace('1', level)
        ele_orglevel = driver.find_element_by_xpath(xpath)
        for org_index, org in enumerate(ele_orglevel.text.split('\n')):
            if loca in org:
                ele_org = driver.find_element_by_xpath(xpath + '/option[{}]'.format(str(org_index + 1)))
                ele_org.click()
                break
    xpath = top_xpath.replace('1', str(len(locations) + 1))
    try:
        ele_bottom = driver.find_element_by_xpath(xpath)
    except:
        return
    else:
        org_index = random.choice(list(range(len(ele_bottom.text.split('\n'))))[1:])
        ele_org = driver.find_element_by_xpath(xpath + '/option[{}]'.format(str(org_index + 1)))
        ele_org.click()

Затем назовите это так:

choose_bank(driver, paras['location'], '//*[@id="orglevel1"]')

Обработка проверочного кода мобильного телефона

Поскольку код подтверждения мобильного телефона не является чем-то, что программа может получить напрямую, этот скрипт ничего не может сделать, поэтому этот скрипт можно назвать только полуавтоматическим скриптом.

Но здесь мы можем кратко рассказать о бизнес-процессе.

Чтобы получить мобильный код подтверждения, сначала нужно нажать кнопку «Получить код подтверждения»:

btn_sms = driver.find_element_by_xpath('//*[@id="sendValidate"]')
btn_sms.click()

Затем нам нужно ввести код подтверждения мобильного телефона, после чего программа автоматически введет его на веб-страницу:

phoneCaptchaNo = input('请输入手机验证码, 按回车键确认(如果还未收到短信,请等到短信之后再输入):\n')
ele_phoneCaptchaNo = driver.find_element_by_xpath('//*[@id="phoneCaptchaNo"]')
ele_phoneCaptchaNo.send_keys(phoneCaptchaNo)

Назначить встречу

На данный момент информация всей формы заполнена, и теперь почти пришло время отправить:

ele_infosubmit = driver.find_element_by_xpath('//*[@id="infosubmit"]')
ele_infosubmit.click()

постскриптум

На этом весь процесс резервирования завершен.

Наша серия памятных монет "Диск Python" практически завершена.

Весь исходный код этой серии будет размещен в репозитории github ниже, вы можете обратиться к нему, если вам это нужно.Если у вас есть какие-либо вопросы, пожалуйста, поправьте меня, спасибо!

https://github.com/TitusWongCN/AutoTokenAppointment

Будет статья, в которой подводятся итоги «Серии памятных монет Python Disk» и начинается следующая серия, так что следите за обновлениями!


Выпуск 1: Одна из серии памятных монет Python Disk: Введение

Фаза 2: Памятная монета «Диск Python», серия II: Идентификационный проверочный код 01

Фаза 3: Памятная монета «Диск Python», серия II: Идентификационный проверочный код 02

Выпуск 4: Памятные монеты Python Disk Series II: Идентификационный проверочный код 03

Выпуск 5: Памятные монеты Python Disk Series II: Идентификационный проверочный код 04

Выпуск 6: Памятная монета Python Disk Series III: Написание сценария автоматического назначения 01

Категории