async def captcha_handler(self, captcha_text: str, **kwargs): """ Метод отвечает за передачу данных на сервер для решения капчи :param captcha_text: Текстовый вопрос :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) # вводим текст капчи, выбираем метод ПОСТ и ждём ответа. в JSON-формате self.post_payload.update({"textcaptcha": captcha_text}) # получаем ID капчи async with aiohttp.ClientSession() as session: async with session.post(self.url_request, data=self.post_payload) as resp: captcha_id = await resp.json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: self.result.update({ "error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"]), }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи await asyncio.sleep(self.sleep_time) return await get_async_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )
async def captcha_handler(self, site_key: str, page_url: str, **kwargs): """ The method is responsible for transferring data to the server to solve captcha : param site_key: Website sitekey : param page_url: Link to the page where the captcha is located : param kwargs: To pass additional parameters : return: Answer to the captcha as a JSON string with fields: captchaSolve - captcha solution, taskId - is the Id of the task to solve the captcha, can be used for complaints and other things, error - False - if everything is fine, True - if there is an error, errorBody - full error information: { text - Extended error explanation id - unique error number in THIS library } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) self.post_payload.update({"sitekey": site_key, "pageurl": page_url}) # получаем ID капчи async with aiohttp.ClientSession() as session: async with session.post(self.url_request, data=self.post_payload) as resp: captcha_id = await resp.json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: self.result.update({ "error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"]) }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи await asyncio.sleep(self.sleep_time) return await get_async_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )
def captcha_handler(self, site_key: str, page_url: str, **kwargs): ''' Метод отвечает за передачу данных на сервер для решения капчи :param site_key: Гугл-ключ сайта :param page_url: Ссылка на страницу на которой находится капча :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, user_check - ID работника, который решил капчу user_score - score решившего капчу работника taskId - находится ID задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } ''' # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) self.post_payload.update({'googlekey': site_key, 'pageurl': page_url}) # получаем ID капчи captcha_id = requests.post(self.url_request, data = self.post_payload).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id['status'] == 0: self.result.update({'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) } ) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id['request'] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи # и параметр `taskinfo=1` для получения подробной информации об исполнителе self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи 10 секунд time.sleep(self.sleep_time) return get_sync_result(get_payload = self.get_payload, sleep_time = self.sleep_time, url_response = self.url_response, result = self.result)
def captcha_handler(self, public_key: str, page_url: str, **kwargs): """ Метод отвечает за передачу данных на сервер для решения капчи :param public_key: Ключ сайта :param page_url: Ссылка на страницу на которой находится капча :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) # добавляем в пайлоад параметры капчи переданные пользователем self.post_payload.update({"publickey": public_key, "pageurl": page_url}) # получаем ID капчи captcha_id = requests.post(self.url_request, data=self.post_payload).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: self.result.update( {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} ) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи time.sleep(self.sleep_time) return get_sync_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )
async def additional_methods(self, action: str, **kwargs): """ Асинхронный метод который выполняет дополнительные действия, такие как жалобы/получение баланса и прочее. :param action: Тип действия, самые типичные: getbalance(получение баланса), reportbad(жалоба на неверное решение). :param kwargs: Для передачи дополнительных параметров :return: Возвращает JSON строку с соответствующими полями: serverAnswer - ответ сервера при использовании RuCaptchaControl(баланс/жалобы и т.д.), taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } Больше подробностей и примеров можно прочитать в 'CaptchaTester/rucaptcha_control_example.py' """ # result, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в post_payload if kwargs: for key in kwargs: self.post_payload.update({key: kwargs[key]}) self.post_payload.update({"action": action}) try: async with aiohttp.ClientSession() as session: # отправляем на сервер данные с вашим запросом async with session.post(self.url_response, data=self.post_payload) as resp: answer = await resp.json() except Exception as error: self.result.update({ "error": True, "errorBody": { "text": error, "id": -1 } }) return self.result if answer["status"] == 0: self.result.update({ "error": True, "errorBody": RuCaptchaError().errors(answer["request"]) }) return self.result elif answer["status"] == 1: self.result.update({"serverAnswer": answer["request"]}) return self.result
def captcha_handler(self, captcha_link: str): ''' Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер RuCaptcha, дожидается решения капчи и вовзращает вам результат :param captcha_link: Ссылка на изображение :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } ''' # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Скачиваем изображение content = self.session.get(captcha_link).content # Отправляем изображение файлом files = {'file': content} # Отправляем на рукапча изображение капчи и другие парметры, # в результате получаем JSON ответ с номером решаемой капчи и получая ответ - извлекаем номер captcha_id = self.session.post(self.url_request, data=self.post_payload, files=files).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id['status'] is 0: self.result.update({'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) } ) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id['request'] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи 20 секунд time.sleep(self.sleep_time) return get_sync_result(get_payload=self.get_payload, sleep_time = self.sleep_time, url_response = self.url_response, result = self.result)
async def captcha_handler(self, site_key: str, page_url: str): ''' Метод отвечает за передачу данных на сервер для решения капчи :param site_key: Гугл-ключ сайта :param page_url: Ссылка на страницу на которой находится капча :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } ''' # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия self.post_payload.update({'googlekey': site_key, 'pageurl': page_url}) # получаем ID капчи async with aiohttp.ClientSession() as session: async with session.post(self.url_request, data=self.post_payload) as resp: captcha_id = await resp.json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id['status'] is 0: self.result.update({ 'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id['request'] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи await asyncio.sleep(self.sleep_time) return await get_async_result(get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result)
def captcha_handler(self, captcha_text: str): ''' Метод отвечает за передачу данных на сервер для решения капчи :param captcha_text: Текстовый вопрос :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } ''' # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # вводим текст капчи, выбираем метод ПОСТ и ждём ответа. в JSON-формате self.post_payload.update({"textcaptcha": captcha_text}) # Отправляем на рукапча текст капчи и ждём ответа # в результате получаем JSON ответ с номером решаемой капчи captcha_id = self.session.post(self.url_request, data=self.post_payload).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id['status'] is 0: self.result.update({ 'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id['request'] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи time.sleep(self.sleep_time) return get_sync_result(get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result)
def captcha_handler(self, key_params: dict, **kwargs): """ Метод отвечает за передачу данных на сервер для решения капчи :param key_params: Параметры/ключи key-captcha(подробнее в примерах бибилотеки или на сайте RuCaptcha) :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) # считываем все переданные параметры KeyCaptcha try: self.post_payload.update({ "s_s_c_user_id": key_params["s_s_c_user_id"], "s_s_c_session_id": key_params["s_s_c_session_id"], "s_s_c_web_server_sign": key_params["s_s_c_web_server_sign"], "s_s_c_web_server_sign2": key_params["s_s_c_web_server_sign2"], "pageurl": key_params["pageurl"], }) except KeyError as error: self.result.update({ "error": True, "errorBody": { "text": error, "id": -1 } }) return self.result # передаём параметры кей капчи для решения captcha_id = requests.post(url=self.url_request, data=self.post_payload).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: self.result.update({ "error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"]), }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # отправляем запрос на результат решения капчи, если ещё капча не решена - ожидаем 5 сек # если всё ок - идём дальше # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи time.sleep(self.sleep_time) return get_sync_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )
async def captcha_handler(self, captcha_link: str = None, captcha_file: str = None, captcha_base64: str = None, proxy: str = None): """ Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер RuCaptcha, дожидается решения капчи и вовзращает вам результат :param captcha_link: Ссылка на изображение :param captcha_file: Адрес(локальный) по которому находится изображение для отправки на расшифровку :param captcha_base64: Изображение переданное в кодировке base64 :param proxy: Прокси для aiohttp модуля :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # если передана локальная ссылка на файл - работаем с ним if captcha_file: captcha_id = await self.__local_image_captcha(captcha_file) # если передан файл в кодировке base64 elif captcha_base64: captcha_id = await self.__local_image_captcha( captcha_base64, content_type="base64") elif captcha_link: try: async with aiohttp.ClientSession() as session: async with session.get(url=captcha_link, proxy=proxy) as resp: content = await resp.content.read() except Exception as error: self.result.update({ 'error': True, 'errorBody': { 'text': error, 'id': -1 } }) return self.result # согласно значения переданного параметра выбираем функцию для сохранения изображения if self.save_format == 'const': captcha_id = await self.__image_const_saver(content) elif self.save_format == 'temp': captcha_id = await self.__image_temp_saver(content) else: self.result.update({ 'error': True, 'errorBody': 'You did not send any file local link or URL.', }) return self.result # проверяем наличие ошибок при скачивании/передаче файла на сервер if self.result['error']: return self.result # если вернулся ответ с ошибкой то записываем её и возвращаем результат elif captcha_id['status'] is 0: self.result.update({ 'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id['request'] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи await asyncio.sleep(self.sleep_time) return await get_async_result(get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result)
def captcha_handler( self, captcha_link: str = None, captcha_file: str = None, captcha_base64: str = None, **kwargs, ): """ Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер RuCaptcha, дожидается решения капчи и вовзращает вам результат :param captcha_link: Ссылка на изображение :param captcha_file: Адрес(локальный) по которому находится изображение для отправки на расшифровку :param captcha_base64: Изображение переданное в кодировке base64 :param kwargs: Параметры для библиотеки `requests` :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # если передана локальная ссылка на файл if captcha_file: captcha_id = self.__local_image_captcha(captcha_file) # если передан файл в кодировке base64 elif captcha_base64: captcha_id = self.__local_image_captcha( captcha_base64, content_type="base64" ) # если передан URL elif captcha_link: try: content = self.session.get(url=captcha_link, **kwargs).content except Exception as error: self.result.update( {"error": True, "errorBody": {"text": error, "id": -1}} ) return self.result # согласно значения переданного параметра выбираем функцию для сохранения изображения if self.save_format == "const": captcha_id = self.__image_const_saver(content) elif self.save_format == "temp": captcha_id = self.__image_temp_saver(content) else: # если не передан ни один из параметров self.result.update( { "error": True, "errorBody": "You did not send any file local link or URL.", } ) return self.result # проверяем наличие ошибок при скачивании/передаче файла на сервер if self.result["error"]: return self.result # если вернулся ответ с ошибкой то записываем её и возвращаем результат elif captcha_id["status"] == 0: self.result.update( { "error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"]), } ) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи time.sleep(self.sleep_time) return get_sync_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )
async def captcha_handler(self, key_params: dict, **kwargs): ''' Метод отвечает за передачу данных на сервер для решения капчи :param key_params: Параметры/ключи key-captcha(подробнее в примерах бибилотеки или на сайте RuCaptcha) :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } ''' # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) # считываем все переданные параметры KeyCaptcha try: self.post_payload.update({ 's_s_c_user_id': key_params['s_s_c_user_id'], 's_s_c_session_id': key_params['s_s_c_session_id'], 's_s_c_web_server_sign': key_params['s_s_c_web_server_sign'], 's_s_c_web_server_sign2': key_params['s_s_c_web_server_sign2'], 'pageurl': key_params['pageurl'], }) except KeyError as error: self.result.update({ 'error': True, 'errorBody': { 'text': error, 'id': -1 } }) return self.result # получаем ID капчи async with aiohttp.ClientSession() as session: async with session.post(url=self.url_request, data=self.post_payload) as resp: captcha_id = await resp.json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id['status'] == 0: self.result.update({ 'error': True, 'errorBody': RuCaptchaError().errors(captcha_id['request']) }) return self.result else: captcha_id = captcha_id['request'] # отправляем запрос на результат решения капчи, если ещё капча не решена - ожидаем 5 сек # если всё ок - идём дальше # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({'id': captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get('pingback'): return self.get_payload else: # Ожидаем решения капчи await asyncio.sleep(self.sleep_time) return await get_async_result(get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result)
def captcha_handler(self, captcha_link: str, **kwargs): """ Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер RuCaptcha, дожидается решения капчи и вовзращает вам результат :param captcha_link: Ссылка на изображение или путь до файла :param kwargs: Для передачи дополнительных параметров :return: Ответ на капчу в виде JSON строки с полями: captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, errorBody - полная информация об ошибке: { text - Развернётое пояснение ошибки id - уникальный номер ошибка в ЭТОЙ бибилотеке } """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия # Если переданы ещё параметры - вносим их в get_payload if kwargs: for key in kwargs: self.get_payload.update({key: kwargs[key]}) # Скачиваем изображение content = self.session.get( captcha_link).content if "http" in captcha_link else open( captcha_link, "rb") # Отправляем изображение файлом files = { "file_1": ("file_1", content, mimetypes.guess_type(captcha_link)[0]) } # Отправляем на рукапча изображение капчи и другие парметры, # в результате получаем JSON ответ с номером решаемой капчи и получая ответ - извлекаем номер captcha_id = self.session.post(self.url_request, data=self.post_payload, files=files).json() # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: self.result.update({ "error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"]) }) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: captcha_id = captcha_id["request"] # вписываем в taskId ключ отправленной на решение капчи self.result.update({"taskId": captcha_id}) # обновляем пайлоад, вносим в него ключ отправленной на решение капчи self.get_payload.update({"id": captcha_id}) # если передан параметр `pingback` - не ждём решения капчи а возвращаем незаполненный ответ if self.post_payload.get("pingback"): return self.get_payload else: # Ожидаем решения капчи 20 секунд time.sleep(self.sleep_time) return get_sync_result( get_payload=self.get_payload, sleep_time=self.sleep_time, url_response=self.url_response, result=self.result, )