models.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import base64
  4. import datetime
  5. import hashlib
  6. import hmac
  7. import json
  8. import logging
  9. import requests
  10. from apps.web.core.db import Searchable
  11. from mongoengine import StringField, IntField
  12. host = "39.105.191.99:40010"
  13. # https://www.apifox.cn/apidoc/shared-c761d37a-7da6-4ff1-b26a-d2476242cd8a/api-12349351
  14. # sectetKey: pvDTDJvGgm4rzVFZ8MBd/9T6uZ48iXgOcBGJ2MKpsc8=
  15. logger = logging.getLogger(__name__)
  16. class BeiJingFengTai(Searchable):
  17. sectetKey = StringField(verbose_name="运营商私钥,由平台提供", default="")
  18. operatorId = StringField(verbose_name="运营商唯一识别Id", default="")
  19. northPort = StringField(verbose_name="平台的 域名端口 推送数据给对方平台的时候 服务器的地址", default="")
  20. meta = {
  21. "collection": "BeiJingFengTai",
  22. "db_alias": "default"
  23. }
  24. def make_signature(self,timeDate,token=None):
  25. timeDate = timeDate
  26. operatorid = str(self.operatorId)
  27. sectetKey = str(self.sectetKey)
  28. originalString = "datetime: {}\noperatorid: {}".format(timeDate,operatorid)
  29. if token:
  30. originalString += "\ntoken: {}".format(token)
  31. sigDate = hmac.new(sectetKey, originalString, hashlib.sha256).digest()
  32. sig = base64.b64encode(sigDate)
  33. return sig
  34. def send_request(self,url,mode='POST',**kwargs):
  35. payload = kwargs
  36. timeDate = payload.pop("timeDate")
  37. sig = payload.pop("sig")
  38. timeout = payload.pop("timeout", 5)
  39. token = payload.pop("token", None)
  40. payload = json.dumps(payload)
  41. headers = {
  42. 'Datetime': timeDate,
  43. 'OperatorId': str(self.operatorId),
  44. 'Signature': sig,
  45. 'User-Agent': 'Apifox/1.0.0 (https://www.apifox.cn)'
  46. }
  47. if token:
  48. headers.update({'Token': token})
  49. try:
  50. if mode == 'POST':
  51. headers.update({'Content-Type': 'application/json'})
  52. response = requests.post(url=url, data=payload, headers=headers, timeout=timeout)
  53. elif mode == 'GET':
  54. response = requests.get(url=url, headers=headers, timeout=timeout,data={})
  55. elif mode == 'DELETE':
  56. response = requests.delete(url=url, headers=headers, timeout=timeout,data={})
  57. elif mode == 'PUT':
  58. headers.update({'Content-Type': 'application/json'})
  59. response = requests.put(url=url, headers=headers, timeout=timeout,data=payload)
  60. except requests.Timeout:
  61. return dict()
  62. except Exception as e:
  63. logger.exception(e)
  64. return dict()
  65. if response.status_code != 200:
  66. return dict()
  67. return response.json()
  68. def join_url(self,path):
  69. return "http://{ipPort}/{path}".format(
  70. ipPort=str(self.northPort),
  71. path=path
  72. )
  73. @classmethod
  74. def create(cls, sectetKey, operatorId, northPort):
  75. report = cls(
  76. sectetKey=sectetKey,
  77. operatorId=operatorId,
  78. northPort=northPort,
  79. )
  80. try:
  81. report.save()
  82. except Exception as e:
  83. logger.error(e)
  84. return
  85. return report