A corporation manager and dashboard for EVE Online
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

67 lignes
1.9 KiB

  1. # -*- coding: utf-8 -*-
  2. import time
  3. import requests
  4. from ..exceptions import ZKillboardError
  5. __all__ = ["ZKillboard"]
  6. class ZKillboard:
  7. """EVE API module for zKillboard."""
  8. _MAX_RATE = 0.5
  9. def __init__(self, session, logger):
  10. self._session = session
  11. self._logger = logger
  12. self._debug = logger.debug
  13. self._base_url = "https://zkillboard.com/api"
  14. self._last_query = 0
  15. def query(self, *args):
  16. """Make an API query using the given arguments."""
  17. query = "/" + "".join(str(arg) + "/" for arg in args)
  18. url = self._base_url + query
  19. delta = self._MAX_RATE - (time.time() - self._last_query)
  20. if delta > 0:
  21. self._debug("[GET] [wait %.2fs] %s", delta, query)
  22. time.sleep(delta)
  23. else:
  24. self._debug("[GET] %s", query)
  25. try:
  26. try:
  27. resp = self._session.get(url, timeout=10)
  28. except requests.ConnectionError:
  29. self._logger.warn("zKillboard API query failed, retrying once")
  30. time.sleep(self._MAX_RATE)
  31. resp = self._session.get(url, timeout=10)
  32. resp.raise_for_status()
  33. result = resp.json() if resp.content else None
  34. except (requests.RequestException, ValueError):
  35. self._logger.exception("zKillboard API query failed")
  36. raise ZKillboardError()
  37. self._last_query = time.time()
  38. return result
  39. def iter_killmails(self, *args):
  40. """Return an iterator over killmails using the given API arguments.
  41. Automagically follows pagination as far as possible. (Be careful.)
  42. """
  43. page = 1
  44. while True:
  45. if page > 1:
  46. result = self.query(*args, "page", page)
  47. else:
  48. result = self.query(*args)
  49. if result:
  50. yield from result
  51. page += 1
  52. else:
  53. break