Source code for woob.browser.cloudscraper

# Copyright(C) 2023      Romain Bignon
#
# This file is part of woob.
#
# woob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# woob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with woob. If not, see <http://www.gnu.org/licenses/>.
"""
This module provides tools to bypass cloudflare websites with your browser.

To use it, add :class:`CloudScraperMixin` as a mixin of your browser class.
"""

try:
    from cloudscraper import CloudScraper
except ImportError as exc:
    raise ImportError("Please install cloudscraper") from exc


__all__ = ["CloudScraperSession", "CloudScraperMixin"]


[docs]class CloudScraperSession(CloudScraper):
[docs] def send(self, *args, **kwargs): callback = kwargs.pop("callback", lambda future, response: response) is_async = kwargs.pop("is_async", False) if is_async: raise ValueError("Async requests are not supported") resp = super().send(*args, **kwargs) return callback(self, resp)
[docs]class CloudScraperMixin: def _create_session(self): return CloudScraperSession() def _setup_session(self, profile): session = self._create_session() session.hooks["response"].append(self.set_normalized_url) if self.responses_dirname is not None: session.hooks["response"].append(self.save_response) self.session = session