| import json | |
| import requests | |
| from services.auth.api_key_auth_base import ApiKeyAuthBase | |
| class FirecrawlAuth(ApiKeyAuthBase): | |
| def __init__(self, credentials: dict): | |
| super().__init__(credentials) | |
| auth_type = credentials.get("auth_type") | |
| if auth_type != "bearer": | |
| raise ValueError("Invalid auth type, Firecrawl auth type must be Bearer") | |
| self.api_key = credentials.get("config").get("api_key", None) | |
| self.base_url = credentials.get("config").get("base_url", "https://api.firecrawl.dev") | |
| if not self.api_key: | |
| raise ValueError("No API key provided") | |
| def validate_credentials(self): | |
| headers = self._prepare_headers() | |
| options = { | |
| "url": "https://example.com", | |
| "crawlerOptions": {"excludes": [], "includes": [], "limit": 1}, | |
| "pageOptions": {"onlyMainContent": True}, | |
| } | |
| response = self._post_request(f"{self.base_url}/v0/crawl", options, headers) | |
| if response.status_code == 200: | |
| return True | |
| else: | |
| self._handle_error(response) | |
| def _prepare_headers(self): | |
| return {"Content-Type": "application/json", "Authorization": f"Bearer {self.api_key}"} | |
| def _post_request(self, url, data, headers): | |
| return requests.post(url, headers=headers, json=data) | |
| def _handle_error(self, response): | |
| if response.status_code in {402, 409, 500}: | |
| error_message = response.json().get("error", "Unknown error occurred") | |
| raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}") | |
| else: | |
| if response.text: | |
| error_message = json.loads(response.text).get("error", "Unknown error occurred") | |
| raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}") | |
| raise Exception(f"Unexpected error occurred while trying to authorize. Status code: {response.status_code}") | |