folder stricture reorganize
This commit is contained in:
185
tests/test_mexc_timestamp_debug.py
Normal file
185
tests/test_mexc_timestamp_debug.py
Normal file
@ -0,0 +1,185 @@
|
||||
"""
|
||||
MEXC Timestamp and Signature Debug
|
||||
|
||||
This script tests different timestamp and recvWindow combinations to fix the signature validation.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import hashlib
|
||||
import hmac
|
||||
from urllib.parse import urlencode
|
||||
import requests
|
||||
|
||||
# Add paths for imports
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'NN'))
|
||||
|
||||
def test_mexc_timestamp_debug():
|
||||
"""Test different timestamp strategies"""
|
||||
print("="*60)
|
||||
print("MEXC TIMESTAMP AND SIGNATURE DEBUG")
|
||||
print("="*60)
|
||||
|
||||
api_key = os.getenv('MEXC_API_KEY')
|
||||
api_secret = os.getenv('MEXC_SECRET_KEY')
|
||||
|
||||
if not api_key or not api_secret:
|
||||
print("❌ Missing API credentials")
|
||||
return False
|
||||
|
||||
base_url = "https://api.mexc.com"
|
||||
api_version = "api/v3"
|
||||
|
||||
# Test 1: Get server time directly
|
||||
print("1. Getting server time...")
|
||||
|
||||
try:
|
||||
response = requests.get(f"{base_url}/{api_version}/time", timeout=10)
|
||||
if response.status_code == 200:
|
||||
server_time_data = response.json()
|
||||
server_time = server_time_data['serverTime']
|
||||
local_time = int(time.time() * 1000)
|
||||
time_diff = server_time - local_time
|
||||
|
||||
print(f" Server time: {server_time}")
|
||||
print(f" Local time: {local_time}")
|
||||
print(f" Difference: {time_diff}ms")
|
||||
|
||||
else:
|
||||
print(f" ❌ Failed to get server time: {response.status_code}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f" ❌ Error getting server time: {e}")
|
||||
return False
|
||||
|
||||
# Test 2: Try different timestamp strategies
|
||||
strategies = [
|
||||
("Server time exactly", server_time),
|
||||
("Server time - 500ms", server_time - 500),
|
||||
("Server time - 1000ms", server_time - 1000),
|
||||
("Server time - 2000ms", server_time - 2000),
|
||||
("Local time", local_time),
|
||||
("Local time - 1000ms", local_time - 1000),
|
||||
]
|
||||
|
||||
# Test with different recvWindow values
|
||||
recv_windows = [5000, 10000, 30000, 60000]
|
||||
|
||||
print(f"\n2. Testing different timestamp strategies and recvWindow values...")
|
||||
|
||||
for strategy_name, timestamp in strategies:
|
||||
print(f"\n Strategy: {strategy_name} (timestamp: {timestamp})")
|
||||
|
||||
for recv_window in recv_windows:
|
||||
print(f" Testing recvWindow: {recv_window}ms")
|
||||
|
||||
# Test account info request
|
||||
params = {
|
||||
'timestamp': timestamp,
|
||||
'recvWindow': recv_window
|
||||
}
|
||||
|
||||
# Generate signature
|
||||
sorted_params = sorted(params.items())
|
||||
query_string = urlencode(sorted_params)
|
||||
signature = hmac.new(
|
||||
api_secret.encode('utf-8'),
|
||||
query_string.encode('utf-8'),
|
||||
hashlib.sha256
|
||||
).hexdigest()
|
||||
|
||||
params['signature'] = signature
|
||||
|
||||
# Make request
|
||||
headers = {'X-MEXC-APIKEY': api_key}
|
||||
url = f"{base_url}/{api_version}/account"
|
||||
|
||||
try:
|
||||
response = requests.get(url, params=params, headers=headers, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
print(f" ✅ SUCCESS")
|
||||
account_data = response.json()
|
||||
print(f" Account type: {account_data.get('accountType', 'Unknown')}")
|
||||
return True # Found working combination
|
||||
else:
|
||||
error_data = response.json() if 'application/json' in response.headers.get('content-type', '') else {'msg': response.text}
|
||||
error_code = error_data.get('code', 'Unknown')
|
||||
error_msg = error_data.get('msg', 'Unknown')
|
||||
print(f" ❌ Error {error_code}: {error_msg}")
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Exception: {e}")
|
||||
|
||||
print(f"\n❌ No working timestamp/recvWindow combination found")
|
||||
return False
|
||||
|
||||
def test_minimal_signature():
|
||||
"""Test with minimal parameters to isolate signature issues"""
|
||||
print(f"\n3. Testing minimal signature generation...")
|
||||
|
||||
api_key = os.getenv('MEXC_API_KEY')
|
||||
api_secret = os.getenv('MEXC_SECRET_KEY')
|
||||
|
||||
base_url = "https://api.mexc.com"
|
||||
api_version = "api/v3"
|
||||
|
||||
# Get fresh server time
|
||||
try:
|
||||
response = requests.get(f"{base_url}/{api_version}/time", timeout=10)
|
||||
server_time = response.json()['serverTime']
|
||||
print(f" Fresh server time: {server_time}")
|
||||
except Exception as e:
|
||||
print(f" ❌ Failed to get server time: {e}")
|
||||
return False
|
||||
|
||||
# Test with absolute minimal parameters
|
||||
minimal_params = {
|
||||
'timestamp': server_time
|
||||
}
|
||||
|
||||
# Generate signature with minimal params
|
||||
sorted_params = sorted(minimal_params.items())
|
||||
query_string = urlencode(sorted_params)
|
||||
signature = hmac.new(
|
||||
api_secret.encode('utf-8'),
|
||||
query_string.encode('utf-8'),
|
||||
hashlib.sha256
|
||||
).hexdigest()
|
||||
|
||||
minimal_params['signature'] = signature
|
||||
|
||||
print(f" Minimal params: {minimal_params}")
|
||||
print(f" Query string: {query_string}")
|
||||
print(f" Signature: {signature}")
|
||||
|
||||
# Test account request with minimal params
|
||||
headers = {'X-MEXC-APIKEY': api_key}
|
||||
url = f"{base_url}/{api_version}/account"
|
||||
|
||||
try:
|
||||
response = requests.get(url, params=minimal_params, headers=headers, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
print(f" ✅ Minimal signature works!")
|
||||
return True
|
||||
else:
|
||||
error_data = response.json() if 'application/json' in response.headers.get('content-type', '') else {'msg': response.text}
|
||||
print(f" ❌ Minimal signature failed: {error_data.get('code', 'Unknown')} - {error_data.get('msg', 'Unknown')}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Exception with minimal signature: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = test_mexc_timestamp_debug()
|
||||
|
||||
if not success:
|
||||
success = test_minimal_signature()
|
||||
|
||||
if success:
|
||||
print(f"\n🎉 Found working MEXC configuration!")
|
||||
else:
|
||||
print(f"\n🚨 MEXC signature/timestamp issue persists")
|
Reference in New Issue
Block a user