steam.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. """
  2. Steam账号管理接口
  3. """
  4. from fastapi import APIRouter, Depends, HTTPException, Request
  5. from sqlalchemy.orm import Session
  6. from pydantic import BaseModel
  7. from typing import Optional, List
  8. from app.database import get_db
  9. from app.models.steam_account import SteamAccount
  10. from app.models.user import User
  11. from app.core.encrypt import encryptor
  12. from app.core.logger import logger
  13. from app.config import settings
  14. from datetime import datetime
  15. router = APIRouter()
  16. class SteamAccountRequest(BaseModel):
  17. """Steam账号请求"""
  18. user_id: int
  19. steam_username: str
  20. steam_id: Optional[str] = None
  21. shared_secret: str
  22. identity_secret: str
  23. class SteamAccountUpdateRequest(BaseModel):
  24. """Steam账号更新请求"""
  25. user_id: int
  26. steam_username: Optional[str] = None
  27. steam_id: Optional[str] = None
  28. shared_secret: Optional[str] = None
  29. identity_secret: Optional[str] = None
  30. is_active: Optional[int] = None
  31. @router.get("/steam-accounts")
  32. async def get_steam_accounts(
  33. request: Request,
  34. db: Session = Depends(get_db)
  35. ):
  36. """获取Steam账号列表"""
  37. try:
  38. # 获取请求参数
  39. params = dict(request.query_params)
  40. # 解密请求数据(如果有)
  41. user_id = None
  42. if settings.ENCRYPT_ENABLED:
  43. encrypted_data = params.get("encrypted", "")
  44. if encrypted_data:
  45. decrypted = encryptor.decrypt(encrypted_data)
  46. user_id = decrypted.get("user_id")
  47. else:
  48. user_id = params.get("user_id")
  49. if user_id:
  50. user_id = int(user_id)
  51. if not user_id:
  52. return {"code": 400, "msg": "缺少用户ID"}
  53. # 验证用户是否存在
  54. user = db.query(User).filter(User.id == user_id).first()
  55. if not user:
  56. return {"code": 404, "msg": "用户不存在"}
  57. # 查询Steam账号列表
  58. accounts = db.query(SteamAccount).filter(
  59. SteamAccount.user_id == user_id
  60. ).order_by(SteamAccount.created_at.desc()).all()
  61. # 格式化返回数据
  62. accounts_data = []
  63. for account in accounts:
  64. # 解密共享密钥和身份密钥
  65. shared_secret = ""
  66. identity_secret = ""
  67. try:
  68. if account.shared_secret:
  69. shared_secret = encryptor.decrypt(account.shared_secret)
  70. if account.identity_secret:
  71. identity_secret = encryptor.decrypt(account.identity_secret)
  72. except Exception as e:
  73. logger.error(f"解密Steam账号密钥失败: {e}")
  74. accounts_data.append({
  75. "id": account.id,
  76. "steam_username": account.steam_username,
  77. "steam_id": account.steam_id,
  78. "shared_secret": shared_secret,
  79. "identity_secret": identity_secret,
  80. "is_active": account.is_active,
  81. "last_used_time": account.last_used_time.isoformat() if account.last_used_time else None,
  82. "created_at": account.created_at.isoformat() if account.created_at else None,
  83. "updated_at": account.updated_at.isoformat() if account.updated_at else None
  84. })
  85. return {
  86. "code": 200,
  87. "msg": "成功",
  88. "data": accounts_data
  89. }
  90. except Exception as e:
  91. logger.error(f"获取Steam账号列表失败: {e}")
  92. return {"code": 500, "msg": "获取Steam账号列表失败"}
  93. @router.post("/steam-accounts")
  94. async def create_steam_account(
  95. request: Request,
  96. db: Session = Depends(get_db)
  97. ):
  98. """添加Steam账号"""
  99. try:
  100. # 获取请求数据
  101. data = await request.json()
  102. # 解密请求数据
  103. if settings.ENCRYPT_ENABLED:
  104. encrypted_data = data.get("encrypted", "")
  105. if not encrypted_data:
  106. return {"code": 400, "msg": "缺少加密数据"}
  107. decrypted = encryptor.decrypt(encrypted_data)
  108. else:
  109. decrypted = data
  110. req = SteamAccountRequest(**decrypted)
  111. # 验证用户是否存在
  112. user = db.query(User).filter(User.id == req.user_id).first()
  113. if not user:
  114. return {"code": 404, "msg": "用户不存在"}
  115. # 检查Steam用户名是否已存在
  116. existing = db.query(SteamAccount).filter(
  117. SteamAccount.user_id == req.user_id,
  118. SteamAccount.steam_username == req.steam_username
  119. ).first()
  120. if existing:
  121. return {"code": 400, "msg": "该Steam账号已存在"}
  122. # 加密存储共享密钥和身份密钥
  123. encrypted_shared_secret = encryptor.encrypt(req.shared_secret)
  124. encrypted_identity_secret = encryptor.encrypt(req.identity_secret)
  125. # 创建Steam账号
  126. steam_account = SteamAccount(
  127. user_id=req.user_id,
  128. steam_username=req.steam_username,
  129. steam_id=req.steam_id,
  130. shared_secret=encrypted_shared_secret,
  131. identity_secret=encrypted_identity_secret,
  132. is_active=1,
  133. created_at=datetime.now(),
  134. updated_at=datetime.now()
  135. )
  136. db.add(steam_account)
  137. db.commit()
  138. db.refresh(steam_account)
  139. logger.info(f"用户 {req.user_id} 添加Steam账号成功: {req.steam_username}")
  140. return {
  141. "code": 200,
  142. "msg": "添加成功",
  143. "data": {
  144. "id": steam_account.id,
  145. "steam_username": steam_account.steam_username
  146. }
  147. }
  148. except Exception as e:
  149. db.rollback()
  150. logger.error(f"添加Steam账号失败: {e}")
  151. return {"code": 500, "msg": "添加失败"}
  152. @router.put("/steam-accounts/{account_id}")
  153. async def update_steam_account(
  154. account_id: int,
  155. request: Request,
  156. db: Session = Depends(get_db)
  157. ):
  158. """更新Steam账号"""
  159. try:
  160. # 获取请求数据
  161. data = await request.json()
  162. # 解密请求数据
  163. if settings.ENCRYPT_ENABLED:
  164. encrypted_data = data.get("encrypted", "")
  165. if not encrypted_data:
  166. return {"code": 400, "msg": "缺少加密数据"}
  167. decrypted = encryptor.decrypt(encrypted_data)
  168. else:
  169. decrypted = data
  170. req = SteamAccountUpdateRequest(**decrypted)
  171. # 查找Steam账号
  172. account = db.query(SteamAccount).filter(SteamAccount.id == account_id).first()
  173. if not account:
  174. return {"code": 404, "msg": "Steam账号不存在"}
  175. # 验证用户ID是否匹配
  176. if account.user_id != req.user_id:
  177. return {"code": 403, "msg": "无权访问该账号"}
  178. # 更新字段
  179. if req.steam_username is not None:
  180. # 检查新用户名是否与其他账号冲突
  181. existing = db.query(SteamAccount).filter(
  182. SteamAccount.user_id == req.user_id,
  183. SteamAccount.steam_username == req.steam_username,
  184. SteamAccount.id != account_id
  185. ).first()
  186. if existing:
  187. return {"code": 400, "msg": "该Steam账号已存在"}
  188. account.steam_username = req.steam_username
  189. if req.steam_id is not None:
  190. account.steam_id = req.steam_id
  191. if req.shared_secret is not None:
  192. account.shared_secret = encryptor.encrypt(req.shared_secret)
  193. if req.identity_secret is not None:
  194. account.identity_secret = encryptor.encrypt(req.identity_secret)
  195. if req.is_active is not None:
  196. account.is_active = req.is_active
  197. account.updated_at = datetime.now()
  198. db.commit()
  199. logger.info(f"用户 {req.user_id} 更新Steam账号成功: {account_id}")
  200. return {
  201. "code": 200,
  202. "msg": "更新成功",
  203. "data": {
  204. "id": account.id,
  205. "steam_username": account.steam_username
  206. }
  207. }
  208. except Exception as e:
  209. db.rollback()
  210. logger.error(f"更新Steam账号失败: {e}")
  211. return {"code": 500, "msg": "更新失败"}
  212. @router.delete("/steam-accounts/{account_id}")
  213. async def delete_steam_account(
  214. account_id: int,
  215. request: Request,
  216. db: Session = Depends(get_db)
  217. ):
  218. """删除Steam账号"""
  219. try:
  220. # 获取请求数据(从body或query参数)
  221. data = {}
  222. try:
  223. # 尝试从body获取
  224. body = await request.body()
  225. if body:
  226. import json
  227. data = json.loads(body)
  228. except:
  229. pass
  230. # 如果body为空,尝试从query参数获取
  231. if not data:
  232. params = dict(request.query_params)
  233. if settings.ENCRYPT_ENABLED:
  234. encrypted_data = params.get("encrypted", "")
  235. if encrypted_data:
  236. data = encryptor.decrypt(encrypted_data)
  237. else:
  238. data = params
  239. else:
  240. data = params
  241. # 解密请求数据
  242. user_id = None
  243. if settings.ENCRYPT_ENABLED and isinstance(data, dict):
  244. encrypted_data = data.get("encrypted", "")
  245. if encrypted_data:
  246. decrypted = encryptor.decrypt(encrypted_data)
  247. user_id = decrypted.get("user_id")
  248. elif isinstance(data, dict):
  249. user_id = data.get("user_id")
  250. if user_id:
  251. try:
  252. user_id = int(user_id)
  253. except:
  254. pass
  255. if not user_id:
  256. return {"code": 400, "msg": "缺少用户ID"}
  257. # 查找Steam账号
  258. account = db.query(SteamAccount).filter(SteamAccount.id == account_id).first()
  259. if not account:
  260. return {"code": 404, "msg": "Steam账号不存在"}
  261. # 验证用户ID是否匹配
  262. if account.user_id != user_id:
  263. return {"code": 403, "msg": "无权访问该账号"}
  264. # 删除账号
  265. db.delete(account)
  266. db.commit()
  267. logger.info(f"用户 {user_id} 删除Steam账号成功: {account_id}")
  268. return {
  269. "code": 200,
  270. "msg": "删除成功"
  271. }
  272. except Exception as e:
  273. db.rollback()
  274. logger.error(f"删除Steam账号失败: {e}")
  275. return {"code": 500, "msg": "删除失败"}