# -*- coding: utf-8 -*- # !/usr/bin/env python import base64 import datetime import hashlib import hmac import json import logging import requests from apps.web.core.db import Searchable from mongoengine import StringField, IntField host = "39.105.191.99:40010" # https://www.apifox.cn/apidoc/shared-c761d37a-7da6-4ff1-b26a-d2476242cd8a/api-12349351 # sectetKey: pvDTDJvGgm4rzVFZ8MBd/9T6uZ48iXgOcBGJ2MKpsc8= logger = logging.getLogger(__name__) class BeiJingFengTai(Searchable): sectetKey = StringField(verbose_name="运营商私钥,由平台提供", default="") operatorId = StringField(verbose_name="运营商唯一识别Id", default="") northPort = StringField(verbose_name="平台的 域名端口 推送数据给对方平台的时候 服务器的地址", default="") meta = { "collection": "BeiJingFengTai", "db_alias": "default" } def make_signature(self,timeDate,token=None): timeDate = timeDate operatorid = str(self.operatorId) sectetKey = str(self.sectetKey) originalString = "datetime: {}\noperatorid: {}".format(timeDate,operatorid) if token: originalString += "\ntoken: {}".format(token) sigDate = hmac.new(sectetKey, originalString, hashlib.sha256).digest() sig = base64.b64encode(sigDate) return sig def send_request(self,url,mode='POST',**kwargs): payload = kwargs timeDate = payload.pop("timeDate") sig = payload.pop("sig") timeout = payload.pop("timeout", 5) token = payload.pop("token", None) payload = json.dumps(payload) headers = { 'Datetime': timeDate, 'OperatorId': str(self.operatorId), 'Signature': sig, 'User-Agent': 'Apifox/1.0.0 (https://www.apifox.cn)' } if token: headers.update({'Token': token}) try: if mode == 'POST': headers.update({'Content-Type': 'application/json'}) response = requests.post(url=url, data=payload, headers=headers, timeout=timeout) elif mode == 'GET': response = requests.get(url=url, headers=headers, timeout=timeout,data={}) elif mode == 'DELETE': response = requests.delete(url=url, headers=headers, timeout=timeout,data={}) elif mode == 'PUT': headers.update({'Content-Type': 'application/json'}) response = requests.put(url=url, headers=headers, timeout=timeout,data=payload) except requests.Timeout: return dict() except Exception as e: logger.exception(e) return dict() if response.status_code != 200: return dict() return response.json() def join_url(self,path): return "http://{ipPort}/{path}".format( ipPort=str(self.northPort), path=path ) @classmethod def create(cls, sectetKey, operatorId, northPort): report = cls( sectetKey=sectetKey, operatorId=operatorId, northPort=northPort, ) try: report.save() except Exception as e: logger.error(e) return return report