rust_anticaptcha/
image_captcha.rs

1//! # ImageCaptcha module
2//!
3//! Module contains struct and functions to solve Image captcha,
4//! like `ImageToTextTask` and `ImageToCoordinatesTask`
5//!
6//! ## Examples
7//! ```no_run
8//! use serde_json::json;
9//!
10//! use rust_anticaptcha::core::enums::ImageTaskType;
11//! use rust_anticaptcha::image_captcha::ImageCaptcha;
12//!
13//! async fn run() {
14//!      let map = json!({"body": "base64_string"});
15//!      let mut image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
16//!      image_to_text_client.captcha_handler(ImageTaskType::ImageToTextTask, &map).await;
17//! }
18//! ```
19
20use serde_json::Value;
21
22use super::core::captcha_interface::CaptchaInterface;
23use super::core::enums::ImageTaskType;
24
25/// Captcha solving method - `ImageToTextTask` and `ImageToCoordinatesTask`
26///
27/// # Examples
28///
29/// With already prepared base64 string
30/// ```no_run
31/// use serde_json::json;
32///
33/// use rust_anticaptcha::core::enums::ImageTaskType;
34/// use rust_anticaptcha::image_captcha::ImageCaptcha;
35///
36/// async fn run() {
37///     let map = json!({"body": "base64_string"});
38///
39///     let mut image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
40///     image_to_text_client.captcha_handler(ImageTaskType::ImageToCoordinatesTask, &map).await;
41/// }
42/// ```
43///
44/// With image as file
45/// ```no_run
46/// use serde_json::json;
47///
48/// use rust_anticaptcha::core::enums::ImageTaskType;
49/// use rust_anticaptcha::image_captcha::ImageCaptcha;
50/// use rust_anticaptcha::instruments::image_instrument::ImageInstrument;
51///
52/// async fn run() {
53///     let image_instrument = ImageInstrument::new();
54///     let image_file_base64 = image_instrument.read_image_file("files/captcha-image.jpg".to_string());
55///
56///     let map = json!({"body": image_file_base64});
57///
58///     let mut image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
59///     image_to_text_client.captcha_handler(ImageTaskType::ImageToTextTask, &map).await;
60/// }
61/// ```
62///
63/// With image as link
64/// ```no_run
65/// use serde_json::json;
66///
67/// use rust_anticaptcha::core::enums::ImageTaskType;
68/// use rust_anticaptcha::image_captcha::ImageCaptcha;
69/// use rust_anticaptcha::instruments::image_instrument::ImageInstrument;
70///
71/// async fn run() {
72///     let image_instrument = ImageInstrument::new();
73///     let image_link_base64 = image_instrument.read_image_link("https://captcha-image.jpg".to_string()).await;
74///
75///     let map = json!({"body": image_link_base64});
76///
77///     let mut image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
78///     image_to_text_client.captcha_handler(ImageTaskType::ImageToTextTask, &map).await;
79/// }
80/// ```
81///
82/// # Notes
83/// Read more here:
84///
85/// <https://anti-captcha.com/apidoc/task-types/ImageToTextTask>
86///
87/// <https://anti-captcha.com/apidoc/task-types/ImageToCoordinatesTask>
88///
89pub struct ImageCaptcha {
90    pub captcha_interface: CaptchaInterface,
91}
92impl ImageCaptcha {
93    /// Method init new ImageCaptcha struct with Captcha Interface
94    ///
95    /// # Arguments
96    /// `api_key` - Service API key
97    ///
98    /// # Examples
99    ///
100    /// ```
101    /// use rust_anticaptcha::image_captcha::ImageCaptcha;
102    ///
103    /// let image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
104    /// ```
105    /// # Returns
106    /// Method return new `ImageCaptcha` instance
107    ///
108    pub fn new(api_key: String) -> Self {
109        ImageCaptcha {
110            captcha_interface: CaptchaInterface::new(api_key),
111        }
112    }
113
114    /// Method run captcha solving logic
115    ///
116    /// # Arguments
117    /// `captcha_type` - One of image captcha types from `ImageTaskType`
118    /// `task_payload` - JSON with captcha task payload
119    ///
120    /// # Examples
121    ///
122    /// ```no_run
123    /// use serde_json::json;
124    ///
125    /// use rust_anticaptcha::core::enums::ImageTaskType;
126    /// use rust_anticaptcha::image_captcha::ImageCaptcha;
127    ///
128    /// async fn run() {
129    ///     let map = json!({"body": "base64_string"});
130    ///
131    ///     let mut image_to_text_client = ImageCaptcha::new("API_KEY".to_string());
132    ///     image_to_text_client.captcha_handler(ImageTaskType::ImageToTextTask, &map).await;
133    /// }
134    /// ```
135    pub async fn captcha_handler(
136        &mut self,
137        captcha_type: ImageTaskType,
138        task_payload: &Value,
139    ) -> Value {
140        self.captcha_interface
141            .solve_captcha(captcha_type, task_payload)
142            .await
143    }
144}