Наш скрипт бронирования ранее автоматически заполнил имя на странице, теперь давайте позаботимся об остальном
Автоматически вводить другую фиксированную информацию
Я упомянул автоматический ввод информации об имени, На самом деле, три части информации, идентификационный номер, номер мобильного телефона и монеты Лунного Нового года 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