From 967775d0e1f3cf9e5b5196139deb00ebebf69662 Mon Sep 17 00:00:00 2001 From: AndreiDrang Date: Mon, 5 Aug 2024 15:54:13 +0000 Subject: [PATCH] deploy: 08c565344956a91a036c7afd6ca31e172431a274 --- .buildinfo | 4 + .nojekyll | 0 404.html | 84 ++ _images/AntiCaptcha.png | Bin 0 -> 661686 bytes _sources/index.rst.txt | 35 + _sources/modules/contacts/info.md.txt | 5 + _sources/modules/control/example.rst.txt | 12 + _sources/modules/enum/info.rst.txt | 33 + _sources/modules/license/info.md.txt | 23 + _sources/modules/main/info.md.txt | 54 ++ _sources/modules/other-libs/info.md.txt | 9 + _sources/modules/serializer/info.rst.txt | 49 ++ _sources/modules/turnstile/example.rst.txt | 12 + _static/AntiCaptcha.png | Bin 0 -> 661686 bytes _static/autodoc_pydantic.css | 11 + _static/basic.css | 925 ++++++++++++++++++++ _static/doctools.js | 156 ++++ _static/documentation_options.js | 13 + _static/favicon.png | Bin 0 -> 32049 bytes _static/file.png | Bin 0 -> 286 bytes _static/jinja.css | 20 + _static/language_data.js | 199 +++++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pocoo.css | 525 +++++++++++ _static/pygments.css | 64 ++ _static/searchtools.js | 620 +++++++++++++ _static/sphinx_highlight.js | 154 ++++ _static/version_warning_offset.js | 40 + genindex.html | 395 +++++++++ index.html | 162 ++++ modules/contacts/info.html | 94 ++ modules/control/example.html | 842 ++++++++++++++++++ modules/enum/info.html | 373 ++++++++ modules/license/info.html | 109 +++ modules/main/info.html | 152 ++++ modules/other-libs/info.html | 112 +++ modules/serializer/info.html | 965 +++++++++++++++++++++ modules/turnstile/example.html | 295 +++++++ objects.inv | Bin 0 -> 1209 bytes search.html | 101 +++ searchindex.js | 1 + 42 files changed, 6648 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 _images/AntiCaptcha.png create mode 100644 _sources/index.rst.txt create mode 100644 _sources/modules/contacts/info.md.txt create mode 100644 _sources/modules/control/example.rst.txt create mode 100644 _sources/modules/enum/info.rst.txt create mode 100644 _sources/modules/license/info.md.txt create mode 100644 _sources/modules/main/info.md.txt create mode 100644 _sources/modules/other-libs/info.md.txt create mode 100644 _sources/modules/serializer/info.rst.txt create mode 100644 _sources/modules/turnstile/example.rst.txt create mode 100644 _static/AntiCaptcha.png create mode 100644 _static/autodoc_pydantic.css create mode 100644 _static/basic.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/favicon.png create mode 100644 _static/file.png create mode 100644 _static/jinja.css create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pocoo.css create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/version_warning_offset.js create mode 100644 genindex.html create mode 100644 index.html create mode 100644 modules/contacts/info.html create mode 100644 modules/control/example.html create mode 100644 modules/enum/info.html create mode 100644 modules/license/info.html create mode 100644 modules/main/info.html create mode 100644 modules/other-libs/info.html create mode 100644 modules/serializer/info.html create mode 100644 modules/turnstile/example.html create mode 100644 objects.inv create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..9db8fa2 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: d694d82bd7e2cabe8c5820637c58e170 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..93fb616 --- /dev/null +++ b/404.html @@ -0,0 +1,84 @@ + + + + + + + + Page Not Found — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + +
+
+
+
+ +

Page Not Found

+

+ The page you requested does not exist. You may have followed a bad + link, or the page may have been moved or removed. +

+ Go to the overview or + search. + +

+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/_images/AntiCaptcha.png b/_images/AntiCaptcha.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cac4a5ce8b1cd482d5d8427b828f3599bcdc1e GIT binary patch literal 661686 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

F3qrLG=dc+vz8XT0A-!uzss{5U^e7f(2iELDao_ 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 i009sHfyyUv`_. + +The library is intended for software developers and is used to work with the `AntiCaptcha API `_. + +Check our other projects here - `RedPandaDev group `_. For example - `Torrents Tracker bot `_ for Telegram + +.. toctree:: + :maxdepth: 1 + :caption: Start here: + + modules/main/info.md + modules/other-libs/info.md + modules/license/info.md + modules/contacts/info.md + +.. toctree:: + :maxdepth: 3 + :caption: Captcha examples: + + modules/turnstile/example.rst + modules/control/example.rst + +.. toctree:: + :maxdepth: 2 + :caption: Additional modules + + modules/enum/info.rst + modules/serializer/info.rst diff --git a/_sources/modules/contacts/info.md.txt b/_sources/modules/contacts/info.md.txt new file mode 100644 index 0000000..a896f45 --- /dev/null +++ b/_sources/modules/contacts/info.md.txt @@ -0,0 +1,5 @@ +# Contacts + +If you have any questions, please send a message to the [Telegram](https://t.me/pythoncaptcha) chat room. + +Or email: [python-captcha@pm.me](mailto:python-captcha@pm.me) \ No newline at end of file diff --git a/_sources/modules/control/example.rst.txt b/_sources/modules/control/example.rst.txt new file mode 100644 index 0000000..a937367 --- /dev/null +++ b/_sources/modules/control/example.rst.txt @@ -0,0 +1,12 @@ +Control +======= + +To import this module: + +.. code-block:: python + + from python3_anticaptcha.control import Control + + +.. autoclass:: python3_anticaptcha.control.Control + :members: \ No newline at end of file diff --git a/_sources/modules/enum/info.rst.txt b/_sources/modules/enum/info.rst.txt new file mode 100644 index 0000000..e51f611 --- /dev/null +++ b/_sources/modules/enum/info.rst.txt @@ -0,0 +1,33 @@ +Enum +==== + +To import this module: + +.. code-block:: python + + from python3_anticaptcha.core import enum + + +.. autoclass:: core.enum.MyEnum + :members: + :undoc-members: + +.. autoclass:: core.enum.EndpointPostfixEnm + :members: + :undoc-members: + +.. autoclass:: core.enum.CaptchaTypeEnm + :members: + :undoc-members: + +.. autoclass:: core.enum.ResponseStatusEnm + :members: + :undoc-members: + +.. autoclass:: core.enum.ProxyTypeEnm + :members: + :undoc-members: + +.. autoclass:: core.enum.ControlPostfixEnm + :members: + :undoc-members: diff --git a/_sources/modules/license/info.md.txt b/_sources/modules/license/info.md.txt new file mode 100644 index 0000000..e452cbe --- /dev/null +++ b/_sources/modules/license/info.md.txt @@ -0,0 +1,23 @@ +# License + +MIT License + +Copyright 2022 Andrei + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/_sources/modules/main/info.md.txt b/_sources/modules/main/info.md.txt new file mode 100644 index 0000000..49ca647 --- /dev/null +++ b/_sources/modules/main/info.md.txt @@ -0,0 +1,54 @@ +# Introduction + +## Welcome to python3-anticaptcha + +![](../../_static/AntiCaptcha.png) + +


+ +[![PyPI version](https://badge.fury.io/py/python3-anticaptcha.svg)](https://badge.fury.io/py/python3-anticaptcha) +[![Python versions](https://img.shields.io/pypi/pyversions/python3-anticaptcha.svg?logo=python&logoColor=FBE072)](https://badge.fury.io/py/python3-anticaptcha) +[![Downloads](https://pepy.tech/badge/python3-anticaptcha/month)](https://pepy.tech/project/python3-anticaptcha) + +[![Code Climate](https://codeclimate.com/github/AndreiDrang/python3-anticaptcha/badges/gpa.svg)](https://codeclimate.com/github/AndreiDrang/python3-anticaptcha) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7f49780f2edb48d4b133833887c850e8)](https://www.codacy.com/gh/AndreiDrang/python3-anticaptcha/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AndreiDrang/python3-anticaptcha&utm_campaign=Badge_Grade) +[![codecov](https://codecov.io/gh/AndreiDrang/python3-anticaptcha/branch/master/graph/badge.svg?token=W92nfZY6Tz)](https://codecov.io/gh/AndreiDrang/python3-anticaptcha) + +[![Build check](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/test_build.yml/badge.svg?branch=main)](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/test_build.yml) +[![Installation check](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/install.yml/badge.svg?branch=main)](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/install.yml) +[![Test](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/test.yml) +[![Lint](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/AndreiDrang/python3-anticaptcha/actions/workflows/lint.yml) + + +Python 3 library for [AntiCaptcha](https://anti-captcha.com/) service API. + +Tested on UNIX based OS. + +The library is intended for software developers and is used to work with the [AntiCaptcha](https://anti-captcha.com/) service API. + +*** + +You can check our other projects here - [RedPandaDev group](https://red-panda-dev.xyz/blog/). For example - [Torrents Tracker bot](https://t.me/torrents_tracker_bot) for Telegram. + +*** +## How to install? + +We recommend using the latest version of Python. `python3-anticaptcha` supports Python 3.7+. + +### pip + +```bash +pip install python3-anticaptcha +``` + +### Source +```bash +git clone https://github.com/AndreiDrang/python3-anticaptcha.git +cd python3-anticaptcha +python setup.py install +``` + +## How to test? + +1. You need set ``API_KEY`` in your environment(get this value from you account). +2. Run command ``make tests``, from root directory. diff --git a/_sources/modules/other-libs/info.md.txt b/_sources/modules/other-libs/info.md.txt new file mode 100644 index 0000000..b8f53b4 --- /dev/null +++ b/_sources/modules/other-libs/info.md.txt @@ -0,0 +1,9 @@ +# Other captcha-solving services libs + +## Other libraries for Captcha-solving services +1. [RuCaptcha / 2Captcha](https://github.com/AndreiDrang/python-rucaptcha) +2. [AntiCaptcha](https://github.com/AndreiDrang/python3-anticaptcha) +3. [Capsolver](https://github.com/AndreiDrang/python3-captchaai) + +Our other projects: +- [RedPandaDev group](https://red-panda-dev.xyz/blog/) diff --git a/_sources/modules/serializer/info.rst.txt b/_sources/modules/serializer/info.rst.txt new file mode 100644 index 0000000..b7d6c48 --- /dev/null +++ b/_sources/modules/serializer/info.rst.txt @@ -0,0 +1,49 @@ +Serializer +========== + +To import this module: + +.. code-block:: python + + from python3_anticaptcha.core import serializer + + +.. autopydantic_model:: core.serializer.BaseAPIRequestSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.BaseAPIResponseSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.CreateTaskRequestSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.CreateTaskRequestTaskSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.ProxyDataOptionsSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.CreateTaskResponseSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.GetTaskResultRequestSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.GetTaskResultResponseSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.TurnstileProxylessOptionsSer + :members: + :undoc-members: + +.. autopydantic_model:: core.serializer.TurnstileOptionsSer + :members: + :undoc-members: diff --git a/_sources/modules/turnstile/example.rst.txt b/_sources/modules/turnstile/example.rst.txt new file mode 100644 index 0000000..a4b8561 --- /dev/null +++ b/_sources/modules/turnstile/example.rst.txt @@ -0,0 +1,12 @@ +Turnstile +========= + +To import this module: + +.. code-block:: python + + from python3_anticaptcha.turnstile import Turnstile + + +.. autoclass:: python3_anticaptcha.turnstile.Turnstile + :members: \ No newline at end of file diff --git a/_static/AntiCaptcha.png b/_static/AntiCaptcha.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cac4a5ce8b1cd482d5d8427b828f3599bcdc1e GIT binary patch literal 661686 zcmeEP2bdH^(=IM?SZQJIyEE)4>B%&D$U zDBbF$>*?7OlCD;b{EBbldfd|d?!+YYOMGHj(tU=m%^v7Ml({wkOZUr~Z`ve9=Ihz? z{+@Sr>Cm%x`|eLt@7}#DJpF8^9{<
ys6_bbo66;d=Rr3RCkYjqdJ~j(!;2q<^|A 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

F3qrLG=dc+vz8XT0A-!uzss{5U^e7f(2iELDao_ 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 i009sHfyyUv tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..7e4c114 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/favicon.png b/_static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2694d2db4ce995aff9b0ab52ee0532a722d0d1c6 GIT binary patch literal 32049 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 literal 0 HcmV?d00001 diff --git a/_static/jinja.css b/_static/jinja.css new file mode 100644 index 0000000..dc91e6a --- /dev/null +++ b/_static/jinja.css @@ -0,0 +1,20 @@ +@import url("pocoo.css"); +@import url("https://fonts.googleapis.com/css?family=Crimson+Text"); + +h1, h2, h3, h4, h5, h6, p.admonition-title, div.sphinxsidebar input { + font-family: "Crimson Text", "Garamond", "Georgia", serif; +} + +a, a.reference, a.footnote-reference { + color: #a00; + text-decoration-color: #a00; +} + +a:hover { + color: #d00; + text-decoration-color: #d00; +} + +p.version-warning { + background-color: #d40; +} diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pocoo.css b/_static/pocoo.css new file mode 100644 index 0000000..4f14b31 --- /dev/null +++ b/_static/pocoo.css @@ -0,0 +1,525 @@ +@import url("basic.css"); + +/* -- page layout --------------------------------------------------- */ + +body { + font-family: 'Garamond', 'Georgia', serif; + font-size: 17px; + background-color: #fff; + color: #3e4349; + margin: 0; + padding: 0; +} + +div.related { + max-width: 1140px; + margin: 10px auto; + + /* displayed on mobile */ + display: none; +} + +div.document { + max-width: 1140px; + margin: 10px auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.body { + min-width: initial; + max-width: initial; + padding: 0 30px; +} + +div.sphinxsidebarwrapper { + padding: 10px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; + color: #444; +} + +div.sphinxsidebar li { + overflow: hidden; + text-overflow: ellipsis; +} + +div.sphinxsidebar li:hover { + overflow: visible; +} + +div.sphinxsidebar a, +div.sphinxsidebar a code { + color: #444; + border-color: #444; +} + +div.sphinxsidebar a:hover { + background-color:#fff; +} + +div.sphinxsidebar p.logo { + margin: 0; + text-align: center; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-size: 24px; + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p, +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; +} + +div.sphinxsidebar input { + border: 1px solid #999; + font-size: 1em; +} + +div.footer { + max-width: 1140px; + margin: 20px auto; + font-size: 14px; + text-align: right; + color: #888; +} + +div.footer a { + color: #888; + border-color: #888; +} + +/* -- quick search -------------------------------------------------- */ + +div.sphinxsidebar #searchbox form { + display: flex; +} + +div.sphinxsidebar #searchbox form > div { + display: flex; + flex: 1 1 auto; +} + +div.sphinxsidebar #searchbox input[type=text] { + flex: 1 1 auto; + width: 1% !important; +} + +div.sphinxsidebar #searchbox input[type=submit] { + border-left-width: 0; +} + +/* -- versions ------------------------------------------------------ */ + +div.sphinxsidebar ul.versions a.current { + font-style: italic; + border-bottom: 1px solid #000; + color: #000; +} + +div.sphinxsidebar ul.versions span.note { + color: #999; +} + +/* -- version warning ----------------------------------------------- */ + +p.version-warning { + top: 10px; + position: sticky; + + margin: 10px 0; + padding: 5px 10px; + border-radius: 4px; + + letter-spacing: 1px; + color: #fff; + text-shadow: 0 0 2px #000; + text-align: center; + + background: #d40 repeating-linear-gradient( + 135deg, + transparent, + transparent 56px, + rgba(255, 255, 255, 0.2) 56px, + rgba(255, 255, 255, 0.2) 112px + ); +} + +p.version-warning a { + color: #fff; + border-color: #fff; +} + +/* -- body styles --------------------------------------------------- */ + +a { + text-decoration: underline; + text-decoration-style: dotted; + text-decoration-color: #000; + text-decoration-thickness: 1px; +} + +a:hover { + text-decoration-style: solid; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + margin: 30px 0 10px; + padding: 0; + color: black; +} + +div.body h1 { + font-size: 240%; +} + +div.body h2 { + font-size: 180%; +} + +div.body h3 { + font-size: 150%; +} + +div.body h4 { + font-size: 130%; +} + +div.body h5 { + font-size: 100%; +} + +div.body h6 { + font-size: 100%; +} + +div.body h1:first-of-type { + margin-top: 0; +} + +a.headerlink { + color: #ddd; + margin: 0 0.2em; + padding: 0 0.2em; + border: none; +} + +a.headerlink:hover { + color: #444; +} + +div.body p, +div.body dd, +div.body li { + line-height: 1.4; +} + +img.screenshot { + box-shadow: 2px 2px 4px #eee; +} + +hr { + border: 1px solid #999; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + margin: 10px 0 10px 30px; + padding: 0; +} + +a.footnote-reference { + font-size: 0.7em; + vertical-align: top; +} + +/* -- admonitions --------------------------------------------------- */ + +div.admonition, +div.topic { + background-color: #fafafa; + margin: 10px -10px; + padding: 10px; + border-top: 1px solid #ccc; + border-right: none; + border-bottom: 1px solid #ccc; + border-left: none; +} + +div.admonition p.admonition-title, +div.topic p.topic-title { + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; + display: inline; +} + +p.admonition-title::after { + content: ":"; +} + +div.admonition p.last, +div.topic p:last-child { + margin-bottom: 0; +} + +div.danger, div.error { + background-color: #fff0f0; + border-color: #ffb0b0; +} + +div.seealso { + background-color: #fffff0; + border-color: #f0f0a8; +} + +/* -- changelog ----------------------------------------------------- */ + +details.changelog summary { + cursor: pointer; + font-style: italic; + margin-bottom: 10px; +} + +/* -- search highlight ---------------------------------------------- */ + +dt:target, +.footnote:target, +span.highlighted { + background-color: #ffdf80; +} + +rect.highlighted { + fill: #ffdf80; +} + +/* -- code displays ------------------------------------------------- */ + +pre, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +pre { + margin: 0; + padding: 0; + line-height: 1.3; +} + +div.literal-block-wrapper { + padding: 10px 0 0; +} + +div.code-block-caption { + padding: 0; +} + +div.highlight, div.literal-block-wrapper div.highlight { + margin: 10px -10px; + padding: 10px; +} + +code { + color: #222; + background: #e8eff0; +} + +/* -- tables -------------------------------------------------------- */ + +table.docutils { + border: 1px solid #888; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, +table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, +table.footnote { + border: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; + background-color: #fafafa; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td.label { + width: 0; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +/* -- responsive screen --------------------------------------------- */ + +@media screen and (max-width: 1139px) { + p.version-warning { + margin: 10px; + } + + div.footer { + margin: 20px 10px; + } +} + +/* -- small screen -------------------------------------------------- */ + +@media screen and (max-width: 767px) { + body { + padding: 0 20px; + } + + div.related { + display: block; + } + + p.version-warning { + margin: 10px 0; + } + + div.documentwrapper { + float: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + div.sphinxsidebar { + float: none; + width: 100%; + margin: 0 -20px -10px; + padding: 0 20px; + background-color: #333; + color: #ccc; + } + + div.sphinxsidebar a, + div.sphinxsidebar a code, + div.sphinxsidebar h3, + div.sphinxsidebar h4, + div.footer a { + color: #ccc; + border-color: #ccc; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.sphinxsidebar ul.versions a.current { + border-bottom-color: #fff; + color: #fff; + } + + div.footer { + text-align: left; + margin: 0 -20px; + padding: 20px; + background-color: #333; + color: #ccc; + } +} + +/* https://github.com/twbs/bootstrap/blob + /0e8831505ac845f3102fa2c5996a7141c9ab01ee + /scss/mixins/_screen-reader.scss */ +.hide-header > h1:first-child { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* -- sphinx-tabs -------------------------------------------------- */ + +.sphinx-tabs { + margin-bottom: 0; +} + +.sphinx-tabs .ui.menu { + font-family: 'Garamond', 'Georgia', serif !important; +} + +.sphinx-tabs .ui.attached.menu { + border-bottom: none +} + +.sphinx-tabs .ui.tabular.menu .item { + border-bottom: 2px solid transparent; + border-left: none; + border-right: none; + border-top: none; + padding: .3em 0.6em; +} + +.sphinx-tabs .ui.attached.segment, .ui.segment { + border: 0; + padding: 0; +} diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..25cd19f --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,64 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #aaaaaa; font-style: italic } /* Comment */ +.highlight .err { color: #ff0000; background-color: #ffaaaa } /* Error */ +.highlight .k { color: #b80000; font-weight: bold } /* Keyword */ +.highlight .ch { color: #aaaaaa; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #aaaaaa; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #b11414 } /* Comment.Preproc */ +.highlight .cpf { color: #aaaaaa; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #aaaaaa; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #505050; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #aa0000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00aa00 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { color: #b80000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #b80000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #b80000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #b80000; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #b80000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #808080; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #444444 } /* Literal.Number */ +.highlight .s { color: #aa891c } /* Literal.String */ +.highlight .na { color: #686868 } /* Name.Attribute */ +.highlight .nb { color: #333333 } /* Name.Builtin */ +.highlight .nc { color: #333333; font-weight: bold } /* Name.Class */ +.highlight .nd { color: #686868 } /* Name.Decorator */ +.highlight .ni { color: #363636; font-weight: bold } /* Name.Entity */ +.highlight .nf { color: #333333 } /* Name.Function */ +.highlight .nn { color: #333333; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #686868; font-weight: bold } /* Name.Tag */ +.highlight .ow { color: #b80000; font-weight: bold } /* Operator.Word */ +.highlight .mb { color: #444444 } /* Literal.Number.Bin */ +.highlight .mf { color: #444444 } /* Literal.Number.Float */ +.highlight .mh { color: #444444 } /* Literal.Number.Hex */ +.highlight .mi { color: #444444 } /* Literal.Number.Integer */ +.highlight .mo { color: #444444 } /* Literal.Number.Oct */ +.highlight .sa { color: #aa891c } /* Literal.String.Affix */ +.highlight .sb { color: #aa891c } /* Literal.String.Backtick */ +.highlight .sc { color: #aa891c } /* Literal.String.Char */ +.highlight .dl { color: #aa891c } /* Literal.String.Delimiter */ +.highlight .sd { color: #aa891c } /* Literal.String.Doc */ +.highlight .s2 { color: #aa891c } /* Literal.String.Double */ +.highlight .se { color: #aa891c } /* Literal.String.Escape */ +.highlight .sh { color: #aa891c } /* Literal.String.Heredoc */ +.highlight .si { color: #aa891c } /* Literal.String.Interpol */ +.highlight .sx { color: #aa891c } /* Literal.String.Other */ +.highlight .sr { color: #aa891c } /* Literal.String.Regex */ +.highlight .s1 { color: #aa891c } /* Literal.String.Single */ +.highlight .ss { color: #aa891c } /* Literal.String.Symbol */ +.highlight .bp { color: #333333 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #333333 } /* Name.Function.Magic */ +.highlight .il { color: #444444 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..b08d58c --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '

" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/version_warning_offset.js b/_static/version_warning_offset.js new file mode 100644 index 0000000..c7f9f49 --- /dev/null +++ b/_static/version_warning_offset.js @@ -0,0 +1,40 @@ +/* +When showing the sticky version warning, the warning will cover the +scroll target when navigating to #id hash locations. Take over scrolling +to adjust the position to account for the height of the warning. +*/ +$(() => { + const versionWarning = $('.version-warning') + + // Skip if there is no version warning, regular browser behavior is + // fine in that case. + if (versionWarning.length) { + const height = versionWarning.outerHeight(true) + const target = $(':target') + + // Adjust position when the initial link has a hash. + if (target.length) { + // Use absolute scrollTo instead of relative scrollBy to avoid + // scrolling when the viewport is already at the bottom of the + // document and has space. + const y = target.offset().top - height + // Delayed because the initial browser scroll doesn't seem to + // happen until after the document ready event, so scrolling + // immediately will be overridden. + setTimeout(() => scrollTo(0, y), 100) + } + + // Listen to clicks on hash anchors. + $('a[href^="#"]').on('click', e => { + // Stop default scroll. Also stops the automatic URL hash update. + e.preventDefault() + // Get the id to scroll to and set the URL hash manually. + const id = $(e.currentTarget).attr('href').substring(1) + location.hash = id + // Use getElementById since the hash may have dots in it. + const target = $(document.getElementById(id)) + // Scroll to top of target with space for the version warning. + scrollTo(0, target.offset().top - height) + }) + } +}) diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..70f80f7 --- /dev/null +++ b/genindex.html @@ -0,0 +1,395 @@ + + + + + + + + Index — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ _ + | A + | C + | E + | F + | G + | H + | I + | L + | M + | P + | R + | S + | T + | W + +
+

_

+ + +
+ +

A

+ + + +
+ +

C

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..56a0488 --- /dev/null +++ b/index.html @@ -0,0 +1,162 @@ + + + + + + + + python3-anticaptcha — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + +
+ + + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/contacts/info.html b/modules/contacts/info.html new file mode 100644 index 0000000..bd30641 --- /dev/null +++ b/modules/contacts/info.html @@ -0,0 +1,94 @@ + + + + + + + + Contacts — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Contacts

+

If you have any questions, please send a message to the Telegram chat room.

+

Or email: python-captcha@pm.me

+
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/control/example.html b/modules/control/example.html new file mode 100644 index 0000000..92e30c6 --- /dev/null +++ b/modules/control/example.html @@ -0,0 +1,842 @@ + + + + + + + + Control — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Control

+

To import this module:

+
from python3_anticaptcha.control import Control
+
+
+
+
+class python3_anticaptcha.control.Control(api_key: str, *args, **kwargs)
+
+
+
+
+__init__(api_key: str, *args, **kwargs)
+

The class is used to work with Turnstile.

+
+
Parameters:
+
    +
  • api_key (str) – Capsolver API key

  • +
  • captcha_type – Captcha type

  • +
  • websiteURL – Address of the webpage

  • +
  • websiteKey – Turnstile sitekey

  • +
  • proxyType – Type of the proxy

  • +
  • proxyAddress – Proxy IP address IPv4/IPv6. Not allowed to use: +host names instead of IPs, +transparent proxies (where client IP is visible), +proxies from local networks (192.., 10.., 127…)

  • +
  • proxyPort – Proxy port.

  • +
  • sleep_time – The waiting time between requests to get the result of the Captcha

  • +
  • kwargs – Additional not required params for main request body. +Like callbackUrl/languagePool and etc. +More info - https://anti-captcha.com/apidoc/methods/createTask

  • +
+
+
+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_balance()
+{
+   "errorId": 0,
+   "balance": 14.12396
+}
+
+
+
>>> Control.get_queue_status(queue_id=1)
+{
+   "waiting": 234,
+   "load": 46.58,
+   "bid": 0.000576,
+   "speed": 8.43,
+   "total": 438
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_spending_stats(softId=867)
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_app_stats(softId=867, mode='views')
+{
+   "errorId":0,
+   "chartData":[
+      {
+        ......
+      }
+   ],
+   "fromDate":"17 Feb 23:48",
+   "toDate":"19 Mar 23:48"
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_image(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_correct_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_hcaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+ +
+ +
+
+get_balance() dict
+

Retrieve an account balance with its account key.

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_balance()
+{
+   "errorId": 0,
+   "balance": 14.12396
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_get_balance() dict
+

Async retrieve an account balance with its account key.

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_balance()
+{
+   "errorId": 0,
+   "balance": 14.12396
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+static get_queue_status(queue_id: int) dict
+

This method makes it possible to define a suitable time for uploading a new task

+
+
Parameters:
+

queue_id (int) – Identifier of a queue

+
+
+
+

Examples

+
>>> Control.get_queue_status(queue_id=1)
+{
+   "waiting": 234,
+   "load": 46.58,
+   "bid": 0.000576,
+   "speed": 8.43,
+   "total": 438
+}
+
+
+
>>> Control.get_queue_status(queue_id=20)
+{
+   "waiting": 90,
+   "load": 38.36,
+   "bid": 0.002,
+   "speed": 7.38,
+   "total": 146
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async static aio_get_queue_status(queue_id: int) dict
+

Async method makes it possible to define a suitable time for uploading a new task

+
+
Parameters:
+

queue_id (int) – Identifier of a queue

+
+
+
+

Examples

+
>>> await Control.aio_get_queue_status(queue_id=1)
+{
+   "waiting": 234,
+   "load": 46.58,
+   "bid": 0.000576,
+   "speed": 8.43,
+   "total": 438
+}
+
+
+
>>> await Control.aio_get_queue_status(queue_id=20)
+{
+   "waiting": 90,
+   "load": 38.36,
+   "bid": 0.002,
+   "speed": 7.38,
+   "total": 146
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+get_spending_stats(**kwargs) dict
+

This method grabs account spendings and task volume statistics for a 24 hour period.

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_spending_stats(softId=867)
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_spending_stats(softId=867,
+...                                                                         queue="English ImageToText")
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_spending_stats(queue="English ImageToText")
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_get_spending_stats(**kwargs) dict
+

Async method grabs account spendings and task volume statistics for a 24 hour period.

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_spending_stats(softId=867)
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_spending_stats(softId=867,
+...                                                                             queue="English ImageToText")
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_spending_stats(queue="English ImageToText")
+{
+   "errorId":0,
+   "data":[
+      {
+         "dateFrom":1679183850,
+         "dateTill":1679187449,
+         "volume":0,
+         "money":0
+      }
+   ]
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+get_app_stats(softId: int, mode: str | None = None) dict
+
+
This method retrieves daily statistics for your application, which you register in Developer Center.

Statistics are available only to the application owner. Improper access returns ERROR_ACCESS_DENIED.

+
+
+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_app_stats(softId=867, mode='views')
+{
+   "errorId":0,
+   "chartData":[
+      {
+        ......
+      }
+   ],
+   "fromDate":"17 Feb 23:48",
+   "toDate":"19 Mar 23:48"
+}
+
+
+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").get_app_stats(softId=867, mode='errors')
+{
+   "errorId":0,
+   "chartData":[
+      {
+        ......
+      }
+   ],
+   "fromDate":"17 Feb 23:48",
+   "toDate":"19 Mar 23:48"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_get_app_stats(softId: int, mode: str | None = None) dict
+
+
Async method retrieves daily statistics for your application, which you register in Developer Center.

Statistics are available only to the application owner. Improper access returns ERROR_ACCESS_DENIED.

+
+
+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_app_stats(softId=867, mode='views')
+{
+   "errorId":0,
+   "chartData":[
+      {
+        ......
+      }
+   ],
+   "fromDate":"17 Feb 23:48",
+   "toDate":"19 Mar 23:48"
+}
+
+
+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_get_app_stats(softId=867, mode='errors')
+{
+   "errorId":0,
+   "chartData":[
+      {
+        ......
+      }
+   ],
+   "fromDate":"17 Feb 23:48",
+   "toDate":"19 Mar 23:48"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+report_incorrect_image(taskId: int) dict
+

Complaints are accepted for image captchas only.

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_image(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_report_incorrect_image(taskId: int) dict
+

Async complaints are accepted for image captchas only.

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_report_incorrect_image(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+report_incorrect_recaptcha(taskId: int) dict
+

Complaints are accepted for V2 and V3 Recaptchas only, including Enterprise Recaptcha.

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_report_incorrect_recaptcha(taskId: int) dict
+

Async complaints are accepted for V2 and V3 Recaptchas only, including Enterprise Recaptcha.

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_report_incorrect_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+report_correct_recaptcha(taskId: int) dict
+

Reporting correctly solved ReCaptcha

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_correct_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_report_correct_recaptcha(taskId: int) dict
+

Async reporting correctly solved ReCaptcha

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_report_correct_recaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+report_incorrect_hcaptcha(taskId: int) dict
+

Use this method to send us information about tokens which did not pass on target service

+
+

Examples

+
>>> Control(api_key="99d7d111a0111dc11184111c8bb111da").report_incorrect_hcaptcha(taskId=425436541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+
+async aio_report_incorrect_hcaptcha(taskId: int) dict
+

Async method to send us information about tokens which did not pass on target service

+
+

Examples

+
>>> await Control(api_key="99d7d111a0111dc11184111c8bb111da").aio_report_incorrect_hcaptcha(taskId=4256541)
+{
+    "errorId":0,
+    "status":"success"
+}
+
+
+
+
+
Returns:
+

Dict with full server response

+
+
Return type:
+

dict

+
+
+ +
+ +
+ +
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/enum/info.html b/modules/enum/info.html new file mode 100644 index 0000000..d22ef60 --- /dev/null +++ b/modules/enum/info.html @@ -0,0 +1,373 @@ + + + + + + + + Enum — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Enum

+

To import this module:

+
from python3_anticaptcha.core import enum
+
+
+
+
+class core.enum.MyEnum(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Base class for work with updated Enums

+
+
+classmethod list() List[Enum]
+
+
+
+ +
+
+classmethod list_values() List[str]
+
+
+
+ +
+
+classmethod list_names() List[str]
+
+
+
+ +
+ +
+
+class core.enum.EndpointPostfixEnm(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Enum stored URL postfixes for API endpoints

+
+
+CREATE_TASK = 'createTask'
+
+ +
+
+GET_TASK_RESULT = 'getTaskResult'
+
+ +
+ +
+
+class core.enum.CaptchaTypeEnm(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Enum with all available captcha types

+
+
+Control = 'Control'
+
+ +
+
+ImageToTextTask = 'ImageToTextTask'
+
+ +
+
+RecaptchaV2Task = 'RecaptchaV2Task'
+
+ +
+
+RecaptchaV2TaskProxyless = 'RecaptchaV2TaskProxyless'
+
+ +
+
+RecaptchaV3TaskProxyless = 'RecaptchaV3TaskProxyless'
+
+ +
+
+RecaptchaV2EnterpriseTask = 'RecaptchaV2EnterpriseTask'
+
+ +
+
+RecaptchaV2EnterpriseTaskProxyless = 'RecaptchaV2EnterpriseTaskProxyless'
+
+ +
+
+FunCaptchaTask = 'FunCaptchaTask'
+
+ +
+
+FunCaptchaTaskProxyless = 'FunCaptchaTaskProxyless'
+
+ +
+
+GeeTestTask = 'GeeTestTask'
+
+ +
+
+GeeTestTaskProxyless = 'GeeTestTaskProxyless'
+
+ +
+
+HCaptchaTask = 'HCaptchaTask'
+
+ +
+
+HCaptchaTaskProxyless = 'HCaptchaTaskProxyless'
+
+ +
+
+TurnstileTask = 'TurnstileTask'
+
+ +
+
+TurnstileTaskProxyless = 'TurnstileTaskProxyless'
+
+ +
+
+AntiGateTask = 'AntiGateTask'
+
+ +
+ +
+
+class core.enum.ResponseStatusEnm(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Enum store results status field variants

+
+
+processing = 'processing'
+
+ +
+
+ready = 'ready'
+
+ +
+ +
+
+class core.enum.ProxyTypeEnm(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Enum store proxy types

+
+
+http = 'http'
+
+ +
+
+https = 'https'
+
+ +
+
+socks4 = 'socks4'
+
+ +
+
+socks5 = 'socks5'
+
+ +
+ +
+
+class core.enum.ControlPostfixEnm(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Enum store control methods URLs postfix

+
+
+GET_BALANCE = 'getBalance'
+
+ +
+
+GET_QUEUE_STATS = 'getQueueStats'
+
+ +
+
+GET_APP_STATS = 'getAppStats'
+
+ +
+
+GET_SPENDING_STATS = 'getSpendingStats'
+
+ +
+
+REPORT_INCORRECT_IMAGE_CAPTCHA = 'reportIncorrectImageCaptcha'
+
+ +
+
+REPORT_INCORRECT_RECAPTCHA = 'reportIncorrectRecaptcha'
+
+ +
+
+REPORT_CORRECT_RECAPTCHA = 'reportCorrectRecaptcha'
+
+ +
+
+REPORT_INCORRECT_HCAPTCHA = 'reportIncorrectHcaptcha'
+
+ +
+ +
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/license/info.html b/modules/license/info.html new file mode 100644 index 0000000..dd19f7d --- /dev/null +++ b/modules/license/info.html @@ -0,0 +1,109 @@ + + + + + + + + License — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

License

+

MIT License

+

Copyright 2022 Andrei

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/main/info.html b/modules/main/info.html new file mode 100644 index 0000000..b261501 --- /dev/null +++ b/modules/main/info.html @@ -0,0 +1,152 @@ + + + + + + + + Introduction — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Introduction

+
+

Welcome to python3-anticaptcha

+

+
+

PyPI version +Python versions +Downloads

+

Code Climate +Codacy Badge +codecov

+

Build check +Installation check +Test +Lint

+

Python 3 library for AntiCaptcha service API.

+

Tested on UNIX based OS.

+

The library is intended for software developers and is used to work with the AntiCaptcha service API.

+
+

You can check our other projects here - RedPandaDev group. For example - Torrents Tracker bot for Telegram.

+
+
+
+

How to install?

+

We recommend using the latest version of Python. python3-anticaptcha supports Python 3.7+.

+
+

pip

+
pip install python3-anticaptcha
+
+
+
+
+

Source

+
git clone https://github.com/AndreiDrang/python3-anticaptcha.git
+cd python3-anticaptcha
+python setup.py install
+
+
+
+
+
+

How to test?

+
    +
  1. You need set API_KEY in your environment(get this value from you account).

  2. +
  3. Run command make tests, from root directory.

  4. +
+
+
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/other-libs/info.html b/modules/other-libs/info.html new file mode 100644 index 0000000..cbb8817 --- /dev/null +++ b/modules/other-libs/info.html @@ -0,0 +1,112 @@ + + + + + + + + Other captcha-solving services libs — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Other captcha-solving services libs

+
+

Other libraries for Captcha-solving services

+
    +
  1. RuCaptcha / 2Captcha

  2. +
  3. AntiCaptcha

  4. +
  5. Capsolver

  6. +
+

Our other projects:

+ +
+
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/serializer/info.html b/modules/serializer/info.html new file mode 100644 index 0000000..67d0318 --- /dev/null +++ b/modules/serializer/info.html @@ -0,0 +1,965 @@ + + + + + + + + Serializer — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + +
+
+
+
+ +
+

Serializer

+

To import this module:

+
from python3_anticaptcha.core import serializer
+
+
+
+
+pydantic model core.serializer.BaseAPIRequestSer
+

+Show JSON schema
{
+   "title": "BaseAPIRequestSer",
+   "type": "object",
+   "properties": {
+      "clientKey": {
+         "maxLength": 32,
+         "minLength": 32,
+         "title": "Clientkey",
+         "type": "string"
+      }
+   },
+   "required": [
+      "clientKey"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field clientKey: Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=32, max_length=32, pattern=None)] [Required]
+
+
Constraints:
+
    +
  • min_length = 32

  • +
  • max_length = 32

  • +
+
+
+
+ +
+ +
+
+pydantic model core.serializer.BaseAPIResponseSer
+

+Show JSON schema
{
+   "title": "BaseAPIResponseSer",
+   "type": "object",
+   "properties": {
+      "errorId": {
+         "default": null,
+         "description": "Error identifier.",
+         "title": "Errorid",
+         "type": "integer"
+      },
+      "errorCode": {
+         "default": null,
+         "description": "An error code.",
+         "title": "Errorcode",
+         "type": "string"
+      },
+      "errorDescription": {
+         "default": null,
+         "description": "Short description of the error.",
+         "title": "Errordescription",
+         "type": "string"
+      }
+   }
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field errorCode: str = None
+

An error code.

+
+ +
+
+field errorDescription: str = None
+

Short description of the error.

+
+ +
+
+field errorId: int = None
+

Error identifier.

+
+ +
+ +
+
+pydantic model core.serializer.CreateTaskRequestSer
+

+Show JSON schema
{
+   "title": "CreateTaskRequestSer",
+   "type": "object",
+   "properties": {
+      "clientKey": {
+         "maxLength": 32,
+         "minLength": 32,
+         "title": "Clientkey",
+         "type": "string"
+      },
+      "task": {
+         "default": null,
+         "description": "Task object.",
+         "title": "Task",
+         "type": "object"
+      },
+      "languagePool": {
+         "default": "en",
+         "description": "Sets workers' pool language. Only applies to image captchas.",
+         "title": "Languagepool",
+         "type": "string"
+      },
+      "callbackUrl": {
+         "default": null,
+         "description": "Web address where we can send the results of captcha task processing.",
+         "title": "Callbackurl",
+         "type": "string"
+      },
+      "softId": {
+         "const": "867",
+         "default": "867",
+         "enum": [
+            "867"
+         ],
+         "title": "Softid",
+         "type": "string"
+      }
+   },
+   "required": [
+      "clientKey"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field callbackUrl: str = None
+

Web address where we can send the results of captcha task processing.

+
+ +
+
+field languagePool: str = 'en'
+

Sets workers’ pool language. Only applies to image captchas.

+
+ +
+
+field softId: Literal['867'] = '867'
+
+ +
+
+field task: Dict = None
+

Task object.

+
+ +
+ +
+
+pydantic model core.serializer.CreateTaskRequestTaskSer
+

+Show JSON schema
{
+   "title": "CreateTaskRequestTaskSer",
+   "type": "object",
+   "properties": {
+      "type": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/CaptchaTypeEnm"
+            }
+         ],
+         "description": "Captcha task type name"
+      }
+   },
+   "$defs": {
+      "CaptchaTypeEnm": {
+         "description": "Enum with all available captcha types",
+         "enum": [
+            "Control",
+            "ImageToTextTask",
+            "RecaptchaV2Task",
+            "RecaptchaV2TaskProxyless",
+            "RecaptchaV3TaskProxyless",
+            "RecaptchaV2EnterpriseTask",
+            "RecaptchaV2EnterpriseTaskProxyless",
+            "FunCaptchaTask",
+            "FunCaptchaTaskProxyless",
+            "GeeTestTask",
+            "GeeTestTaskProxyless",
+            "HCaptchaTask",
+            "HCaptchaTaskProxyless",
+            "TurnstileTask",
+            "TurnstileTaskProxyless",
+            "AntiGateTask"
+         ],
+         "title": "CaptchaTypeEnm",
+         "type": "string"
+      }
+   },
+   "required": [
+      "type"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field type: CaptchaTypeEnm [Required]
+

Captcha task type name

+
+ +
+ +
+
+pydantic model core.serializer.ProxyDataOptionsSer
+

+Show JSON schema
{
+   "title": "ProxyDataOptionsSer",
+   "type": "object",
+   "properties": {
+      "proxyType": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/ProxyTypeEnm"
+            }
+         ],
+         "description": "Type of proxy"
+      },
+      "proxyAddress": {
+         "description": "Proxy IP address ipv4/ipv6. No host names or IP addresses from local networks",
+         "title": "Proxyaddress",
+         "type": "string"
+      },
+      "proxyPort": {
+         "description": "Proxy port",
+         "title": "Proxyport",
+         "type": "integer"
+      }
+   },
+   "$defs": {
+      "ProxyTypeEnm": {
+         "description": "Enum store proxy types",
+         "enum": [
+            "http",
+            "https",
+            "socks4",
+            "socks5"
+         ],
+         "title": "ProxyTypeEnm",
+         "type": "string"
+      }
+   },
+   "required": [
+      "proxyType",
+      "proxyAddress",
+      "proxyPort"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field proxyAddress: str [Required]
+

Proxy IP address ipv4/ipv6. No host names or IP addresses from local networks

+
+ +
+
+field proxyPort: int [Required]
+

Proxy port

+
+ +
+
+field proxyType: ProxyTypeEnm [Required]
+

Type of proxy

+
+ +
+ +
+
+pydantic model core.serializer.CreateTaskResponseSer
+

+Show JSON schema
{
+   "title": "CreateTaskResponseSer",
+   "type": "object",
+   "properties": {
+      "errorId": {
+         "default": null,
+         "description": "Error identifier.",
+         "title": "Errorid",
+         "type": "integer"
+      },
+      "errorCode": {
+         "default": null,
+         "description": "An error code.",
+         "title": "Errorcode",
+         "type": "string"
+      },
+      "errorDescription": {
+         "default": null,
+         "description": "Short description of the error.",
+         "title": "Errordescription",
+         "type": "string"
+      },
+      "taskId": {
+         "default": null,
+         "description": "Task ID that you should later use in the `getTaskResult` method.",
+         "title": "Taskid",
+         "type": "integer"
+      }
+   }
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field taskId: int = None
+

Task ID that you should later use in the getTaskResult method.

+
+ +
+ +
+
+pydantic model core.serializer.GetTaskResultRequestSer
+

+Show JSON schema
{
+   "title": "GetTaskResultRequestSer",
+   "type": "object",
+   "properties": {
+      "clientKey": {
+         "maxLength": 32,
+         "minLength": 32,
+         "title": "Clientkey",
+         "type": "string"
+      },
+      "taskId": {
+         "default": null,
+         "description": "An identifier obtained in the createTask method.",
+         "title": "Taskid",
+         "type": "integer"
+      }
+   },
+   "required": [
+      "clientKey"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field taskId: int = None
+

An identifier obtained in the createTask method.

+
+ +
+ +
+
+pydantic model core.serializer.GetTaskResultResponseSer
+

+Show JSON schema
{
+   "title": "GetTaskResultResponseSer",
+   "type": "object",
+   "properties": {
+      "errorId": {
+         "default": null,
+         "description": "Error identifier.",
+         "title": "Errorid",
+         "type": "integer"
+      },
+      "errorCode": {
+         "default": null,
+         "description": "An error code.",
+         "title": "Errorcode",
+         "type": "string"
+      },
+      "errorDescription": {
+         "default": null,
+         "description": "Short description of the error.",
+         "title": "Errordescription",
+         "type": "string"
+      },
+      "status": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/ResponseStatusEnm"
+            }
+         ],
+         "default": null,
+         "description": "Captcha solving process status."
+      },
+      "solution": {
+         "default": null,
+         "description": "Task result data. Different for each type of task.",
+         "title": "Solution",
+         "type": "object"
+      },
+      "cost": {
+         "default": null,
+         "description": "Cost of the task in USD.",
+         "title": "Cost",
+         "type": "number"
+      },
+      "ip": {
+         "default": null,
+         "description": "IP from which the task was created.",
+         "title": "Ip",
+         "type": "string"
+      },
+      "createTime": {
+         "default": null,
+         "description": "UNIX timestamp date of task creation.",
+         "title": "Createtime",
+         "type": "integer"
+      },
+      "endTime": {
+         "default": null,
+         "description": "UNIX timestamp date of task completion.",
+         "title": "Endtime",
+         "type": "integer"
+      },
+      "solveCount": {
+         "default": null,
+         "description": "Number of workers who tried to complete your task.",
+         "title": "Solvecount",
+         "type": "integer"
+      },
+      "taskId": {
+         "default": null,
+         "description": "Task ID.",
+         "title": "Taskid",
+         "type": "integer"
+      }
+   },
+   "$defs": {
+      "ResponseStatusEnm": {
+         "description": "Enum store results `status` field variants",
+         "enum": [
+            "processing",
+            "ready"
+         ],
+         "title": "ResponseStatusEnm",
+         "type": "string"
+      }
+   }
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field cost: float = None
+

Cost of the task in USD.

+
+ +
+
+field createTime: int = None
+

UNIX timestamp date of task creation.

+
+ +
+
+field endTime: int = None
+

UNIX timestamp date of task completion.

+
+ +
+
+field ip: str = None
+

IP from which the task was created.

+
+ +
+
+field solution: Dict = None
+

Task result data. Different for each type of task.

+
+ +
+
+field solveCount: int = None
+

Number of workers who tried to complete your task.

+
+ +
+
+field status: ResponseStatusEnm = None
+

Captcha solving process status.

+
+ +
+
+field taskId: int = None
+

Task ID.

+
+ +
+ +
+
+pydantic model core.serializer.TurnstileProxylessOptionsSer
+

+Show JSON schema
{
+   "title": "TurnstileProxylessOptionsSer",
+   "type": "object",
+   "properties": {
+      "type": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/CaptchaTypeEnm"
+            }
+         ],
+         "description": "Captcha task type name"
+      },
+      "websiteURL": {
+         "description": "Address of a target web page. Can be located anywhere on the web site.",
+         "title": "Websiteurl",
+         "type": "string"
+      },
+      "websiteKey": {
+         "description": "Website key",
+         "title": "Websitekey",
+         "type": "string"
+      }
+   },
+   "$defs": {
+      "CaptchaTypeEnm": {
+         "description": "Enum with all available captcha types",
+         "enum": [
+            "Control",
+            "ImageToTextTask",
+            "RecaptchaV2Task",
+            "RecaptchaV2TaskProxyless",
+            "RecaptchaV3TaskProxyless",
+            "RecaptchaV2EnterpriseTask",
+            "RecaptchaV2EnterpriseTaskProxyless",
+            "FunCaptchaTask",
+            "FunCaptchaTaskProxyless",
+            "GeeTestTask",
+            "GeeTestTaskProxyless",
+            "HCaptchaTask",
+            "HCaptchaTaskProxyless",
+            "TurnstileTask",
+            "TurnstileTaskProxyless",
+            "AntiGateTask"
+         ],
+         "title": "CaptchaTypeEnm",
+         "type": "string"
+      }
+   },
+   "required": [
+      "type",
+      "websiteURL",
+      "websiteKey"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+
+
+
+
+
+field websiteKey: str [Required]
+

Website key

+
+ +
+
+field websiteURL: str [Required]
+

Address of a target web page. Can be located anywhere on the web site.

+
+ +
+ +
+
+pydantic model core.serializer.TurnstileOptionsSer
+

+Show JSON schema
{
+   "title": "TurnstileOptionsSer",
+   "type": "object",
+   "properties": {
+      "proxyType": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/ProxyTypeEnm"
+            }
+         ],
+         "description": "Type of proxy"
+      },
+      "proxyAddress": {
+         "description": "Proxy IP address ipv4/ipv6. No host names or IP addresses from local networks",
+         "title": "Proxyaddress",
+         "type": "string"
+      },
+      "proxyPort": {
+         "description": "Proxy port",
+         "title": "Proxyport",
+         "type": "integer"
+      },
+      "type": {
+         "allOf": [
+            {
+               "$ref": "#/$defs/CaptchaTypeEnm"
+            }
+         ],
+         "description": "Captcha task type name"
+      },
+      "websiteURL": {
+         "description": "Address of a target web page. Can be located anywhere on the web site.",
+         "title": "Websiteurl",
+         "type": "string"
+      },
+      "websiteKey": {
+         "description": "Website key",
+         "title": "Websitekey",
+         "type": "string"
+      }
+   },
+   "$defs": {
+      "CaptchaTypeEnm": {
+         "description": "Enum with all available captcha types",
+         "enum": [
+            "Control",
+            "ImageToTextTask",
+            "RecaptchaV2Task",
+            "RecaptchaV2TaskProxyless",
+            "RecaptchaV3TaskProxyless",
+            "RecaptchaV2EnterpriseTask",
+            "RecaptchaV2EnterpriseTaskProxyless",
+            "FunCaptchaTask",
+            "FunCaptchaTaskProxyless",
+            "GeeTestTask",
+            "GeeTestTaskProxyless",
+            "HCaptchaTask",
+            "HCaptchaTaskProxyless",
+            "TurnstileTask",
+            "TurnstileTaskProxyless",
+            "AntiGateTask"
+         ],
+         "title": "CaptchaTypeEnm",
+         "type": "string"
+      },
+      "ProxyTypeEnm": {
+         "description": "Enum store proxy types",
+         "enum": [
+            "http",
+            "https",
+            "socks4",
+            "socks5"
+         ],
+         "title": "ProxyTypeEnm",
+         "type": "string"
+      }
+   },
+   "required": [
+      "proxyType",
+      "proxyAddress",
+      "proxyPort",
+      "type",
+      "websiteURL",
+      "websiteKey"
+   ]
+}
+
+
+

+
Config:
+
    +
  • use_enum_values: bool = True

  • +
  • validate_assignment: bool = True

  • +
+
+
Fields:
+

+
+
+ +
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/modules/turnstile/example.html b/modules/turnstile/example.html new file mode 100644 index 0000000..1489e1d --- /dev/null +++ b/modules/turnstile/example.html @@ -0,0 +1,295 @@ + + + + + + + + Turnstile — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + +
+
+
+
+ +
+

Turnstile

+

To import this module:

+
from python3_anticaptcha.turnstile import Turnstile
+
+
+
+
+class python3_anticaptcha.turnstile.Turnstile(api_key: str, captcha_type: CaptchaTypeEnm | str, websiteURL: str, websiteKey: str, proxyType: ProxyTypeEnm | str | None = None, proxyAddress: str | None = None, proxyPort: int | None = None, sleep_time: int | None = 10, **kwargs)
+
+
+
+
+__init__(api_key: str, captcha_type: CaptchaTypeEnm | str, websiteURL: str, websiteKey: str, proxyType: ProxyTypeEnm | str | None = None, proxyAddress: str | None = None, proxyPort: int | None = None, sleep_time: int | None = 10, **kwargs)
+

The class is used to work with Turnstile.

+
+
Parameters:
+
    +
  • api_key (str) – Capsolver API key

  • +
  • captcha_type (CaptchaTypeEnm | str) – Captcha type

  • +
  • websiteURL (str) – Address of the webpage

  • +
  • websiteKey (str) – Turnstile sitekey

  • +
  • proxyType (ProxyTypeEnm | str | None) – Type of the proxy

  • +
  • proxyAddress (str | None) – Proxy IP address IPv4/IPv6. Not allowed to use: +host names instead of IPs, +transparent proxies (where client IP is visible), +proxies from local networks (192.., 10.., 127…)

  • +
  • proxyPort (int | None) – Proxy port.

  • +
  • sleep_time (int | None) – The waiting time between requests to get the result of the Captcha

  • +
  • kwargs – Additional not required params for main request body. +Like callbackUrl/languagePool and etc. +More info - https://anti-captcha.com/apidoc/methods/createTask

  • +
+
+
+
+

Examples

+
>>> Turnstile(api_key="99d7d111a0111dc11184111c8bb111da",
+...         captcha_type="TurnstileTaskProxyless",
+...         websiteURL="https://rucaptcha.com/demo/cloudflare-turnstile",
+...         websiteKey="0x4AAAAAAAC3DHQFLr1GavRN"
+...        ).captcha_handler()
+{
+   "errorId": 0,
+   "errorCode": None,
+   "errorDescription": None,
+   "status":"ready",
+   "solution":{
+      "token":"0.Qz0.....f1",
+      "userAgent":"Mozilla/.....36"
+   },
+   "cost": 0.002,
+   "ip": "46.53.249.230",
+   "createTime": 1679004358,
+   "endTime": 1679004368,
+   "solveCount": 0,
+   "taskId": 396687629
+}
+
+
+
>>> await Turnstile(api_key="99d7d111a0111dc11184111c8bb111da",
+...         captcha_type="TurnstileTaskProxyless",
+...         websiteURL="https://rucaptcha.com/demo/cloudflare-turnstile",
+...         websiteKey="0x4AAAAAAAC3DHQFLr1GavRN"
+...        ).aio_captcha_handler()
+{
+   "errorId": 0,
+   "errorCode": None,
+   "errorDescription": None,
+   "status":"ready",
+   "solution":{
+      "token":"0.Qz0.....f1",
+      "userAgent":"Mozilla/.....36"
+   },
+   "cost": 0.002,
+   "ip": "46.53.249.230",
+   "createTime": 1679004358,
+   "endTime": 1679004368,
+   "solveCount": 0,
+   "taskId": 396687629
+}
+
+
+
>>> Turnstile(api_key="99d7d111a0111dc11184111c8bb111da",
+...         captcha_type="TurnstileTaskProxyless",
+...         websiteURL="https://rucaptcha.com/demo/cloudflare-turnstile",
+...         websiteKey="0x4AAAAAAAC3DHQFLr1GavRN",
+...         proxyType="http",
+...         proxyAddress="0.0.0.0",
+...         proxyPort=9988,
+...        ).captcha_handler()
+{
+   "errorId": 0,
+   "errorCode": None,
+   "errorDescription": None,
+   "status":"ready",
+   "solution":{
+      "token":"0.Qz0.....f1",
+      "userAgent":"Mozilla/.....36"
+   },
+   "cost": 0.002,
+   "ip": "46.53.249.230",
+   "createTime": 1679004358,
+   "endTime": 1679004368,
+   "solveCount": 0,
+   "taskId": 396687629
+}
+
+
+
>>> Turnstile(api_key="99d7d111a0111dc11184111c8bb111da",
+...         captcha_type="TurnstileTaskProxyless",
+...         websiteURL="https://rucaptcha.com/demo/cloudflare-turnstile",
+...         websiteKey="0x4AAAAAAAC3DHQFLr1GavRN",
+...         proxyType="http",
+...         proxyAddress="0.0.0.0",
+...         proxyPort=9988
+...        ).captcha_handler(proxyLogin="some_login",
+...                         proxyPassword="some_strong_password")
+{
+   "errorId": 0,
+   "errorCode": None,
+   "errorDescription": None,
+   "status":"ready",
+   "solution":{
+      "token":"0.Qz0.....f1",
+      "userAgent":"Mozilla/.....36"
+   },
+   "cost": 0.002,
+   "ip": "46.53.249.230",
+   "createTime": 1679004358,
+   "endTime": 1679004368,
+   "solveCount": 0,
+   "taskId": 396687629
+}
+
+
+
+ +
+ +
+
+captcha_handler(**additional_params) dict
+

Synchronous method for captcha solving

+
+
Parameters:
+

additional_params – Some additional parameters that will be used in creating the task +and will be passed to the payload under task key. +Like proxyLogin, proxyPassword and etc. - more info in service docs

+
+
Returns:
+

Full service response

+
+
Return type:
+

dict

+
+
+
+

Notes

+

Check class docstirng for more info

+
+
+ +
+
+async aio_captcha_handler(**additional_params) dict
+

Asynchronous method for captcha solving

+
+
Parameters:
+

additional_params – Some additional parameters that will be used in creating the task +and will be passed to the payload under task key. +Like proxyLogin, proxyPassword and etc. - more info in service docs

+
+
Returns:
+

Full service response

+
+
Return type:
+

dict

+
+
+
+

Notes

+

Check class docstirng for more info

+
+
+ +
+ +
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..88fa0824197c8c6b9262e007c78050c4962145b6 GIT binary patch literal 1209 zcmV;q1V;NKAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk#d30!R zZZj=mZggp5VQ_R~XkiK?AXa5^b7^mGIv@%oAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZE zX>4U6X>%ZBZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&;uY-I2y4@Cd|E$D^@5g`EqFESM1T$4SH z%N#ZqZ4+)n>wd1I@cw#vzpx5kh0((*PJ)NkDh%Sp z{P3eVxbf}cm-k138^`?RoxcbZ$0FyAQpnR>P_EBNj<*ODtU^Bylh|K>wd7SDbQRCM z?|O3^Pr}}nq51Xh7i`QBqe@q{8R)%8Cm1IjXQ0kQJY!Z&Vbm+=)FQQSY@X|U(&)dT zsPi#OkSF!Y66fzpoE4~Ca0P3Pb)lvV?;8Tjr66XvqkLz_B_si-<$GBQB*l#W1c|<2 z1%9+#!4DICdJVE-Gt?lR;A|rws+hX#xk<6X{h+)1f%#kP(!ljH7 zkJ{xtAl+8$4)E2V?xwn>BW)IN`!8U5wHQR#V{dD67ob~w!L;o>8-crg0m~CGMn^<6 zHJ!T`K%|*`nt@{>;OPZaXzo}*30BzK-F_wW41p-P>-kr85$0ILW-8W&@io@?p{_EN zwJaO}SC#Ie^wU(fmpe|}Z&V^7wPT6c+HTZcf7zad4&2?TT~Y!43tL4sSS#@VkJx5) zJ54Mv%@Lb_Olq^{deZC|^^Hvb%gXD+Ufbmg4mishyo-mDgmS8rWblZ878z5K>_8_t z&y#9VQtl+S*c8YF+zFT(q=4jQX?3HbaFA6t!n*kGbnT~zfo2Rk&NplzCs#NHU@b$EJhsL$TqaSstrFTlO( zYfERyC;@ZG8nx{|Z_IC-mX45N%16z+hsRkmUZ(}AO4tq{^d97#(e3z9zUtDz9;!yK zoyvK2;H^F=m}>Xgc&NOp_iUsF9?}>plf8AGcN literal 0 HcmV?d00001 diff --git a/search.html b/search.html new file mode 100644 index 0000000..ae37b1a --- /dev/null +++ b/search.html @@ -0,0 +1,101 @@ + + + + + + + + Search — python3-anticaptcha (2.0.1a) + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..04f5db4 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Additional modules": [[0, null]], "Captcha examples:": [[0, null]], "Contacts": [[1, null]], "Control": [[2, null]], "Enum": [[3, null]], "Examples": [[2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [8, null]], "How to install?": [[5, "how-to-install"]], "How to test?": [[5, "how-to-test"]], "Introduction": [[5, null]], "License": [[4, null]], "Notes": [[2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [2, null], [8, null], [8, null], [8, null]], "Other captcha-solving services libs": [[6, null]], "Other libraries for Captcha-solving services": [[6, "other-libraries-for-captcha-solving-services"]], "Serializer": [[7, null]], "Source": [[5, "source"]], "Start here:": [[0, null]], "Turnstile": [[8, null]], "Welcome to python3-anticaptcha": [[5, "welcome-to-python3-anticaptcha"]], "pip": [[5, "pip"]], "python3-anticaptcha": [[0, null]]}, "docnames": ["index", "modules/contacts/info", "modules/control/example", "modules/enum/info", "modules/license/info", "modules/main/info", "modules/other-libs/info", "modules/serializer/info", "modules/turnstile/example"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst", "modules/contacts/info.md", "modules/control/example.rst", "modules/enum/info.rst", "modules/license/info.md", "modules/main/info.md", "modules/other-libs/info.md", "modules/serializer/info.rst", "modules/turnstile/example.rst"], "indexentries": {"__init__() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.__init__", false]], "__init__() (python3_anticaptcha.turnstile.turnstile method)": [[8, "python3_anticaptcha.turnstile.Turnstile.__init__", false]], "aio_captcha_handler() (python3_anticaptcha.turnstile.turnstile method)": [[8, "python3_anticaptcha.turnstile.Turnstile.aio_captcha_handler", false]], "aio_get_app_stats() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_get_app_stats", false]], "aio_get_balance() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_get_balance", false]], "aio_get_queue_status() (python3_anticaptcha.control.control static method)": [[2, "python3_anticaptcha.control.Control.aio_get_queue_status", false]], "aio_get_spending_stats() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_get_spending_stats", false]], "aio_report_correct_recaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_report_correct_recaptcha", false]], "aio_report_incorrect_hcaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_report_incorrect_hcaptcha", false]], "aio_report_incorrect_image() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_report_incorrect_image", false]], "aio_report_incorrect_recaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.aio_report_incorrect_recaptcha", false]], "antigatetask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.AntiGateTask", false]], "callbackurl (core.serializer.createtaskrequestser attribute)": [[7, "core.serializer.CreateTaskRequestSer.callbackUrl", false]], "captcha_handler() (python3_anticaptcha.turnstile.turnstile method)": [[8, "python3_anticaptcha.turnstile.Turnstile.captcha_handler", false]], "captchatypeenm (class in core.enum)": [[3, "core.enum.CaptchaTypeEnm", false]], "clientkey (core.serializer.baseapirequestser attribute)": [[7, "core.serializer.BaseAPIRequestSer.clientKey", false]], "control (class in python3_anticaptcha.control)": [[2, "python3_anticaptcha.control.Control", false]], "control (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.Control", false]], "controlpostfixenm (class in core.enum)": [[3, "core.enum.ControlPostfixEnm", false]], "cost (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.cost", false]], "create_task (core.enum.endpointpostfixenm attribute)": [[3, "core.enum.EndpointPostfixEnm.CREATE_TASK", false]], "createtime (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.createTime", false]], "endpointpostfixenm (class in core.enum)": [[3, "core.enum.EndpointPostfixEnm", false]], "endtime (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.endTime", false]], "errorcode (core.serializer.baseapiresponseser attribute)": [[7, "core.serializer.BaseAPIResponseSer.errorCode", false]], "errordescription (core.serializer.baseapiresponseser attribute)": [[7, "core.serializer.BaseAPIResponseSer.errorDescription", false]], "errorid (core.serializer.baseapiresponseser attribute)": [[7, "core.serializer.BaseAPIResponseSer.errorId", false]], "funcaptchatask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.FunCaptchaTask", false]], "funcaptchataskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.FunCaptchaTaskProxyless", false]], "geetesttask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.GeeTestTask", false]], "geetesttaskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.GeeTestTaskProxyless", false]], "get_app_stats (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.GET_APP_STATS", false]], "get_app_stats() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.get_app_stats", false]], "get_balance (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.GET_BALANCE", false]], "get_balance() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.get_balance", false]], "get_queue_stats (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.GET_QUEUE_STATS", false]], "get_queue_status() (python3_anticaptcha.control.control static method)": [[2, "python3_anticaptcha.control.Control.get_queue_status", false]], "get_spending_stats (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.GET_SPENDING_STATS", false]], "get_spending_stats() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.get_spending_stats", false]], "get_task_result (core.enum.endpointpostfixenm attribute)": [[3, "core.enum.EndpointPostfixEnm.GET_TASK_RESULT", false]], "hcaptchatask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.HCaptchaTask", false]], "hcaptchataskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.HCaptchaTaskProxyless", false]], "http (core.enum.proxytypeenm attribute)": [[3, "core.enum.ProxyTypeEnm.http", false]], "https (core.enum.proxytypeenm attribute)": [[3, "core.enum.ProxyTypeEnm.https", false]], "imagetotexttask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.ImageToTextTask", false]], "ip (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.ip", false]], "languagepool (core.serializer.createtaskrequestser attribute)": [[7, "core.serializer.CreateTaskRequestSer.languagePool", false]], "list() (core.enum.myenum class method)": [[3, "core.enum.MyEnum.list", false]], "list_names() (core.enum.myenum class method)": [[3, "core.enum.MyEnum.list_names", false]], "list_values() (core.enum.myenum class method)": [[3, "core.enum.MyEnum.list_values", false]], "myenum (class in core.enum)": [[3, "core.enum.MyEnum", false]], "processing (core.enum.responsestatusenm attribute)": [[3, "core.enum.ResponseStatusEnm.processing", false]], "proxyaddress (core.serializer.proxydataoptionsser attribute)": [[7, "core.serializer.ProxyDataOptionsSer.proxyAddress", false]], "proxyport (core.serializer.proxydataoptionsser attribute)": [[7, "core.serializer.ProxyDataOptionsSer.proxyPort", false]], "proxytype (core.serializer.proxydataoptionsser attribute)": [[7, "core.serializer.ProxyDataOptionsSer.proxyType", false]], "proxytypeenm (class in core.enum)": [[3, "core.enum.ProxyTypeEnm", false]], "ready (core.enum.responsestatusenm attribute)": [[3, "core.enum.ResponseStatusEnm.ready", false]], "recaptchav2enterprisetask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.RecaptchaV2EnterpriseTask", false]], "recaptchav2enterprisetaskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.RecaptchaV2EnterpriseTaskProxyless", false]], "recaptchav2task (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.RecaptchaV2Task", false]], "recaptchav2taskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.RecaptchaV2TaskProxyless", false]], "recaptchav3taskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.RecaptchaV3TaskProxyless", false]], "report_correct_recaptcha (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.REPORT_CORRECT_RECAPTCHA", false]], "report_correct_recaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.report_correct_recaptcha", false]], "report_incorrect_hcaptcha (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.REPORT_INCORRECT_HCAPTCHA", false]], "report_incorrect_hcaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.report_incorrect_hcaptcha", false]], "report_incorrect_image() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.report_incorrect_image", false]], "report_incorrect_image_captcha (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.REPORT_INCORRECT_IMAGE_CAPTCHA", false]], "report_incorrect_recaptcha (core.enum.controlpostfixenm attribute)": [[3, "core.enum.ControlPostfixEnm.REPORT_INCORRECT_RECAPTCHA", false]], "report_incorrect_recaptcha() (python3_anticaptcha.control.control method)": [[2, "python3_anticaptcha.control.Control.report_incorrect_recaptcha", false]], "responsestatusenm (class in core.enum)": [[3, "core.enum.ResponseStatusEnm", false]], "socks4 (core.enum.proxytypeenm attribute)": [[3, "core.enum.ProxyTypeEnm.socks4", false]], "socks5 (core.enum.proxytypeenm attribute)": [[3, "core.enum.ProxyTypeEnm.socks5", false]], "softid (core.serializer.createtaskrequestser attribute)": [[7, "core.serializer.CreateTaskRequestSer.softId", false]], "solution (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.solution", false]], "solvecount (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.solveCount", false]], "status (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.status", false]], "task (core.serializer.createtaskrequestser attribute)": [[7, "core.serializer.CreateTaskRequestSer.task", false]], "taskid (core.serializer.createtaskresponseser attribute)": [[7, "core.serializer.CreateTaskResponseSer.taskId", false]], "taskid (core.serializer.gettaskresultrequestser attribute)": [[7, "core.serializer.GetTaskResultRequestSer.taskId", false]], "taskid (core.serializer.gettaskresultresponseser attribute)": [[7, "core.serializer.GetTaskResultResponseSer.taskId", false]], "turnstile (class in python3_anticaptcha.turnstile)": [[8, "python3_anticaptcha.turnstile.Turnstile", false]], "turnstiletask (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.TurnstileTask", false]], "turnstiletaskproxyless (core.enum.captchatypeenm attribute)": [[3, "core.enum.CaptchaTypeEnm.TurnstileTaskProxyless", false]], "type (core.serializer.createtaskrequesttaskser attribute)": [[7, "core.serializer.CreateTaskRequestTaskSer.type", false]], "websitekey (core.serializer.turnstileproxylessoptionsser attribute)": [[7, "core.serializer.TurnstileProxylessOptionsSer.websiteKey", false]], "websiteurl (core.serializer.turnstileproxylessoptionsser attribute)": [[7, "core.serializer.TurnstileProxylessOptionsSer.websiteURL", false]]}, "objects": {"core.enum": [[3, 0, 1, "", "CaptchaTypeEnm"], [3, 0, 1, "", "ControlPostfixEnm"], [3, 0, 1, "", "EndpointPostfixEnm"], [3, 0, 1, "", "MyEnum"], [3, 0, 1, "", "ProxyTypeEnm"], [3, 0, 1, "", "ResponseStatusEnm"]], "core.enum.CaptchaTypeEnm": [[3, 1, 1, "", "AntiGateTask"], [3, 1, 1, "", "Control"], [3, 1, 1, "", "FunCaptchaTask"], [3, 1, 1, "", "FunCaptchaTaskProxyless"], [3, 1, 1, "", "GeeTestTask"], [3, 1, 1, "", "GeeTestTaskProxyless"], [3, 1, 1, "", "HCaptchaTask"], [3, 1, 1, "", "HCaptchaTaskProxyless"], [3, 1, 1, "", "ImageToTextTask"], [3, 1, 1, "", "RecaptchaV2EnterpriseTask"], [3, 1, 1, "", "RecaptchaV2EnterpriseTaskProxyless"], [3, 1, 1, "", "RecaptchaV2Task"], [3, 1, 1, "", "RecaptchaV2TaskProxyless"], [3, 1, 1, "", "RecaptchaV3TaskProxyless"], [3, 1, 1, "", "TurnstileTask"], [3, 1, 1, "", "TurnstileTaskProxyless"]], "core.enum.ControlPostfixEnm": [[3, 1, 1, "", "GET_APP_STATS"], [3, 1, 1, "", "GET_BALANCE"], [3, 1, 1, "", "GET_QUEUE_STATS"], [3, 1, 1, "", "GET_SPENDING_STATS"], [3, 1, 1, "", "REPORT_CORRECT_RECAPTCHA"], [3, 1, 1, "", "REPORT_INCORRECT_HCAPTCHA"], [3, 1, 1, "", "REPORT_INCORRECT_IMAGE_CAPTCHA"], [3, 1, 1, "", "REPORT_INCORRECT_RECAPTCHA"]], "core.enum.EndpointPostfixEnm": [[3, 1, 1, "", "CREATE_TASK"], [3, 1, 1, "", "GET_TASK_RESULT"]], "core.enum.MyEnum": [[3, 2, 1, "", "list"], [3, 2, 1, "", "list_names"], [3, 2, 1, "", "list_values"]], "core.enum.ProxyTypeEnm": [[3, 1, 1, "", "http"], [3, 1, 1, "", "https"], [3, 1, 1, "", "socks4"], [3, 1, 1, "", "socks5"]], "core.enum.ResponseStatusEnm": [[3, 1, 1, "", "processing"], [3, 1, 1, "", "ready"]], "core.serializer": [[7, 3, 1, "", "BaseAPIRequestSer"], [7, 3, 1, "", "BaseAPIResponseSer"], [7, 3, 1, "", "CreateTaskRequestSer"], [7, 3, 1, "", "CreateTaskRequestTaskSer"], [7, 3, 1, "", "CreateTaskResponseSer"], [7, 3, 1, "", "GetTaskResultRequestSer"], [7, 3, 1, "", "GetTaskResultResponseSer"], [7, 3, 1, "", "ProxyDataOptionsSer"], [7, 3, 1, "", "TurnstileOptionsSer"], [7, 3, 1, "", "TurnstileProxylessOptionsSer"]], "core.serializer.BaseAPIRequestSer": [[7, 4, 1, "", "clientKey"]], "core.serializer.BaseAPIResponseSer": [[7, 4, 1, "", "errorCode"], [7, 4, 1, "", "errorDescription"], [7, 4, 1, "", "errorId"]], "core.serializer.CreateTaskRequestSer": [[7, 4, 1, "", "callbackUrl"], [7, 4, 1, "", "languagePool"], [7, 4, 1, "", "softId"], [7, 4, 1, "", "task"]], "core.serializer.CreateTaskRequestTaskSer": [[7, 4, 1, "", "type"]], "core.serializer.CreateTaskResponseSer": [[7, 4, 1, "", "taskId"]], "core.serializer.GetTaskResultRequestSer": [[7, 4, 1, "", "taskId"]], "core.serializer.GetTaskResultResponseSer": [[7, 4, 1, "", "cost"], [7, 4, 1, "", "createTime"], [7, 4, 1, "", "endTime"], [7, 4, 1, "", "ip"], [7, 4, 1, "", "solution"], [7, 4, 1, "", "solveCount"], [7, 4, 1, "", "status"], [7, 4, 1, "", "taskId"]], "core.serializer.ProxyDataOptionsSer": [[7, 4, 1, "", "proxyAddress"], [7, 4, 1, "", "proxyPort"], [7, 4, 1, "", "proxyType"]], "core.serializer.TurnstileProxylessOptionsSer": [[7, 4, 1, "", "websiteKey"], [7, 4, 1, "", "websiteURL"]], "python3_anticaptcha.control": [[2, 0, 1, "", "Control"]], "python3_anticaptcha.control.Control": [[2, 2, 1, "", "__init__"], [2, 2, 1, "", "aio_get_app_stats"], [2, 2, 1, "", "aio_get_balance"], [2, 2, 1, "", "aio_get_queue_status"], [2, 2, 1, "", "aio_get_spending_stats"], [2, 2, 1, "", "aio_report_correct_recaptcha"], [2, 2, 1, "", "aio_report_incorrect_hcaptcha"], [2, 2, 1, "", "aio_report_incorrect_image"], [2, 2, 1, "", "aio_report_incorrect_recaptcha"], [2, 2, 1, "", "get_app_stats"], [2, 2, 1, "", "get_balance"], [2, 2, 1, "", "get_queue_status"], [2, 2, 1, "", "get_spending_stats"], [2, 2, 1, "", "report_correct_recaptcha"], [2, 2, 1, "", "report_incorrect_hcaptcha"], [2, 2, 1, "", "report_incorrect_image"], [2, 2, 1, "", "report_incorrect_recaptcha"]], "python3_anticaptcha.turnstile": [[8, 0, 1, "", "Turnstile"]], "python3_anticaptcha.turnstile.Turnstile": [[8, 2, 1, "", "__init__"], [8, 2, 1, "", "aio_captcha_handler"], [8, 2, 1, "", "captcha_handler"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "method", "Python method"], "3": ["py", "pydantic_model", "Python model"], "4": ["py", "pydantic_field", "Python field"]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:method", "3": "py:pydantic_model", "4": "py:pydantic_field"}, "terms": {"0": [2, 8], "000576": 2, "002": [2, 8], "0x4aaaaaaac3dhqflr1gavrn": 8, "1": [2, 3], "10": [2, 8], "12396": 2, "127": [2, 8], "14": 2, "146": 2, "1679004358": 8, "1679004368": 8, "1679183850": 2, "1679187449": 2, "17": 2, "19": 2, "192": [2, 8], "20": 2, "2022": 4, "23": 2, "230": 8, "234": 2, "24": 2, "249": 8, "2captcha": 6, "3": 5, "32": 7, "36": [2, 8], "38": 2, "396687629": 8, "425436541": 2, "4256541": 2, "43": 2, "438": 2, "46": [2, 8], "48": 2, "53": 8, "58": 2, "7": [2, 5], "8": 2, "867": [2, 7], "90": 2, "9988": 8, "99d7d111a0111dc11184111c8bb111da": [2, 8], "A": 4, "AND": 4, "AS": 4, "BE": 4, "BUT": 4, "FOR": 4, "For": [0, 5], "IN": 4, "If": 1, "NO": 4, "NOT": 4, "No": 7, "Not": [2, 8], "OF": 4, "OR": 4, "Or": 1, "THE": 4, "TO": 4, "The": [0, 2, 4, 5, 8], "To": [2, 3, 7, 8], "WITH": 4, "__init__": [0, 2, 8], "about": 2, "abov": 4, "accept": 2, "access": 2, "account": [2, 5], "action": 4, "addit": [2, 8], "additional_param": 8, "address": [2, 7, 8], "aio_captcha_handl": [0, 8], "aio_get_app_stat": [0, 2], "aio_get_bal": [0, 2], "aio_get_queue_statu": [0, 2], "aio_get_spending_stat": [0, 2], "aio_report_correct_recaptcha": [0, 2], "aio_report_incorrect_hcaptcha": [0, 2], "aio_report_incorrect_imag": [0, 2], "aio_report_incorrect_recaptcha": [0, 2], "all": [3, 4, 7], "allof": 7, "allow": [2, 8], "an": [2, 4, 7], "andrei": 4, "andreidrang": 5, "ani": [1, 4], "annot": 7, "anti": [2, 8], "anticaptcha": 6, "antigatetask": [3, 7], "anywher": 7, "api": [0, 2, 3, 5, 8], "api_kei": [2, 5, 8], "apidoc": [2, 8], "appli": 7, "applic": 2, "ar": 2, "arg": 2, "aris": 4, "associ": 4, "async": [2, 8], "asynchron": 8, "author": 4, "avail": [2, 3, 7], "await": [2, 8], "balanc": 2, "base": [3, 5], "baseapirequests": [0, 7], "baseapiresponses": [0, 7], "between": [2, 8], "bid": 2, "bodi": [2, 8], "bool": 7, "bot": [0, 5], "boundari": 3, "callbackurl": [2, 7, 8], "can": [5, 7], "capsolv": [2, 6, 8], "captcha": [1, 2, 3, 7, 8], "captcha_handl": [0, 8], "captcha_typ": [2, 8], "captchatypeenm": [0, 3, 7, 8], "cd": 5, "center": 2, "charg": 4, "chartdata": 2, "chat": 1, "check": [0, 5, 8], "claim": 4, "class": [2, 3, 8], "classmethod": 3, "client": [2, 8], "clientkei": 7, "clone": 5, "cloudflar": 8, "code": 7, "com": [2, 5, 8], "command": 5, "complaint": 2, "complet": 7, "condit": 4, "config": 7, "connect": 4, "const": 7, "constraint": 7, "contact": 0, "contract": 4, "control": [0, 3, 7], "controlpostfixenm": [0, 3], "copi": 4, "copyright": 4, "core": [3, 7], "correctli": 2, "cost": [7, 8], "creat": [7, 8], "create_task": 3, "createtask": [2, 3, 7, 8], "createtaskrequests": [0, 7], "createtaskrequesttasks": [0, 7], "createtaskresponses": [0, 7], "createtim": [7, 8], "creation": 7, "daili": 2, "damag": 4, "data": [2, 7], "date": 7, "datefrom": 2, "datetil": 2, "deal": 4, "def": 7, "default": 7, "defin": 2, "demo": 8, "descript": 7, "develop": [0, 2, 5], "dict": [2, 7, 8], "did": 2, "differ": 7, "directori": 5, "distribut": 4, "do": 4, "doc": 8, "docstirng": 8, "document": 4, "each": 7, "email": 1, "en": 7, "endpoint": 3, "endpointpostfixenm": [0, 3], "endtim": [7, 8], "english": 2, "enterpris": 2, "enum": [0, 7], "environ": 5, "error": [2, 7], "error_access_deni": 2, "errorcod": [7, 8], "errordescript": [7, 8], "errorid": [2, 7, 8], "etc": [2, 8], "event": 4, "exampl": 5, "express": 4, "f1": 8, "feb": 2, "field": [3, 7], "file": 4, "fit": 4, "float": 7, "follow": 4, "free": 4, "from": [2, 3, 4, 5, 7, 8], "fromdat": 2, "full": [2, 8], "funcaptchatask": [3, 7], "funcaptchataskproxyless": [3, 7], "furnish": 4, "geetesttask": [3, 7], "geetesttaskproxyless": [3, 7], "get": [2, 5, 8], "get_app_stat": [0, 2, 3], "get_bal": [0, 2, 3], "get_queue_stat": 3, "get_queue_statu": [0, 2], "get_spending_stat": [0, 2, 3], "get_task_result": 3, "getappstat": [2, 3], "getbal": [2, 3], "getqueuestat": [2, 3], "getspendingstat": [2, 3], "gettaskresult": [3, 7], "gettaskresultrequests": [0, 7], "gettaskresultresponses": [0, 7], "git": 5, "github": 5, "grab": 2, "grant": 4, "group": [0, 5, 6], "have": 1, "hcaptchatask": [3, 7], "hcaptchataskproxyless": [3, 7], "here": 5, "herebi": 4, "holder": 4, "host": [2, 7, 8], "hour": 2, "http": [2, 3, 5, 7, 8], "i": [0, 2, 4, 5, 8], "id": 7, "identifi": [2, 7], "imag": [2, 7], "imagetotext": 2, "imagetotexttask": [3, 7], "impli": 4, "import": [2, 3, 7, 8], "improp": 2, "includ": [2, 4], "info": [2, 8], "inform": 2, "instead": [2, 8], "int": [2, 7, 8], "integ": 7, "intend": [0, 5], "introduct": 0, "ip": [2, 7, 8], "ipv4": [2, 7, 8], "ipv6": [2, 7, 8], "its": 2, "json": 7, "kei": [2, 7, 8], "kind": 4, "kwarg": [2, 8], "languag": 7, "languagepool": [2, 7, 8], "later": 7, "latest": 5, "liabil": 4, "liabl": 4, "lib": 0, "librari": [0, 5], "licens": 0, "like": [2, 8], "limit": 4, "list": 3, "list_nam": 3, "list_valu": 3, "liter": 7, "load": 2, "local": [2, 7, 8], "locat": 7, "main": [2, 8], "make": [2, 5], "mar": 2, "max_length": 7, "maxlength": 7, "me": 1, "merchant": 4, "merg": 4, "messag": 1, "method": [2, 3, 7, 8], "min_length": 7, "minlength": 7, "mit": 4, "mode": 2, "model": 7, "modifi": 4, "modul": [2, 3, 7, 8], "monei": 2, "more": [2, 8], "mozilla": 8, "myenum": [0, 3], "name": [2, 3, 7, 8], "need": 5, "network": [2, 7, 8], "new": 2, "none": [2, 3, 7, 8], "noninfring": 4, "notic": 4, "null": 7, "number": 7, "o": 5, "object": 7, "obtain": [4, 7], "onli": [2, 7], "other": [0, 4, 5], "otherwis": 4, "our": [0, 5, 6], "out": 4, "owner": 2, "page": 7, "param": [2, 8], "paramet": [2, 8], "particular": 4, "pass": [2, 8], "pattern": 7, "payload": 8, "period": 2, "permiss": 4, "permit": 4, "person": 4, "pleas": 1, "pm": 1, "pool": 7, "port": [2, 7, 8], "portion": 4, "possibl": 2, "postfix": 3, "process": [3, 7], "project": [0, 5, 6], "properti": 7, "provid": 4, "proxi": [2, 3, 7, 8], "proxyaddress": [2, 7, 8], "proxydataoptionss": [0, 7], "proxylogin": 8, "proxypassword": 8, "proxyport": [2, 7, 8], "proxytyp": [2, 7, 8], "proxytypeenm": [0, 3, 7, 8], "publish": 4, "purpos": 4, "py": 5, "pydant": 7, "python": [1, 5], "python3_anticaptcha": [2, 3, 7, 8], "qualnam": 3, "question": 1, "queue": 2, "queue_id": 2, "qz0": 8, "readi": [3, 7, 8], "recaptcha": 2, "recaptchav2enterprisetask": [3, 7], "recaptchav2enterprisetaskproxyless": [3, 7], "recaptchav2task": [3, 7], "recaptchav2taskproxyless": [3, 7], "recaptchav3taskproxyless": [3, 7], "recommend": 5, "redpandadev": [0, 5, 6], "ref": 7, "regist": 2, "report": 2, "report_correct_recaptcha": [0, 2, 3], "report_incorrect_hcaptcha": [0, 2, 3], "report_incorrect_imag": [0, 2], "report_incorrect_image_captcha": 3, "report_incorrect_recaptcha": [0, 2, 3], "reportcorrectrecaptcha": [2, 3], "reportincorrecthcaptcha": [2, 3], "reportincorrectimagecaptcha": [2, 3], "reportincorrectrecaptcha": [2, 3], "request": [2, 8], "requir": [2, 7, 8], "respons": [2, 8], "responsestatusenm": [0, 3, 7], "restrict": 4, "result": [2, 3, 7, 8], "retriev": 2, "return": [2, 8], "right": 4, "room": 1, "root": 5, "rucaptcha": [6, 8], "run": 5, "schema": 7, "sell": 4, "send": [1, 2, 7], "serial": 0, "server": 2, "servic": [0, 2, 5, 8], "set": [5, 7], "setup": 5, "shall": 4, "short": 7, "should": 7, "show": 7, "site": 7, "sitekei": [2, 8], "sleep_tim": [2, 8], "so": 4, "socks4": [3, 7], "socks5": [3, 7], "softid": [2, 7], "softwar": [0, 4, 5], "solut": [7, 8], "solv": [0, 2, 7, 8], "solvecount": [7, 8], "some": 8, "some_login": 8, "some_strong_password": 8, "speed": 2, "spend": 2, "start": 3, "static": 2, "statist": 2, "statu": [2, 3, 7, 8], "store": [3, 7], "str": [2, 3, 7, 8], "strict": 7, "string": 7, "stringconstraint": 7, "strip_whitespac": 7, "subject": 4, "sublicens": 4, "substanti": 4, "success": 2, "suitabl": 2, "support": 5, "synchron": 8, "target": [2, 7], "task": [2, 7, 8], "taskid": [2, 7, 8], "telegram": [0, 1, 5], "thi": [2, 3, 4, 5, 7, 8], "time": [2, 8], "timestamp": 7, "titl": 7, "to_low": 7, "to_upp": 7, "todat": 2, "token": [2, 8], "torrent": [0, 5], "tort": 4, "total": 2, "tracker": [0, 5], "transpar": [2, 8], "tri": 7, "true": 7, "turnstil": [0, 2], "turnstileoptionss": [0, 7], "turnstileproxylessoptionss": [0, 7], "turnstiletask": [3, 7, 8], "turnstiletaskproxyless": [3, 7, 8], "type": [2, 3, 7, 8], "u": 2, "under": 8, "unix": [5, 7], "updat": 3, "upload": 2, "url": 3, "us": [0, 2, 4, 5, 7, 8], "usd": 7, "use_enum_valu": 7, "userag": 8, "v2": 2, "v3": 2, "validate_assign": 7, "valu": [3, 5], "variant": [3, 7], "version": 5, "view": 2, "visibl": [2, 8], "volum": 2, "wa": 7, "wait": [2, 8], "warranti": 4, "we": [5, 7], "web": 7, "webpag": [2, 8], "websit": 7, "websitekei": [2, 7, 8], "websiteurl": [2, 7, 8], "where": [2, 7, 8], "whether": 4, "which": [2, 7], "who": 7, "whom": 4, "without": 4, "work": [0, 2, 3, 5, 8], "worker": 7, "you": [1, 2, 5, 7], "your": [2, 5, 7]}, "titles": ["python3-anticaptcha", "Contacts", "Control", "Enum", "License", "Introduction", "Other captcha-solving services libs", "Serializer", "Turnstile"], "titleterms": {"addit": 0, "anticaptcha": [0, 5], "captcha": [0, 6], "contact": 1, "control": 2, "enum": 3, "exampl": [0, 2, 8], "here": 0, "how": 5, "instal": 5, "introduct": 5, "lib": 6, "librari": 6, "licens": 4, "modul": 0, "note": [2, 8], "other": 6, "pip": 5, "python3": [0, 5], "serial": 7, "servic": 6, "solv": 6, "sourc": 5, "start": 0, "test": 5, "turnstil": 8, "welcom": 5}}) \ No newline at end of file