firecrawl.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import json
  2. import requests
  3. from services.auth.api_key_auth_base import ApiKeyAuthBase
  4. class FirecrawlAuth(ApiKeyAuthBase):
  5. def __init__(self, credentials: dict):
  6. super().__init__(credentials)
  7. auth_type = credentials.get("auth_type")
  8. if auth_type != "bearer":
  9. raise ValueError("Invalid auth type, Firecrawl auth type must be Bearer")
  10. self.api_key = credentials.get("config", {}).get("api_key", None)
  11. self.base_url = credentials.get("config", {}).get("base_url", "https://api.firecrawl.dev")
  12. if not self.api_key:
  13. raise ValueError("No API key provided")
  14. def validate_credentials(self):
  15. headers = self._prepare_headers()
  16. options = {
  17. "url": "https://example.com",
  18. "includePaths": [],
  19. "excludePaths": [],
  20. "limit": 1,
  21. "scrapeOptions": {"onlyMainContent": True},
  22. }
  23. response = self._post_request(f"{self.base_url}/v1/crawl", options, headers)
  24. if response.status_code == 200:
  25. return True
  26. else:
  27. self._handle_error(response)
  28. def _prepare_headers(self):
  29. return {"Content-Type": "application/json", "Authorization": f"Bearer {self.api_key}"}
  30. def _post_request(self, url, data, headers):
  31. return requests.post(url, headers=headers, json=data)
  32. def _handle_error(self, response):
  33. if response.status_code in {402, 409, 500}:
  34. error_message = response.json().get("error", "Unknown error occurred")
  35. raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}")
  36. else:
  37. if response.text:
  38. error_message = json.loads(response.text).get("error", "Unknown error occurred")
  39. raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}")
  40. raise Exception(f"Unexpected error occurred while trying to authorize. Status code: {response.status_code}")