hknzh 2022-09-27 14:45 采纳率: 66.7%
浏览 21
已结题

自动登录网站验证码不一致

问题遇到的现象和发生背景

运行下面的代码时,每次调用起来的界面验证码和保存的验证码不一致,为什么?

用代码块功能插入代码,请勿粘贴截图

from selenium import webdriver
from aip import AipOcr
from PIL import Image
from selenium.webdriver.common.by import By

验证码的获取和处理

def get_captcha():
# 获取验证码图片
url = 'http://npgd.caict.ac.cn/login.html'
browser.get(url)
png = browser.find_element(By.ID, 'codeImage')
png.screenshot('capt.png') # 将图片截屏并保存
# 处理验证码
img = Image.open('capt.png')
img = img.convert('L') # P模式转换为L模式(灰度模式默认阈值127)
count = 160 # 设定阈值
table = []
for i in range(256):
if i < count:
table.append(0)
else:
table.append(1)
img = img.point(table, '1')
img.save('captcha.png') # 保存处理后的验证码

验证码的识别

def discern_captcha():
# 识别码
APP_ID = '27644450'
API_KEY = 'zbDf9GroMhk2rK2ALXKS8BKS'
SECRET_KEY = 'LTnsnQXduCh7Lo6oSKGaRSVOofRsDhcx'
# 初始化对象
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 读取图片
def get_file_content(file_path):
with open(file_path, 'rb') as f:
return f.read()
image = get_file_content('captcha.png')
# 定义参数变量
options = {'language_type': 'ENG', } # 识别语言类型,默认为'CHN_ENG'中英文混合
# 调用通用文字识别
result = client.basicGeneral(image, options) # 高精度接口 basicAccurate
for word in result['words_result']:
captcha = (word['words'])
print('识别结果:' + captcha)
return captcha

登录网页

def login(captcha):
browser.find_element(By.ID, 'username').send_keys('huangkun') # 找到账号框并输入账号
browser.find_element(By.ID, 'password').send_keys('C3a_i6c!t8') # 找到密码框并输入密码
browser.find_element(By.ID, 'imgCode').send_keys(captcha) # 找到验证码框并输入验证码
browser.find_element(By.ID, 'btn_login').click() # 找到登陆按钮并点击

def get_file():

browser.find_element(By.XPATH, '/html/body/header/div/nav/ul/li[6]/a').click() # 找到文件按钮并点击

if name == 'main':
browser = webdriver.Chrome() # 实例化对象
get_captcha()
captcha = discern_captcha()
login(captcha)
# get_file()

运行结果及报错内容

没有报错,就是验证码不一致

我的解答思路和尝试过的方法

就是上面的代码。

我想要达到的结果

使保存下来的验证码就是界面上的验证码,无关识别结果是否准确。

  • 写回答

3条回答 默认 最新

  • shelkio 2022-09-30 11:58
    关注

    加个验证码错误重复识别验证码功能吧 代码多执行几次就会出现不一样的 验证码了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • honestman_ 2022-09-27 14:56
    关注

    是哪个时间点就不一样了,打开截图是一样的吧,另外SECRET_KEY最好保密一下

    评论
  • hknzh 2022-09-30 14:29
    关注

    修改的源代码如下:
    ——————————————————
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import ddddocr

    识别验证码

    def recog_captcha():
    ocr = ddddocr.DdddOcr()
    with open('VerifyCode.png', 'rb') as f:
    img_bytes = f.read()
    res = ocr.classification(img_bytes)
    print("识别出的验证码为:" + res)
    return res

    获取验证码

    def get_captcha():
    png = browser.find_element(By.ID, 'codeImage')
    png.screenshot('VerifyCode.png') # 将图片截屏并保存
    recog_captcha()

    登录网页

    def login():
    browser.find_element(By.ID, 'username').send_keys('huangkun') # 找到账号框并输入账号
    browser.find_element(By.ID, 'password').send_keys('C3a_i6c!t8') # 找到密码框并输入密码
    browser.find_element(By.ID, 'imgCode').send_keys(get_captcha()) # 找到验证码框并输入验证码
    browser.find_element(By.ID, 'btn_login').click() # 找到登陆按钮并点击

    if name == 'main':
    browser = webdriver.Chrome() # 实例化对象
    url = 'http://npgd.caict.ac.cn/login.html'
    browser.get(url)
    login()


    请问为啥执行后报错“TypeError: object of type 'NoneType' has no len()”呢?是逻辑上存在什么错误?

    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月9日
  • 已采纳回答 10月1日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 PCL注册的选点等函数如何取消注册
  • ¥15 问一下各位,为什么我用蓝牙直接发送模拟输入的数据,接收端显示乱码呢,米思齐软件上usb串口显示正常的字符串呢?
  • ¥15 Python爬虫程序
  • ¥15 crypto 这种的应该怎么找flag?
  • ¥15 代码已写好,求帮我指出错误,有偿!
  • ¥15 matlab+波形匹配算法
  • ¥15 转录组分析做聚类树图时癌旁组被分到了癌组
  • ¥15 大一Python字典
  • ¥15 multisim电路设计(相关搜索:设计报告)
  • ¥15 PC-lint Plus