# API签名工具 - Python实现 ## 项目结构 根据实际项目文件结构: ```plaintext python/ ├── api_signer.py # 签名工具实现(单文件版) ├── requirements.txt # 依赖配置 ``` ## 使用方法 ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 运行命令行工具 ```bash python api_signer.py [选项] ``` ### 命令行选项 | 选项 | 描述 | |------|------| | `-a, --algorithm` | 签名算法: md5, sha1, sha256, hmac-sha256 | | `-u, --url` | API基础URL | | `-p, --param` | 请求参数,格式为key=value,可多次使用 | | `-k, --key` | 访问密钥ID | | `-s, --secret` | 密钥 | | `-c, --channel` | 合作渠道方ID | | `-h, --help` | 显示帮助信息 | | `-j, --json` | 以JSON格式指定参数 | ### 常用命令示例 **基本用法** ```bash python api_signer.py ``` **自定义参数** ```bash python api_signer.py \ -u "https://api.example.com/user/info" \ -p "userId=12345" -p "action=getInfo" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" ``` **使用JSON参数** ```bash python api_signer.py -j '{"userId": "12345", "action": "getData"}' ``` **指定签名算法** ```bash python api_signer.py -a sha256 ``` **帮助信息** ```bash python api_signer.py --help ``` ### API接口测试实例 使用真实API接口进行测试: ```bash # 未签名的API调用测试 - 返回错误 curl "https://api-v1.sound-force.com:8443/p/album/single/media-url?channelId=3&singleId=381980" # 返回: {"code":400,"data":null,"msg":"Missing AccessKeyId","success":false} # 生成访问https://api-v1.sound-force.com:8443/p/album/single/media-url的签名URL python api_signer.py \ -a md5 \ -u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \ -p "singleId=381980" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" # 使用curl测试API接口 signed_url=$(python api_signer.py \ -a md5 \ -u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \ -p "singleId=381980" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" | grep -A 1 "签名后的URL:" | tail -n 1) curl -v "$signed_url" # 使用Python requests库测试 python -c " import requests import subprocess url = subprocess.check_output(\"python api_signer.py -a md5 -u 'https://api-v1.sound-force.com:8443/p/album/single/media-url' -p 'singleId=381980' -k 'YOUR_ACCESS_KEY' -s 'YOUR_SECRET_KEY' -c '3' | grep -A 1 '签名后的URL:' | tail -n 1\", shell=True).decode().strip() response = requests.get(url) print(f'状态码: {response.status_code}') print(f'响应内容: {response.text}') " ``` 请注意: - 替换`YOUR_ACCESS_KEY`为实际的访问密钥ID - 替换`YOUR_SECRET_KEY`为实际的密钥 - 示例使用的渠道ID为`3`,请根据实际情况调整 使用有效的密钥和签名后,API接口将返回成功响应(状态码200)并提供媒体URL数据。 ### 代码集成 ```python from api_signer import ApiSigner, SignOptions, SignatureAlgorithm # 创建签名选项 options = SignOptions(algorithm=SignatureAlgorithm.MD5) # 创建签名工具 signer = ApiSigner(options) # 准备请求参数 params = { "singleId": "381980" } # 执行签名 signed_params = signer.sign_request( params, "YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "3" ) # 或签名URL signed_url = signer.sign_url( "https://api-v1.sound-force.com:8443/p/album/single/media-url", params, "YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "3" ) ``` ### 环境变量 该工具支持从`.env`文件加载以下配置: - `ACCESS_KEY_ID`: 访问密钥ID - `SECRET_KEY`: 密钥 - `CHANNEL_ID`: 渠道ID - `SIGN_ALGORITHM`: 签名算法 - `API_BASE_URL`: API基础URL