阿里云openapi签名实现代码(基于Python)

简介: 部分开发者在接触阿里云openAPi调用的时候,Signature的构造和生成一直都是一只拦路虎,本文中将基于Python,和点播的APi:getPlayAuth 实现签名的构造,仅供大家参考。

strToSign的构造过程以如下流程简要说明:
image.png

product.json文件内容
{
    "vod":{
      "Format":"JSON",
      "Version":"2017-03-21",
      "AccessKeyId":"yourAccessKeyID",
      "SignatureMethod":"HMAC-SHA1",
      "SignatureVersion":"1.0"
    }
  }

代码正文:

# coding=utf-8
import json
import uuid
import datetime
import hmac
import base64
from urllib import quote
import hashlib


class SignatureUrl():
    """python 计算openapi的签名"""

    def __init__(self, public_param, private_param):
        self.public_param = public_param
        self.private_param = private_param

    def get_timestamp(self):
        time_format = "%Y-%m-%dT%H:%M:%SZ"
        return datetime.datetime.utcnow().strftime(time_format)

    def get_uuid(self):
        return str(uuid.uuid1())

    def url_encode_str(self, all_params):
        sort_all_params = list()
        for key, value in all_params.items():
            params = key + '=' + value
            sort_all_params.append(params)
        # 对参数进行升序排序
        sort_all_params.sort()

        for i in range(len(sort_all_params)):
            # 对参数以及参数值进行urlencode处理,注意:’=‘此时不能处理,否则后面会再次对%3D进行encode
            sort_all_params[i] = quote(sort_all_params[i], '=')
            # 对encode之后的字符串进行再处理
            tmp = sort_all_params[i]
            if tmp.find('+'):
                tmp.replace('+','%20')
            elif tmp.find('*'):
                tmp.replace('*','%2A')
            elif tmp.find('%7E'):
                tmp.replace('%7E','~')
            
            sort_all_params[i] = tmp
        return sort_all_params

    def get_signature(self, param, http_method,AccesskeySecret):
        str_to_sign = ''
        sort_all_params = self.url_encode_str(param)
        print(sort_all_params)
        for i in range(len(sort_all_params)):
            str_to_sign = str_to_sign + sort_all_params[i] + '&'

        # 将最后一位&给截取掉
        str_to_sign = http_method + '&%2F&' + quote(str_to_sign[:-1])
        print(str_to_sign)
        key = AccesskeySecret+'&'
        signature = hmac.new(key.encode(
            'utf-8'), str_to_sign.encode('utf-8'), digestmod=hashlib.sha1)
        signature = base64.b64encode(signature.digest())
        # 解决签名中包含有'+'的特殊情况
        signature = list(signature)
        for i in range(len(signature)):
            if signature[i] == '+':
                signature[i] = '%2B'
        newSignature = ''.join(signature)
        self.private_param['Signature'] = newSignature

    def url_factory(self):
        all_params = dict(self.public_param, **self.private_param)
        self.get_signature(all_params, 'GET','yourAccessKeySecret')
        url = 'http://vod.cn-shanghai.aliyuncs.com' + '?AccessKeyId=' + self.public_param['AccessKeyId'] + '&Action=' + self.private_param['Action'] + '&Format=' + self.public_param['Format'] + '&Version=' + self.public_param['Version'] + '&SignatureMethod=' + self.public_param['SignatureMethod'] + \
            '&SignatureVersion=' + self.public_param['SignatureVersion'] + '&Timestamp=' + self.public_param['Timestamp'] + '&SignatureNonce=' + \
            self.public_param['SignatureNonce'] + '&VideoId=' + \
            self.private_param['VideoId'] + '&Signature=' + self.private_param['Signature']
        print('url is : ' + url)


public_param = dict()
private_param = dict()
pubduct = 'vod'
with open("/Users/storageuser/PycharmProjects/openapiPython/product.json", "r") as param:
    files = json.load(param)
    #public_param["Endpoint"] = files[pubduct]["Endpoint"].encode("utf-8")
    public_param["Format"] = files[pubduct]["Format"].encode("utf-8")
    public_param["Version"] = files[pubduct]["Version"].encode("utf-8")
    public_param["AccessKeyId"] = files[pubduct]["AccessKeyId"].encode("utf-8")
    public_param["SignatureMethod"] = files[pubduct]["SignatureMethod"].encode("utf-8")
    public_param["SignatureVersion"] = files[pubduct]["SignatureVersion"].encode("utf-8")
    action_param = dict()
    action_param["VideoId"] = "f6a21eade82f4cf6b45669fa34b35b76"
    action_param["Action"] = "GetVideoPlayAuth"
    private_param["Action"] = action_param["Action"]
    private_param["VideoId"] = action_param["VideoId"]

sig = SignatureUrl(public_param, private_param)
sig.public_param["Timestamp"] = sig.get_timestamp()
sig.public_param["SignatureNonce"] = sig.get_uuid()

sig.url_factory()
相关文章
|
9天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
21 6
|
2天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
27 8
|
9天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
30 11
|
11天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
28 11
|
6天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
7天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
31 6
|
12天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
7月前
|
JavaScript API 开发工具
阿里云OpenAPI AssignJobs返回404错误可能有以下几个原因:
【2月更文挑战第20天】阿里云OpenAPI AssignJobs返回404错误可能有以下几个原因:
167 1
|
7月前
|
域名解析 弹性计算 tengine
阿里云DNS常见问题之阿里云OpenAPI判断域名的dns服务器是否在阿里云失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
7月前
|
云安全 安全 API
阿里云——OpenAPI使用——短信服务
阿里云——OpenAPI使用——短信服务
334 0