예제 #1
0
    def captcha_handler(self, objectName: str, rowsCount: int, columnsCount:int, image_link: str = None, image_file: str = None, image_base64: str = None):
        '''
        Этот тип задачи берет вашу картинку, добавляет на нее сетку нужного размера и отдает работнику с требованием выбрать объекты нужного типа.
        :param objectName: Имя объекта.
        :param rowsCount: Кол-во строк. Min 2, max 5
        :param columnsCount: Кол-во колонок. Min 2, max 5

        :param image_link: Ссылка на изображение
        :param image_file: Необязательный параметр, служит для открытия уже скачанных файлов изображений.
        :param image_base64: Загрузка изображения в кодировке base64

        :return: Возвращает весь ответ сервера JSON-строкой.
        '''
        # проверка параметров сетки
        if not 2<=rowsCount<=5 or not 2<=columnsCount<=5:
            raise ValueError('Параметр `rowsCount` и `columnsCount` должен быть больше 2 и меньше 5.' 
                            f'Вы передали - `rowsCount`:{rowsCount}, `columnsCount`:{columnsCount}')

        # обновляем task_payload новыми данными для сетки разметки и названия предмета
        self.task_payload['task'].update({"objectName": objectName})
        self.task_payload['task'].update({"rowsCount": rowsCount})
        self.task_payload['task'].update({"columnsCount": columnsCount})

        # проводим действия над файлом(декодируем и передаём на сервер)
        if image_file:
            captcha_id = self.__read_captcha_image_file(image_file, content_type="file")

        # проводим действия над файлом уже закодированном в base64(передаём на сервер)
        elif image_base64:
            captcha_id = self.__read_captcha_image_file(image_base64, content_type="base64")

        # проводим действия над ссылкой на файл(скачиваем, сохраняем и передаём на сервер)
        elif image_link:
            content = requests.get(image_link).content
            # согласно значения переданного параметра выбираем функцию для сохранения изображения
            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:
            raise ParamError(additional_info="""You must set one of param - `image_file/image_base64/image_link`.\n
                                                Вы должны задать один из параметров - `image_file/image_base64/image_link`.""")

        # Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
        if captcha_id['errorId'] == 0:
            captcha_id = captcha_id["taskId"]
            self.result_payload.update({"taskId": captcha_id})
        else:
            return captcha_id

        # если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
        if self.task_payload.get('callbackUrl'):
            return self.result_payload
            
        else:
            # Ожидаем решения капчи
            time.sleep(self.sleep_time)
            return get_sync_result(result_payload = self.result_payload, sleep_time = self.sleep_time)
    def captcha_handler(
        self,
        captcha_link: str = None,
        captcha_file: str = None,
        captcha_base64: str = None,
        **kwargs,
    ) -> dict:
        """
        Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер
        RuCaptcha, дожидается решения капчи и вовзращает вам результат
        :param captcha_link: Ссылка на изображение
        :param captcha_file: Необязательный параметр, служит для открытия уже скачанных файлов изображений.
        :param captcha_base64: Загрузка изображения в кодировке base64
        :param kwargs: Дополнительные параметры для `requests.get(....)` скачивающего изображение, если передана ссылка.
        :return: Возвращает весь ответ сервера JSON-строкой.
        """
        if captcha_file:
            captcha_id = self.__read_captcha_image_file(captcha_file,
                                                        content_type="file")
        elif captcha_base64:
            captcha_id = self.__read_captcha_image_file(captcha_base64,
                                                        content_type="base64")
        elif captcha_link:
            content = self.session.get(captcha_link, **kwargs).content
            # согласно значения переданного параметра выбираем функцию для сохранения изображения
            if self.save_format == SAVE_FORMATS[0]:
                captcha_id = self.__image_const_saver(content)
            elif self.save_format == SAVE_FORMATS[1]:
                captcha_id = self.__image_temp_saver(content)
        else:
            raise ParamError(
                additional_info=
                """You must set one of param - `captcha_file/captcha_base64/captcha_link`.\n
                                                Вы должны задать один из параметров - `captcha_file/captcha_base64/captcha_link`."""
            )

        # Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
        if captcha_id["errorId"] == 0:
            captcha_id = captcha_id["taskId"]
            self.result_payload.update({"taskId": captcha_id})
        else:
            return captcha_id

        # если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
        if self.task_payload.get("callbackUrl"):
            return self.result_payload

        else:
            # Ожидаем решения капчи
            time.sleep(self.sleep_time)
            return get_sync_result(result_payload=self.result_payload,
                                   sleep_time=self.sleep_time)
예제 #3
0
    async def captcha_handler(
        self,
        captcha_link: str = None,
        captcha_file: str = None,
        captcha_base64: str = None,
    ):
        """
		Метод получает от вас ссылку на изображение, скачивает его, отправляет изображение на сервер
		RuCaptcha, дожидается решения капчи и вовзращает вам результат
		:param captcha_link: Ссылка на изображение
		:return: Возвращает весь ответ сервера JSON-строкой.
		"""
        # если был передан линк на локальный скачаный файл
        if captcha_file:
            captcha_id = await self.__read_captcha_image_file(
                captcha_file, content_type="file")
        elif captcha_base64:
            captcha_id = await self.__read_captcha_image_file(
                captcha_base64, content_type="base64")
        elif captcha_link:
            # согласно значения переданного параметра выбираем функцию для сохранения изображения
            if self.save_format == "const":
                captcha_id = await self.__image_const_saver(captcha_link)
            elif self.save_format == "temp":
                captcha_id = await self.__image_temp_saver(captcha_link)
        else:
            raise ParamError(
                additional_info=
                """You must set one of param - `captcha_file/captcha_base64/captcha_link`.\n
                                                Вы должны задать один из параметров - `captcha_file/captcha_base64/captcha_link`."""
            )

        # Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
        if captcha_id["errorId"] == 0:
            captcha_id = captcha_id["taskId"]
            self.result_payload.update({"taskId": captcha_id})
        else:
            return captcha_id

        # если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
        if self.task_payload.get("callbackUrl"):
            return self.result_payload

        else:
            # Ждем решения капчи
            await asyncio.sleep(self.sleep_time)
            return await get_async_result(result_payload=self.result_payload,
                                          sleep_time=self.sleep_time)
    async def captcha_handler(
        self,
        objectName: str,
        rowsCount: int,
        columnsCount: int,
        image_link: str = None,
        image_file: str = None,
        image_base64: str = None,
    ) -> dict:
        """
        Этот тип задачи берет вашу картинку, добавляет на нее сетку нужного размера и отдает работнику с требованием выбрать объекты нужного типа.
        :param objectName: Имя объекта.
        :param rowsCount: Кол-во строк. Min 2, max 5
        :param columnsCount: Кол-во колонок. Min 2, max 5

        :param image_link: Ссылка на изображение
        :param image_file: Необязательный параметр, служит для открытия уже скачанных файлов изображений.
        :param image_base64: Загрузка изображения в кодировке base64
        :return: Возвращает весь ответ сервера JSON-строкой.
        """
        # проверка параметров сетки
        if (2 < rowsCount < 5) and (2 < columnsCount < 5):
            raise ValueError(
                "Параметр `rowsCount` и `columnsCount` должен быть больше 2 и меньше 5."
                f"Вы передали - `rowsCount`:{rowsCount}, `columnsCount`:{columnsCount}"
            )

        # обновляем task_payload новыми данными для сетки разметки и названия предмета
        self.task_payload["task"].update({"objectName": objectName})
        self.task_payload["task"].update({"rowsCount": rowsCount})
        self.task_payload["task"].update({"columnsCount": columnsCount})
        # если был передан линк на локальный скачаный файл
        if image_file:
            captcha_id = await self.__read_captcha_image_file(
                image_file, content_type="file")
        elif image_base64:
            captcha_id = await self.__read_captcha_image_file(
                image_base64, content_type="base64")
        elif image_link:
            # согласно значения переданного параметра выбираем функцию для сохранения изображения
            if self.save_format == "const":
                captcha_id = await self.__image_const_saver(image_link)
            elif self.save_format == "temp":
                captcha_id = await self.__image_temp_saver(image_link)
        else:
            raise ParamError(
                additional_info=
                """You must set one of param - `image_file/image_base64/image_link`.\n
                                                Вы должны задать один из параметров - `image_file/image_base64/image_link`."""
            )

        # Проверка статуса создания задачи, если создано без ошибок - извлекаем ID задачи, иначе возвращаем ответ сервера
        if captcha_id["errorId"] == 0:
            captcha_id = captcha_id["taskId"]
            self.result_payload.update({"taskId": captcha_id})
        else:
            return captcha_id

        # если передан параметр `callbackUrl` - не ждём решения капчи а возвращаем незаполненный ответ
        if self.task_payload.get("callbackUrl"):
            return self.result_payload

        else:
            # Ждем решения капчи
            await asyncio.sleep(self.sleep_time)
            return await get_async_result(result_payload=self.result_payload,
                                          sleep_time=self.sleep_time)