先放出原本的代码参考:
import binascii
import random
import string
import time
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from router import app
@app.route('/v3/iParse/<int:fileId>', methods=["GET"])
def iParse(fileId):
try:
rUrl = 'https://api.ilanzou.com/unproved/file/redirect'
rTime = str(int(round(time.time() * 1000)))
# 构建请求参数
rParams = {
"downloadId": aes_ecb_pkcs7_encrypt(f"{fileId}|", 'lanZouY-disk-app'),
"enable": 1,
"devType": 3,
"uuid": generate_random_string(21),
"timestamp": aes_ecb_pkcs7_encrypt(rTime, 'lanZouY-disk-app'),
"auth": aes_ecb_pkcs7_encrypt(f"{fileId}|{rTime}", 'lanZouY-disk-app')
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Origin': 'https://www.ilanzou.com',
'Referer': 'https://www.ilanzou.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'Connection': 'keep-alive',
'Cookie': 'down_ip=1'
}
response = requests.get(
url=rUrl,
headers=headers,
params=rParams, # 通过 params 参数传递请求参数
allow_redirects=False,
timeout=10
)
if response.status_code in (200, 302):
try:
if response.status_code == 302:
redirect_url = response.headers.get('Location')
return {"code": 200, "status": "Parse successful", "url": redirect_url}
else:
# 处理 200 状态码的JSON响应
json_response = response.json()
if 'url' in json_response:
return {"code": 200, "status": "Parse successful", "url": json_response['url']}
elif 'data' in json_response and isinstance(json_response['data'], dict):
if 'url' in json_response['data']:
return {"code": 200, "status": "Parse successful", "url": json_response['data']['url']}
except Exception as e:
pass
return {"code": 400, "status": "Parse failed", "url": None}
except Exception as e:
return {"code": 500, "status": f"Server error: {str(e)}", "url": None}
# AES加密
def aes_ecb_pkcs7_encrypt(plaintext, key):
key_bytes = key.encode('utf-8')
cipher = AES.new(key_bytes, AES.MODE_ECB)
padded_plaintext = pad(plaintext.encode('utf-8'), AES.block_size)
encrypted_bytes = cipher.encrypt(padded_plaintext)
encrypted_hex = binascii.hexlify(encrypted_bytes).decode('utf-8')
return encrypted_hex.upper()
# 生成随机字符串
def generate_random_string(length):
letters = string.ascii_letters + string.digits
random_str = ''.join(random.choice(letters) for _ in range(length))
return random_str
这是一个接受参数后发送请求并返回结果的接口,框架是Flask框架,现在遇到了一个非常奇葩的问题,经理一个月的探索和找Bug,依然是成空军。
问题描述:就是发送请求后这里的"timestamp": aes_ecb_pkcs7_encrypt(rTime, 'lanZouY-disk-app'),参数会变成xtamp,为什么?我搜索发现是因为ASCL码的编码导致,我尝试目前网上的各种办法,都一样,目前接口还是返回参数为空。
注意:电脑(Windows)上完全没有问题,就是同一套代码在服务器上就跑步了(我已经通过Docker测试还是一样)。服务器:Linux CentOS 7.6.1810 x86_64(Py3.7.9)
求求救救我吧。
我尝试了网上的几种办法:
1.把timestamp放到第一个参数-》无效
2.前面加&转义-》无效
3.。。。-》无效
在Linux环境中,需要设置以下环境变量:
如果使用Docker,在Dockerfile中添加: