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}