调用ai接口-验证码的获取与识别

11 阅读2分钟

前言

在做UI自动化测试的时候,经常会遇到登录时,需要输入验证码的场景
最简单的方式当然是和开发沟通,取消验证码的校验,
但是求人不如求自己,哈哈哈,就有了这篇文章

思路整理

既然要进行验证码的读取,简单发散一下思路,

  1. 获取验证码的图片数据
  2. 使用ocr第三方库处理图片
  3. ocr识别图片
  4. 将识别后的数据进行保存 简单就分为以上四步

但是开始进行代码的编写后,发现使用ocr第三方库遇到两个问题

  1. 识别精度不高
  2. python版本不兼容,配置很麻烦

于是开始转变思路,最近ai比较火,想尝试通过访问ai接口,上传图片数据,让ai进行识别返回数据

  1. 获取验证码的图片数据
  2. 创建连接访问ai端口
  3. 构建对话内容
  4. 输出验证码内容

代码实现

代码使用的是【方舟大模型】 首先需要安装方舟 SDK pip install volcenginesdkarkruntime

关于selenium部分就不在这里编写了

import datetime
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import base64
import requests
from volcenginesdkarkruntime import Ark

start_time= datetime.datetime.now()

# 1. 初始化浏览器,获取验证码图片数据
wd = webdriver.Edge()
wd.implicitly_wait(10)
wd.get("[引号内填写你需要获取验证码的url地址]")

# 等待图片可见,获取src
element = WebDriverWait(wd, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "div.captcha>img"))
)
src_data = element.get_attribute("src")

if src_data is None:
    print("未获取到验证码图片的src属性!")
    input("回车退出")
    wd.close()
    exit()

#编写AIAPT的基础配置:key值,AIapi接口,模型id
API_KEY = "【引号内填写你自己的API Key的值】"
BASE_URL = "https://ark.cn-beijing.volces.com/api/v3"  #调用API地址
MODEL_ID = "doubao-seed-1-8-251228"  #使用的大模型id

#2.连接鉴权
client = Ark(
    base_url=BASE_URL,
    api_key=API_KEY
)
#3.构造对话
messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "直接识别并返回内容,不要回复其他形容"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": f"{src_data}"
                }
            }
        ]
    }
]

response = client.chat.completions.create(
        model=MODEL_ID,
        messages=messages,
        temperature=0.7,
        max_tokens=1000
    )

#4.解析并打印响应结果
result = response.choices[0].message.content
print("=== API 响应结果 ===")
print(result)
end_time= datetime.datetime.now()
print("结束记时")
total_time=end_time-start_time
print(f"代码执行总耗时:{total_time}") 
print(f"总耗时(秒):{total_time.total_seconds()}") 
print(f"开始时间:{start_time.strftime('%Y-%m-%d %H:%M:%S')}") 
print(f"结束时间:{end_time.strftime('%Y-%m-%d %H:%M:%S')}") 

#5.暂停退出
input("回车退出")
wd.close()