import requests import json from datetime import datetime import pytz import config shanghai_tz = pytz.timezone(config.SHANGHAI_TZ_STR) def api_login(email, password): payload = {"email": email, "password": password} try: response = requests.post(config.LOGIN_URL, json=payload, timeout=10) response.raise_for_status() data = response.json() cookies = response.cookies jwt_token = cookies.get("jwt_token") if data.get("code") == 0 and jwt_token: return jwt_token, None else: error_message = data.get('message', "未知登录错误") if data.get("code") == 0 and not jwt_token: error_message = "响应成功但未返回 jwt_token。" return None, f"{error_message} (Code: {data.get('code')})" except requests.exceptions.Timeout: return None, "登录请求超时。" except requests.exceptions.RequestException as e: return None, f"登录请求错误: {str(e)}" except json.JSONDecodeError: return None, "登录响应不是有效的 JSON。" def get_api_profile(email, token): if not token: return None, "Token 为空,无法获取 Profile。" cookies = {"jwt_token": token} try: response = requests.get(config.PROFILE_URL, cookies=cookies, timeout=10) response.raise_for_status() profile_data = response.json() if profile_data.get("code") == 0 and profile_data.get("data"): return profile_data.get("data"), None else: error_message = profile_data.get('message', "未知 Profile 错误") if profile_data.get("code") == 0 and not profile_data.get("data"): error_message = "响应成功但未返回 Profile 数据。" return None, f"{error_message} (Code: {profile_data.get('code')})" except requests.exceptions.Timeout: return None, "获取 Profile 请求超时。" except requests.exceptions.RequestException as e: return None, f"获取 Profile 请求错误: {str(e)}" except json.JSONDecodeError: return None, "Profile 响应不是有效的 JSON。" def get_api_card_info(email, token): if not token: return None, "Token 为空,无法获取卡片信息。" cookies = {"jwt_token": token} print(f"[{datetime.now(shanghai_tz)}] 尝试为账户 {email} 获取卡片信息...") try: response = requests.get(config.CARD_INFO_URL, cookies=cookies, timeout=10) response.raise_for_status() card_data = response.json() if card_data.get("code") == 0 and "items" in card_data.get("data", {}): items = card_data["data"]["items"] if items: item = items[0] provider_bin = None if item.get("provider"): parts = item["provider"].split('_') if len(parts) > 1 and parts[-1].isdigit(): provider_bin = parts[-1] processed_card_info = { "provider_bin": provider_bin, "card_last_four_digits": item.get("card_last_four_digits"), "consumption_limit": item.get("consumption_limit"), "status": item.get("status"), "name": item.get("name"), "available_balance": item.get("available_balance") } return processed_card_info, None else: return None, None elif card_data.get("code") == 0 and not card_data.get("data", {}).get("items"): return None, None else: error_message = card_data.get('message', "未知卡片信息错误") if card_data.get("code") == 0 and not card_data.get("data"): error_message = "响应成功但未返回卡片数据。" return None, f"{error_message} (Code: {card_data.get('code')})" except requests.exceptions.Timeout: return None, "获取卡片信息请求超时。" except requests.exceptions.RequestException as e: return None, f"获取卡片信息请求错误: {str(e)}" except json.JSONDecodeError: return None, "卡片信息响应不是有效的 JSON。" def get_statement_records(token, page=1, size=10): if not token: return None, "Token 为空,无法获取账单记录。" cookies = {"jwt_token": token} payload = {"page": page, "size": size} statement_url = f"{config.BASE_API_URL}/user/statement/record" try: response = requests.post(statement_url, json=payload, cookies=cookies, timeout=20) response.raise_for_status() data = response.json() if data.get("code") == 0: return data, None else: error_message = data.get('message', "获取账单记录时发生未知错误") return None, f"{error_message} (Code: {data.get('code')})" except requests.exceptions.Timeout: return None, "获取账单记录请求超时。" except requests.exceptions.RequestException as e: return None, f"获取账单记录请求错误: {str(e)}" except json.JSONDecodeError: return None, "账单记录响应不是有效的 JSON。"