开源一个解析Android平台上的CAPTCHA人机识别系统的客户端

分享
开源一个解析Android平台上的CAPTCHA人机识别系统的客户端

Hi, 我是 Michael Sun, 是资源管理软件 Metaessen 的作者,它可以用来作为书签管理器或者笔记软件。

这是个运行在Android平台上的用来解析CAPTCHA人机识别系统(reCAPTCHA/funCAPTCHA)的客户端软件, 这个客户端使用了其他网站提供的CAPTCHA人机识别系统服务(例如Deathbycaptcha, 2captcha).

源代码:One CAPTCHA solving client on Android

简介

这是个运行在Android平台上的用来解析CAPTCHA人机识别系统(reCAPTCHA/funCAPTCHA)的客户端软件,
这个客户端使用了其他网站提供的CAPTCHA人机识别系统服务(例如Deathbycaptcha, 2captcha).

这个客户端是从我创建的Twitter自动化机器人系统里面提取出来的,没有测试这个提取出来的结果,
但是我可以保证这个客户端可以解析两种不同的CAPTCHA人机识别系统:reCAPTCHA和funCAPTCHA.

你可以基于这个客户端来创建其他类型的CAPTCHA人机系统解析方案客户端.

原因

为什么创建运行Android平台上的用来解析CAPTCHA人机识别系统的客户端呢?

CAPTCHA人机识别系统服务提供者一般提供了用户友好的基于浏览器的客户端及其相关API,
但是基本上没有提供用户友好的基于Android的客户端,仅仅提供了相关的API,用户不得不自己
创建可以直接使用的用户友好的基于相关API的客户端。

所以为了解析在Android上面的CAPTCHA人机识别系统, 我创建了用户友好的基于相关API的客户端。

原理

这个客户端把CAPTCHA图片截图下来,然后把这个截图缩小以满足CAPTCHA服务提供者的大小限制,
然后通过API把这个缩小的截图发送到CAPTCHA服务器。获取到服务器返回的结果(正确图片的坐标)后,
客户端就会从原始的坐标计算正确的坐标, 然后点击正确的CAPTCHA图片。

这个客户端包含两层,第一层是CAPTCHA人机识别系统解析服务提供者的API客户端,例如 DeathByCaptchaUI,
用来与解析服务器进行通信与获取解析后的结果;第二层是CAPTCHA人机识别系统的解析API客户端,例如
FuncaptchaAndroidUI, 用来针对具体的CAPTCHA处理特定的解析逻辑。

用法

. 安装依赖及CAPTCHA服务提供者提供的客户端::

 pip install -r requirements.txt

如果你想用Deathbycaptcha提供的CAPTCHA解析服务,请按照下面去做:

  • 下载 Death By Captcha API__, 解压缩然后放到项目根目录下面(实际上已经存在于这个库里面了)
__ https://static.deathbycaptcha.com/files/dbc_api_v4_6_3_python3.zip

. 在CAPTCHA服务提供者的页面上创建自己的用户名与密码,然后在文件 verify.py 里面修改它们

(包括图片大小限制)::

  class TwoCaptchaAPI:
      image_restrict_size = 1024 * 100  # 100KB

      TWOCAPTCHA_API_KEY = '<your 2captcha api key>'


  class DeathByCaptchaUI:
      image_restrict_size = 1024 * 180    # 180KB

      DBC_USERNAME = '<your dbc username>'
      DBC_PASSWORD = '<your dbc password>'

. 创建或者选择CAPTCHA的 resolver (CAPTCHA解析服务提供者的API)

(在脚本里面已经存在了两个resolver: DeathByCaptchaUI, TwoCaptchaAPI)::

class CaptchaAndroidBaseUI:
    def __init__(self, driver, resolver=None, wait_timeout=wait_timeout):
        self.driver = driver
        if not resolver:
            self.resolver = DeathByCaptchaUI(timeout=self.client_timeout,
                    client_type=self.client_type)
            # If you want to use 2captcha, uncomment the following and comment the above line
            #  self.resolver = TwoCaptchaAPI()
        else:
            self.resolver = resolver

. 有可能需要调整一些元素的定位器(locator)与一些CAPTCHA解析算法

刚开始创建这个客户端是为了解析出现在Twitter里面的CAPTCHA人机识别系统, 所以有可能一些元素的定位器
与页面结构不一样,如果这个客户端不能工作,请根据特定的页面结构调整它们。

例如::

 class FuncaptchaAndroidUI(CaptchaAndroidBaseUI):
  """User interface level API for resolving FunCaptcha on android"""
  # step1
  verify_first_page_frame_xpath = (
          '//android.view.View[@resource-id="FunCaptcha"]')

  verify_heading_xpath = (
          '//android.view.View[@resource-id="home_children_heading"]')

. 用下面的代码集成这个客户端到你的脚本里面::

from verify import RecaptchaAndroidUI, FuncaptchaAndroidUI
from conf import RECAPTCHA_ALL_RETRY_TIMES, FUNCAPTCHA_ALL_RETRY_TIMES

RECAPTCHA_ALL_RETRY_TIMES = 15  # the number of captcha images to resolve
FUNCAPTCHA_ALL_RETRY_TIMES = 20  # the number of captcha images to resolve

# resolve reCAPTCHA
recaptcha = RecaptchaAndroidUI(self.app_driver)
if recaptcha.is_captcha_first_page():
    LOGGER.info('Resovling reCAPTCHA')
    if recaptcha.resolve_all_with_coordinates_api(
            all_resolve_retry_times=RECAPTCHA_ALL_RETRY_TIMES):
        LOGGER.info('reCAPTCHA is resolved')
    else:
        LOGGER.info('reCAPTCHA cannot be resolved')

# resolve FunCaptcha
funcaptcha = FuncaptchaAndroidUI(self.app_driver)
if funcaptcha.is_captcha_first_page():
    LOGGER.info('Resovling FunCaptcha')
    if funcaptcha.resolve_all_with_coordinates_api(
            all_resolve_retry_times=RECAPTCHA_ALL_RETRY_TIMES):
        LOGGER.info('FunCaptcha is resolved')
    else:
        LOGGER.info('FunCaptcha cannot be resolved')

许可证

MIT License

阅读更多

成都骑行记 2023-01-28 (西北 - 目标为都江堰与紫坪铺水库)

成都骑行记 2023-01-28 (西北 - 目标为都江堰与紫坪铺水库)

Hello, 我是 Michael Sun, 开发了资源管理软件 Metaessen,你可以用它管理书、笔记、任务、项目、想法等等。 好玩的路线有两段: * 从友爱镇沿着江安河右岸到都江堰 * 从都江堰到紫坪铺水库再回来沿河岸到都江堰 从市区到郫都区友爱镇再沿江安河到都江堰 从都江堰上山沿着山路到紫坪铺水库 从紫坪铺水库沿河岸到都江堰再经唐昌镇到市区

By Michael Sun
Obsidian / Joplin 不支持对文件夹或者笔记进行手动或者任意排序

Obsidian / Joplin 不支持对文件夹或者笔记进行手动或者任意排序

嘿,你还好吗?我是 Michael Sun, 是资源管理器 Metaessen 的创建者,它可以用来作为书签管理器或者笔记软件。 当我打算真正试用Obsidian的时候,发现不能对文件夹进行排序(除了默认的按字母排序),进一步搜索大部分笔记软件(包括Joplin)都不能对文件夹或者笔记进行手动或者任意排序。 我认为手动或者任意排序是个基本功能,不管是书签管理器还是笔记软件都应该做到。 为什么大部分软件做不到呢?难道很困难吗? 排序或者排队现象是生活或工作中经常遇到的情况。例如对一个学校同年级的学生的考试分数进行排序。排序对有少数项目或者有多个项目的列表都是有用的。 任意排序特别对任务的优先级很有用。 标签主要用于标识或者分组,跟排序有很大的区别,这两者是不一样的。 鉴于排序或者排队在现实生活中的普遍性,我认为这应该是笔记软件的基本功能。 以前经常使用Joplin,没有注意到不能对文件夹与笔记进行手动排序。自从经常使用自己的资源管理器 Metaessen后,已经适应与喜欢手动排序了,而且手动排序适合现实世界的各种场合。当再次使用Obsidian或者Joplin的时候,猛然

By Michael Sun
工具太多或者工具过载

工具太多或者工具过载

Hey, 我是 Michael Sun, 是资源管理软件 Metaessen 的作者,它可以用来作为书签管理器或者笔记软件。 在当今,在每个领域都充满了很多工具,特别是软件。在日常生活与工作中,我们使用了太多的工具。 本来我们想使用这些工具来提高效率与生产力。但是工具太多了,也会造成我们的负担,反而降低效率与生产力。 工具太多意味着,需要花费很多时间精力去选择、了解、学习、使用与熟练所需要的工具。如果选择了太多的工具,就会浪费很多时间精力与资源,从而妨碍了使用工具来实现的目的。也会造成在信息太多现象中出现的一样的认知负担,精力分散,与阻碍解决实际问题。 我在软件开发上有20多年的经验了,在这个过程中学习了很多编程语言、编程工具、操作系统、编辑器、项目管理工具等等,例如C/C++, Java, TCL, Perl, Python, PHP, JavaScrip/TypeScript, HTML, CSS, Windows, Linux, Mac OS, Vim,

By Michael Sun
信息太多或者信息过载

信息太多或者信息过载

Hi, 我是 Michael Sun, 是资源管理软件 Metaessen 的作者,它可以用来作为书签管理器或者笔记软件。 很多人接触、阅读或者收集了太多的信息,超出我们的处理能力,成了负担,对解决实际问题已不起正面作用或者造成了障碍。 有用信息过少也会对解决实际问题造成障碍。 有没有发现在阅读与收集信息时会出现下面的情况: * 过早了解一些信息或者细节 * 过多了解一些信息或者细节 * 垃圾无用信息过多 * 沉寂信息过多 * 信息过于分散,没有结构,没有形成有用的系统,没有组织好信息 * 信息链接过多或者过少。把多个信息链接起来时有时导致过多的联系,有时导致过少的联系。 * 很少使用或者再次使用已经收集或者整理的信息 * 从原始信息里面分析分离出来的有用信息很少或者根本就不去分析分离出来有用信息

By Michael Sun