You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

watercrawl.py 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import json
  2. from urllib.parse import urljoin
  3. import requests
  4. from services.auth.api_key_auth_base import ApiKeyAuthBase
  5. class WatercrawlAuth(ApiKeyAuthBase):
  6. def __init__(self, credentials: dict):
  7. super().__init__(credentials)
  8. auth_type = credentials.get("auth_type")
  9. if auth_type != "x-api-key":
  10. raise ValueError("Invalid auth type, WaterCrawl auth type must be x-api-key")
  11. self.api_key = credentials.get("config", {}).get("api_key", None)
  12. self.base_url = credentials.get("config", {}).get("base_url", "https://app.watercrawl.dev")
  13. if not self.api_key:
  14. raise ValueError("No API key provided")
  15. def validate_credentials(self):
  16. headers = self._prepare_headers()
  17. url = urljoin(self.base_url, "/api/v1/core/crawl-requests/")
  18. response = self._get_request(url, headers)
  19. if response.status_code == 200:
  20. return True
  21. else:
  22. self._handle_error(response)
  23. def _prepare_headers(self):
  24. return {"Content-Type": "application/json", "X-API-KEY": self.api_key}
  25. def _get_request(self, url, headers):
  26. return requests.get(url, headers=headers)
  27. def _handle_error(self, response):
  28. if response.status_code in {402, 409, 500}:
  29. error_message = response.json().get("error", "Unknown error occurred")
  30. raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}")
  31. else:
  32. if response.text:
  33. error_message = json.loads(response.text).get("error", "Unknown error occurred")
  34. raise Exception(f"Failed to authorize. Status code: {response.status_code}. Error: {error_message}")
  35. raise Exception(f"Unexpected error occurred while trying to authorize. Status code: {response.status_code}")