File size: 5,451 Bytes
931e053
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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。"