__init__.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # coding=utf-8
  2. import json
  3. import logging
  4. import requests
  5. from urlparse import urljoin, parse_qsl
  6. from library.yinkayo.api.door import Door
  7. from library.yinkayo.api.login import Login
  8. from library.yinkayo.constants import RetCode, CommonErrorCode
  9. from library.yinkayo.exceptions import FCardWebTimeOutError, FCardWebNetWorkError, FCardWebAuthError
  10. from library.yinkayo.constants import DoorOnlineStatus
  11. from django.core.cache import cache
  12. logger = logging.getLogger(__name__)
  13. class FCardWeb(object):
  14. urlBase = "https://yun.pc15.net/"
  15. urlTestBase = "https://yun.pc15.net/demo_ASPX/"
  16. def __init__(self, customer, operator, password, debug=False):
  17. self._customer = customer
  18. self._operator = operator
  19. self._password = password
  20. self._debug = debug
  21. self._cookie = cache.get(str(self))
  22. self.Login = Login(self)
  23. self.Door = Door(self)
  24. self._isRetry = False
  25. def __str__(self):
  26. return "{}-{}-{}".format(self._customer, self._operator, self._password)
  27. def _handle_response(self, response): # type:(requests.Response) -> requests.Response
  28. try:
  29. response.raise_for_status()
  30. except requests.RequestException as ree:
  31. logger.error("[FCardWeb _handle_response] status_code = {}, error = {}, response = {}".format(response.status_code, ree, response))
  32. raise FCardWebNetWorkError(ree.message)
  33. result = response.json()
  34. logger.info("[FCardWeb _handle_result] request success, result = {}".format(result))
  35. # 部分分页接口没有retCode
  36. if "RetCode" in result:
  37. retCode, errorCode = result["RetCode"], result["ErrCode"]
  38. else:
  39. retCode, errorCode = RetCode.SUCCESS, CommonErrorCode.SUCCESS
  40. if retCode != RetCode.SUCCESS:
  41. logger.error("[FCardWeb _handle_result] request error, result = {}".format(result))
  42. if errorCode == CommonErrorCode.COOKIE_EXP:
  43. if not self._isRetry:
  44. cookies = self.get_cookie()
  45. body = response.request.body
  46. try:
  47. data = dict(parse_qsl(body))
  48. except Exception as e:
  49. logger.warning("[FCardWeb _handle_result] parse_qsl error, error = {}".format(e))
  50. data = {}
  51. return self._post(apiPath=response.request.path_url, cookies=cookies, **data)
  52. else:
  53. raise FCardWebAuthError(u"登录过期")
  54. else:
  55. raise FCardWebNetWorkError(u"请求失败")
  56. else:
  57. return response
  58. def _post(self, apiPath, **kwargs):
  59. logger.info("[FCardWeb _post] ready to send post request to server, path = {}, data = {}".format(apiPath, kwargs))
  60. if not self._debug:
  61. url = urljoin(self.urlBase, apiPath)
  62. else:
  63. url = urljoin(self.urlTestBase, apiPath)
  64. cookies = kwargs.pop("cookies", self._cookie)
  65. try:
  66. response = requests.post(url, data=kwargs, cookies=cookies)
  67. except requests.exceptions.Timeout:
  68. raise FCardWebTimeOutError(u"请求超时")
  69. return self._handle_response(response)
  70. def post(self, apiPath, **kwargs):
  71. return self._post(apiPath, **kwargs)
  72. def load_login_info(self):
  73. return self._customer, self._operator, self._password
  74. def get_cookie(self):
  75. cookies = self.Login.login()
  76. cache.set(str(self), cookies, timeout=60*60*23)
  77. self._cookie = cookies
  78. return cookies