安装依赖
首先确保你已经安装了 Nim,接着安装以下 Nim 库:
bash
nimble install httpbeast nimcrypto json
基础代码结构
我们将使用 Nim 的 httpclient 库与 YesCaptcha API 进行交互,使用 selenium 库来模拟点击操作。
nim
import httpclient, json, times, base64, os, strformat
# 配置 YesCaptcha 的 API 相关参数
const
apiUrl = "https://api.yescaptcha.com/createTask"
clientKey = "your_client_key"
# Captcha 识别类
type
CaptchaResolver = object
apiUrl: string
clientKey: string
# 初始化 CaptchaResolver
proc initCaptchaResolver(apiUrl: string, clientKey: string): CaptchaResolver =
result.apiUrl = apiUrl
result.clientKey = clientKey
# 创建验证码识别任务
proc createTask(resolver: CaptchaResolver, imageBase64: string, questionId: string): JsonNode =
let payload = %*{
"clientKey": resolver.clientKey,
"task": {
"type": "ReCaptchaV2Classification",
"image": imageBase64,
"question": questionId
}
}
let client = newHttpClient()
let response = client.request(resolver.apiUrl, httpPost, headers = {
"Content-Type": "application/json"
}, body = $payload)
return parseJson(response.body)
# 模拟图片 Base64 编码
proc encodeImageToBase64(imagePath: string): string =
let file = readFile(imagePath)
return encode(base64, file)
# YesCaptcha 服务接口测试
proc testCaptchaSolver() =
let resolver = initCaptchaResolver(apiUrl, clientKey)
let imageBase64 = encodeImageToBase64("captcha_image.png")
let questionId = "/m/015qff" # 目标对象 ID,交通灯
let result = createTask(resolver, imageBase64, questionId)
echo "识别结果: ", result
testCaptchaSolver()
识别目标与模拟点击
提取 ReCAPTCHA 目标
通过 Selenium 库,我们可以提取 ReCAPTCHA 中的提示文本,然后使用这个文本查找对应的目标 ID。
nim
import selenium
proc getCaptchaTargetName(browser: WebDriver): string =
let captchaElement = browser.findElementByCss(".rc-imageselect-desc-wrapper strong")
return captchaElement.getText()
proc switchToIframe(browser: WebDriver, iframeCss: string) =
let iframe = browser.findElementByCss(iframeCss)
browser.switchToFrame(iframe)
# 切换到 ReCAPTCHA 的 iframe
proc handleReCaptcha(browser: WebDriver) =
switchToIframe(browser, "iframe[title='reCAPTCHA']")
let captchaButton = browser.findElementById("recaptcha-anchor")
captchaButton.click()
sleep(2000)
switchToIframe(browser, "iframe[title*='recaptcha challenge']")
let targetName = getCaptchaTargetName(browser)
echo "需要点击的目标是: ", targetName