test_selection_api.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # -*- coding: utf-8 -*-
  2. """
  3. 测试选品接口 - 验证 selection_condition_json 字段是否正确保存
  4. """
  5. import json
  6. import hashlib
  7. import base64
  8. import time
  9. from Crypto.Cipher import AES
  10. from Crypto.Util.Padding import pad
  11. import requests
  12. BASE_URL = "http://localhost:9000"
  13. TIMEOUT = 30
  14. # AES加密用的key(需与后端协商一致,这里用测试key)
  15. AES_KEY = b"1234567890123456" # 16字节
  16. def md5(s):
  17. return hashlib.md5(s.encode('utf-8')).hexdigest()
  18. def aes_encrypt(plaintext: str, key: bytes) -> str:
  19. """AES/CBC/PKCS7 加密,返回 base64 编码"""
  20. cipher = AES.new(key, AES.MODE_CBC, iv=b'\x00' * 16)
  21. padded = pad(plaintext.encode('utf-8'), AES.block_size)
  22. return base64.b64encode(cipher.encrypt(padded)).decode('ascii')
  23. def encrypt_params(params: dict) -> dict:
  24. """加密参数:params -> {encrypted_params, aes_key, key_version}"""
  25. # AES加密后得到encrypted_params
  26. # key_version默认1
  27. json_str = json.dumps(params, ensure_ascii=False, separators=(',', ':'))
  28. encrypted = aes_encrypt(json_str, AES_KEY)
  29. return {
  30. "encrypted_params": encrypted,
  31. "aes_key": base64.b64encode(AES_KEY).decode('ascii'),
  32. "key_version": 1
  33. }
  34. def raw_machine_info_to_machine_code(raw: str) -> str:
  35. return md5(raw)
  36. def register_and_login():
  37. """注册并登录,返回 session_id 和 user_id"""
  38. raw_machine = "TEST_MACHINE_CODE_12345"
  39. machine_code = raw_machine_info_to_machine_code(raw_machine)
  40. # 注册
  41. reg_params = {
  42. "username": f"test_user_{int(time.time())}",
  43. "password": "Test123456",
  44. "card_code": "TEST_CARD_001", # 测试卡密
  45. "software_code": "buff-xp-steam-sh",
  46. "raw_machine_info": raw_machine
  47. }
  48. enc_reg = encrypt_params(reg_params)
  49. try:
  50. r = requests.post(f"{BASE_URL}/api/v1/auth/register", json=enc_reg, timeout=TIMEOUT)
  51. print(f"注册响应: {r.status_code} {r.text[:200]}")
  52. except Exception as e:
  53. print(f"注册异常: {e}")
  54. # 登录
  55. login_params = {
  56. "username": reg_params["username"],
  57. "password": reg_params["password"],
  58. "raw_machine_info": raw_machine
  59. }
  60. enc_login = encrypt_params(login_params)
  61. try:
  62. r = requests.post(f"{BASE_URL}/api/v1/auth/login", json=enc_login, timeout=TIMEOUT)
  63. print(f"登录响应: {r.status_code} {r.text[:500]}")
  64. resp = r.json()
  65. if resp.get("code") == 200 and resp.get("data"):
  66. data = resp["data"]
  67. # 解密data
  68. encrypted_data = data.get("encrypted_data") or ""
  69. aes_key_b64 = data.get("aes_key") or ""
  70. if encrypted_data and aes_key_b64:
  71. aes_key = base64.b64decode(aes_key_b64)
  72. encrypted_bytes = base64.b64decode(encrypted_data)
  73. cipher = AES.new(aes_key, AES.MODE_CBC, iv=b'\x00' * 16)
  74. decrypted = cipher.decrypt(encrypted_bytes)
  75. decrypted = decrypted.rstrip(b'\x00').rstrip(b'\x10')
  76. login_data = json.loads(decrypted.decode('utf-8'))
  77. return login_data.get("session_id"), login_data.get("user_id"), machine_code
  78. except Exception as e:
  79. print(f"登录异常: {e}")
  80. return None, None, None
  81. def test_selection_result(session_id, machine_code, user_id):
  82. """查询选品结果"""
  83. body = {
  84. "session_id": session_id,
  85. "machine_code": machine_code,
  86. }
  87. try:
  88. r = requests.post(f"{BASE_URL}/api/v1/buff/selection-result", json=body, timeout=TIMEOUT)
  89. print(f"\n选品结果查询响应: {r.status_code} {r.text[:800]}")
  90. resp = r.json()
  91. if resp.get("code") == 200 and resp.get("data"):
  92. data = resp["data"]
  93. req_id = data.get("request_id")
  94. status = data.get("status")
  95. items_count = len(data.get("items") or [])
  96. print(f"\n选品状态: status={status}, items_count={items_count}, request_id={req_id}")
  97. except Exception as e:
  98. print(f"选品结果查询异常: {e}")
  99. def test_selection_config(session_id, machine_code):
  100. """测试获取选品配置接口"""
  101. body = {
  102. "session_id": session_id,
  103. "machine_code": machine_code,
  104. }
  105. try:
  106. r = requests.post(f"{BASE_URL}/api/v1/buff/secure/selection-config", json=body, timeout=TIMEOUT)
  107. print(f"\n选品配置查询响应: {r.status_code}")
  108. resp = r.json()
  109. if resp.get("code") == 200 and resp.get("data"):
  110. configs = resp["data"].get("configs") or []
  111. print(f"配置数量: {len(configs)}")
  112. if configs:
  113. print(f"默认配置: {json.dumps(configs[0], ensure_ascii=False, indent=2)[:1000]}")
  114. else:
  115. print(f"响应内容: {r.text[:500]}")
  116. except Exception as e:
  117. print(f"选品配置查询异常: {e}")
  118. if __name__ == "__main__":
  119. print("=" * 60)
  120. print("开始测试选品接口")
  121. print("=" * 60)
  122. # 测试获取选品配置(不需要登录)
  123. print("\n[测试1] 公开选品配置接口")
  124. try:
  125. r = requests.get(f"{BASE_URL}/api/v1/buff/selection-config", timeout=TIMEOUT)
  126. print(f"响应: {r.status_code} {r.text[:300]}")
  127. except Exception as e:
  128. print(f"异常: {e}")
  129. # 测试公开的筛选选项接口
  130. print("\n[测试2] 筛选选项接口")
  131. try:
  132. r = requests.get(f"{BASE_URL}/api/v1/buff/filter-options", timeout=TIMEOUT)
  133. print(f"响应: {r.status_code} {r.text[:300]}")
  134. except Exception as e:
  135. print(f"异常: {e}")
  136. # 注册并登录测试
  137. print("\n[测试3] 注册并登录")
  138. session_id, user_id, machine_code = register_and_login()
  139. if session_id:
  140. print(f"登录成功: user_id={user_id}, session_id={session_id[:20]}...")
  141. else:
  142. print("登录失败,跳过后续测试")
  143. exit(1)
  144. # 测试选品配置查询
  145. test_selection_config(session_id, machine_code)
  146. # 查询选品结果
  147. test_selection_result(session_id, machine_code, user_id)
  148. print("\n" + "=" * 60)
  149. print("测试完成")
  150. print("=" * 60)