【问题标题】:How to extract text from a CAPTCHA image in Objective-C for a Mac OS X Application?如何在 Objective-C 中为 Mac OS X 应用程序从 CAPTCHA 图像中提取文本?
【发布时间】:2023-03-14 07:08:01
【问题描述】:

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

“DeathByCaptcha”可以在网络here 上找到。 我在搜索时找到了this Stack Overflow post,但这不会读取验证码图像,它只是读取一个简单的图像并转换为文本。

请帮助我使用针对 Mac OS X 应用程序的 Objective-C 从 CAPTCHA 图像中提取文本。

【问题讨论】:

  • 如果它支持C,那么你可以毫无问题地使用它。或许围绕他们的 C API 创建您自己的 Objective-C 包装器,然后本着开源精神将您的更改提交给他们。
  • 如何在 Objective-C 中为 CAPTCHA 创建包装器?我得到的只是验证码图像,剩下的就是从验证码中提取它的文本。请告诉我创建 Wrapper 的起点?
  • Objective-C 是 C 的超集。
  • @trojanfoe 当然,我正在为您提供大致的想法,究竟需要什么!给我 10 分钟。
  • 我们似乎在兜圈子。我知道 CAPTCHA 解析器的要求是什么,但是在您向我展示 Death By CAPTCHA 提供的 C API 之前,我无法为您提供帮助。

标签: objective-c macos captcha


【解决方案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 首选项中),您可能还需要安装。

【讨论】:

  • 是的,我在现有项目的 XCode 中集成了 DeathByCaptcha-C api。 DeathByCaptcha-C api 文件扩展名是 .h 和 .c 而不是 .m 在这种情况下该怎么做。 API似乎是为WINDOWS设计的。请查看集成 DeathByCaptcha-C api 后出现的屏幕截图错误:screencast.com/t/D8jYxeK0w 在这种情况下请给我一些建议。等待您的回复@Jean
  • 我也做了同样的事情,得到了 DeathByCaptcha.so 文件,现在如何处理呢?您可以在此处查看 .so 文件:screencast.com/t/LN8auZ7LwCkQ 我知道如何使用 api,但从这一点开始不知道该怎么做!请帮助我让@Jean
  • 不起作用兄弟...正在尝试使用 CURL 工具。 i:e 使用 DeathByCaptcha-php api 这个过程就像我们将 DBC-php api 放在我们的服务器上并从服务器获取 url 并从浏览器将参数传递给 DBC-php api 类然后我们的服务器将向 DBC 服务器发送请求并获得响应从他们那里,然后将响应传递给我们的浏览器。让我们看看会发生什么,但这个解决方案是由 DeathByCaptcha 团队为 Mac OS 应用程序提供的,所以它必须有效。感谢您的跟进(鞠躬)@Jean
  • 很抱歉读到这句话。什么失败了?我想他们的解决方案应该有效。我看到他们的网站确实帮助他们的客户集成了他们的 API。
  • 我阅读了您发布的文字,我相信到目前为止最简单的方法是使用我上面提供的解决方案。只需编译他们的库并将其集成到您的应用程序中。第二好的方法是使用他们在您的文本底部提供的解决方案: 1.在 POSTed multipart/form-data 中上传您的验证码; 2. 使用 get 请求轮询您的 CAPTCHA 状态,他们会在解决后立即为您提供信息。
【解决方案2】:

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

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

您将需要 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;
}

就是这样。完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2011-12-16
    • 2016-09-14
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多