8

我正在开发一个 Mac OS X 应用程序,它具有从验证码图像中读取/提取文本的概念。我在谷歌上搜索并得到了一个名为“DeathByCaptcha”的 API,这正是我想做的,但这个 API 不适用于 Mac OS X,这个 API 可用于 .Net/C/PHP/Python 等。

'DeathByCaptcha' 可以在此处的网络上找到。我在搜索时发现了这个 Stack Overflow 帖子,但这不会读取验证码图像,它只是读取一个简单的图像并转换为文本。

请帮助我使用 Objective-C 为 Mac OS X 应用程序从验证码图像中提取文本。

4

2 回答 2

1

查看 API 后,您首先需要构建库。

  1. 打开终端,导航到 dbc_api_v4_2_c 文件夹并键入

    制作

您应该得到一个名为 lib 的新文件夹,其中包含 libdeathbycaptcha.so 库文件。

  1. 现在,创建一个新的 Xcode 项目,将库包含在您的资源中,将 deathbycaptcha.h 标头添加到您的项目中。

  2. 然后您可以使用示例中提供的代码,但只能使用不适用于 windows 的代码。例如 :

    void *lib = dlopen("./libdeathbycaptcha.so", RTLD_LAZY);
    if (!lib) {
        fprintf(stderr, "dlopen(): %s\n", dlerror());
        exit(EXIT_FAILURE);
    }
    
    dbc_init = (void *)GetProcAddress(lib, "dbc_init");
    dbc_close = (void *)GetProcAddress(lib, "dbc_close");
    dbc_get_balance = (void *)GetProcAddress(lib, "dbc_get_balance");
    dbc_decode_file = (void *)GetProcAddress(lib, "dbc_decode_file");
    dbc_report = (void *)GetProcAddress(lib, "dbc_report");
    dbc_close_captcha = (void *)GetProcAddress(lib, "dbc_close_captcha");
    

它应该编译得很好。不要忘记包含以下标题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dlfcn.h> // not in the docs, but required for dlsym
#include "deathbycaptcha.h"

此外,如果您还没有安装 Xcode 命令行工具(在 Xcode 首选项中),您可能还需要这样做。

于 2013-02-22T23:02:46.120 回答
1

大家好,我写了下面的代码来解决我的验证码问题,它对我来说非常有用。

从验证码图像中读取文本的代码

您将需要 ASIHTTPRequest API 在 Web 上发送 HTTP 请求并获取以下代码的响应。

将 ASIHTTPRequest API 的各个类导入您的类中,您将在其中执行从验证码图像中获取文本的过程。

现在使用下面的方法并调用来解决 catpcha 。

-(NSString *)CaptchaToText 
{
    // Captcha Image Url in NSData object
    NSData *urlData=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://oi47.tinypic.com/357hyea.jpg"]];

    // base64 image data
    NSString *imageBase64Data = [ASIHTTPRequest base64forData:urlData ];

    //NSString *imageBase64Data =[self base64EncodedString:urlData];
    NSLog(@"imageBase64Data =%@\n\n",imageBase64Data);

    // prefix - base64 image data
    NSString *prefixBase64Data = [NSString stringWithFormat:@"base64:%@",imageBase64Data];
    NSLog(@"prefixBase64Data Value = %@\n\n",prefixBase64Data);

    ASIHTTPRequest *req=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://oi47.tinypic.com/357hyea.jpg"]];

    [req startSynchronous];
    NSError *err=[req error];

    if(!err){
        NSString *respo=[req responseString];
        NSLog(@"respo= %@",respo);

        NSURL *url = [NSURL URLWithString:@"http://api.dbcapi.me/api/captcha"];

        ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];

        [request setPostValue:@"YourDeathByCaptchaUserName" forKey:@"username"];
        [request setPostValue:@"YourDeathByCaptchaPassword!@#$" forKey:@"password"];
        [request setPostValue:prefixBase64Data forKey:@"captchafile"];

        [request setRequestMethod:@"POST"];
        [request startSynchronous];

        NSError *error=[request error];

        if(!error){

            // Here we will get "Text" data from Captcha Image in "response"
            NSString *response=[request responseString];
            NSLog(@"response= %@",response);
            }
        else{
            NSLog(@"error= %@",error);
            }

        }
    else{
        NSLog(@"err= %@",err);
        }

    return response;
}

就是这样。完毕

于 2013-04-06T08:04:10.733 回答