| 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。" |