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