| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | #!/usr/bin/env python3# -*- coding: utf-8 -*-import base64import hashlibimport hmacimport jsonimport loggingimport randomimport stringimport timeimport requestsfrom collections import OrderedDictfrom datetime import datetime, timedeltaclass UVerifyObject:    '''    【友盟+】智能认证 U-Verify(一键登录)    开发文档:    https://developer.umeng.com/docs/143070/detail/144785    https://developer.umeng.com/docs/143070/detail/144783    '''    def __init__(self, token):        # aliyun config        self.ali_appkey = '204024884'        self.ali_app_secret = 'lD7AXxc0ji0HzrNXZmfJaz3AecAboItD'        # umeng config        self.host_url = 'https://verify5.market.alicloudapi.com'        self.path_url = '/api/v1/mobile/info'        self.umeng_app_key = '5d8da0670cafb2a6b5000bc3'        self.token = token        self.phone = ''        self.body_data_str = json.dumps({'token': self.token})        content_md5_str = base64.b64encode(hashlib.md5(self.body_data_str.encode("UTF-8")).digest()).decode("UTF-8")        now_date_time = datetime.utcnow() + timedelta(hours=8)        timestamp = str(int(time.mktime(now_date_time.timetuple()) * 1000))        sign_headers_dict = {            'X-Ca-Key': self.ali_appkey,            'X-Ca-Stage': 'RELEASE',            'X-Ca-Timestamp': timestamp,            'X-Ca-Version': '1'        }        sign_headers_str = ''        for key in sorted(sign_headers_dict.keys()):            value = sign_headers_dict[key]            sign_headers_str = sign_headers_str + key + ':' + value + '\n'        # 需要使用有序字典,否则StringToSign错误        sign_dict = OrderedDict(            [('HTTPMethod', 'POST'),            ('Accept', 'application/json'),            ('Content-MD5', content_md5_str),            ('Content-Type', 'application/json; charset=UTF-8'),            ('Date', None,),            ('Headers', sign_headers_str),            ('Url', self.path_url + '?' + 'appkey=' + self.umeng_app_key)]        )        string_to_sign = ""        for key in sign_dict.keys():            value = sign_dict[key]            if key not in ['Headers', 'Url']:                if value:                    string_to_sign = string_to_sign + value + "\n"                else:                    string_to_sign = string_to_sign + "\n"            else:                string_to_sign = string_to_sign + value        logger = logging.getLogger('info')        logger.info('string_to_sign: {}'.format(string_to_sign))        key_bytes = self.ali_app_secret.encode('utf-8')        text_bytes = string_to_sign.encode('utf-8')        hash_bytes = hmac.new(key_bytes, text_bytes, hashlib.sha256).digest()        signature_str = base64.b64encode(hash_bytes).decode('utf-8')        nonce_str = self.generate_code(8) + '-' + self.generate_code(4) + '-' + self.generate_code(4) + '-' + \                    self.generate_code(4) + '-' + self.generate_code(12)        self.headers_dict = {            'Content-Type': 'application/json; charset=UTF-8',            'Accept': 'application/json',            'X-Ca-Version': '1',            'X-Ca-Signature-Headers': 'X-Ca-Version,X-Ca-Stage,X-Ca-Key,X-Ca-Timestamp',            'X-Ca-Stage': 'RELEASE',            'X-Ca-Key': self.ali_appkey,            'X-Ca-Timestamp': timestamp,            'X-Ca-Nonce': nonce_str,            'Content-MD5': content_md5_str,            'X-Ca-Signature': signature_str        }        self.request_url = self.host_url + self.path_url + '?' + 'appkey=' + self.umeng_app_key    def generate_code(self, length):        key = string.digits + 'abcdef'        str_list = random.sample(key + key, length)  # length >= len(key+key)        result_str = ''.join(str_list)        return result_str    def verify_request(self):        logger = logging.getLogger('info')        logger.info('request_url: {}, data: {}, headers: {}'.format(self.request_url, self.body_data_str, self.headers_dict))        response = requests.post(url=self.request_url, data=self.body_data_str.encode("UTF-8"), headers=self.headers_dict)        logger.info('response: {}, headers: {}, text: {}'.format(response, response.headers, response.text))        if response.status_code != 200:            return False        # 替换字符串,防止将字符串转为字典时报错        res_text = response.text.replace('true', '"true"').replace('false', '"false"').replace('null', '"null"')        logger.info('res_text: {}'.format(res_text))        res = eval(res_text)        print(res['success'])        if res['success'] == 'false':            return False        self.phone = res['data']['mobile']  # 获取手机号        return True
 |